1875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik/*
2875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * Copyright (C) 2016 The Android Open Source Project
3875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik *
4875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * Licensed under the Apache License, Version 2.0 (the "License");
5875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * you may not use this file except in compliance with the License.
6875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * You may obtain a copy of the License at
7875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik *
8875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik *      http://www.apache.org/licenses/LICENSE-2.0
9875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik *
10875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * Unless required by applicable law or agreed to in writing, software
11875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * distributed under the License is distributed on an "AS IS" BASIS,
12875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * See the License for the specific language governing permissions and
14875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * limitations under the License.
15875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik */
16875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
17875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikpackage android.car.hardware.camera;
18875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
19875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.annotation.SystemApi;
20875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.car.Car;
21875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.car.CarManagerBase;
22235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkivimport android.car.CarNotConnectedException;
23875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.content.Context;
24875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.os.IBinder;
25875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.os.RemoteException;
26875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikimport android.util.Log;
27875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
28875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik/**
29875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik * API for controlling camera system in cars
30280b5721254e5ac974404e02e7589f17f560d1f9Vitalii Tomkiv * @hide
31875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik */
32875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik@SystemApi
33875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paikpublic class CarCameraManager implements CarManagerBase {
34875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public final static boolean DBG = true;
35875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public final static String TAG = CarCameraManager.class.getSimpleName();
36875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
37875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    // Camera capabilities flags
38875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public static final int ANDROID_OVERLAY_SUPPORT_FLAG    = 0x1;
39875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public static final int CAMERA_CROP_SUPPORT_FLAG        = 0x2;
40875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public static final int CAMERA_POSITIONING_SUPPORT_FLAG = 0x4;
41875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
42875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    // Camera types
43875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public static final int CAR_CAMERA_TYPE_NONE            = 0;
44875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public static final int CAR_CAMERA_TYPE_RVC             = 1;
45875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
46875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    private int[] mCameraList;
47875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    private final ICarCamera mService;
48875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
49875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    /**
50875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * Get an instance of the CarCameraManager.
51875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     *
52875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * Should not be obtained directly by clients, use {@link Car.getCarManager()} instead.
53875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * @hide
54875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     */
55235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv    public CarCameraManager(IBinder service, Context context) throws CarNotConnectedException{
56875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        mService = ICarCamera.Stub.asInterface(service);
57875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        try {
58875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            mCameraList = mService.getCameraList();
59875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        } catch (RemoteException e) {
60875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            Log.e(TAG, "Exception in getCameraList", e);
61875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            mCameraList = null;
62235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv            throw new CarNotConnectedException(e);
63875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        }
64875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
65875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
66875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    /**
67875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     *
68875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * @return Array of CAR_CAMERA_TYPE_* telling which cameras are present
69875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     */
70875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public int[] getCameraList() {
71875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        return mCameraList;
72875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
73875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
74875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    /**
75875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     *
76875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * @param cameraType Camera type to query capabilites
77875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     * @return Bitmask of camera capabilities available for this device
78235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv     * @throws CarNotConnectedException
79875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik     */
80235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv    public int getCameraCapabilities(int cameraType) throws CarNotConnectedException {
81875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        int capabilities;
82875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        try {
83875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            capabilities = mService.getCapabilities(cameraType);
84875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        } catch (RemoteException e) {
85875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            Log.e(TAG, "Exception in getCameraCapabilities", e);
86235f8acd3cf83079ecd0f3e1b8368b0c9886de82Vitalii Tomkiv            throw new CarNotConnectedException(e);
87875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        }
88875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        return capabilities;
89875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
90875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
91875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public CarCamera openCamera(int cameraType) {
92875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        CarCamera camera = null;
93875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
94875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        // Find cameraType in the list of available cameras
95875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        for (int i : mCameraList) {
96875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            if(i == cameraType) {
97875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik                camera = new CarCamera(mService, cameraType);
98875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik                break;
99875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik            }
100875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        }
101875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        return camera;
102875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
103875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
104875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public void closeCamera(CarCamera camera) {
105875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik        // TODO:  What should we do?
106875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
107875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik
108875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    /** @hide */
109875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    @Override
110875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    public void onCarDisconnected() {
111875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik    }
112875616c52be0a5a4d3aa348e9dcfd90e54789912Steve Paik}
113