1ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk/*
2ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * Copyright (C) 2014 The Android Open Source Project
3ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk *
4ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
5ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * you may not use this file except in compliance with the License.
6ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * You may obtain a copy of the License at
7ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk *
8ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
9ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk *
10ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * Unless required by applicable law or agreed to in writing, software
11ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
12ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * See the License for the specific language governing permissions and
14ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * limitations under the License.
15ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk */
16ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
17ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunkpackage android.hardware.camera2.legacy;
18ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
19ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunkimport android.hardware.camera2.utils.CameraBinderDecorator;
20ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunkimport android.util.AndroidException;
21ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
22ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk/**
23ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk * Utility class containing exception handling used solely by the compatibility mode shim.
24ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk */
25ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunkpublic class LegacyExceptionUtils {
26ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    private static final String TAG = "LegacyExceptionUtils";
27ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
28ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    /**
29ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * Checked exception thrown when a BufferQueue has been abandoned by its consumer.
30ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     */
31ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    public static class BufferQueueAbandonedException extends AndroidException {
32ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        public BufferQueueAbandonedException () {}
33ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
34ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        public BufferQueueAbandonedException(String name) {
35ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            super(name);
36ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        }
37ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
38ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        public BufferQueueAbandonedException(String name, Throwable cause) {
39ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            super(name, cause);
40ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        }
41ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
42ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        public BufferQueueAbandonedException(Exception cause) {
43ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            super(cause);
44ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        }
45ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    }
46ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
47ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    /**
48ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * Throw error codes used by legacy device methods as exceptions.
49ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     *
50ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * <p>Non-negative return values are passed through, negative return values are thrown as
51ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * exceptions.</p>
52ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     *
53ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * @param errorFlag error to throw as an exception.
54ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * @throws {@link BufferQueueAbandonedException} for {@link CameraBinderDecorator#ENODEV}.
55ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * @throws {@link UnsupportedOperationException} for an unknown negative error code.
56ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     * @return {@code errorFlag} if the value was non-negative, throws otherwise.
57ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk     */
58ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    public static int throwOnError(int errorFlag) throws BufferQueueAbandonedException {
59ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        switch (errorFlag) {
60ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            case CameraBinderDecorator.NO_ERROR: {
61ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk                return CameraBinderDecorator.NO_ERROR;
62ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            }
63ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            case CameraBinderDecorator.ENODEV: {
64ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk                throw new BufferQueueAbandonedException();
65ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            }
66ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        }
67ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
68ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        if (errorFlag < 0) {
69ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk            throw new UnsupportedOperationException("Unknown error " + errorFlag);
70ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        }
71ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        return errorFlag;
72ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    }
73ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk
74ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    private LegacyExceptionUtils() {
75ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk        throw new AssertionError();
76ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    }
77ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk}
78