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 com.android.camera.debug.Log;
20import com.android.camera.debug.Log.Tag;
21import com.google.common.annotations.VisibleForTesting;
22
23import javax.annotation.ParametersAreNonnullByDefault;
24import javax.annotation.concurrent.GuardedBy;
25
26/**
27 * Shared object for tracking the active camera device across multiple
28 * implementations.
29 */
30@ParametersAreNonnullByDefault
31public class ActiveCameraDeviceTracker {
32    private static final Tag TAG = new Tag("ActvCamDevTrckr");
33
34    /**
35     * Singleton instance.
36     */
37    private static class Singleton {
38        public static final ActiveCameraDeviceTracker INSTANCE = new ActiveCameraDeviceTracker();
39    }
40
41    public static ActiveCameraDeviceTracker instance() {
42        return Singleton.INSTANCE;
43    }
44
45    private final Object mLock;
46
47    @GuardedBy("mLock")
48    private CameraId mActiveCamera;
49
50    @GuardedBy("mLock")
51    private CameraId mPreviousCamera;
52
53    @VisibleForTesting
54    ActiveCameraDeviceTracker() {
55        mLock = new Object();
56    }
57
58    public CameraId getActiveCamera() {
59        synchronized (mLock) {
60            return mActiveCamera;
61        }
62    }
63
64    public CameraId getActiveOrPreviousCamera() {
65        synchronized (mLock) {
66            if (mActiveCamera != null) {
67
68                return mActiveCamera;
69            }
70            Log.v(TAG, "Returning previously active camera: " + mPreviousCamera);
71            return mPreviousCamera;
72        }
73    }
74
75    public void onCameraOpening(CameraId key) {
76        synchronized (mLock) {
77            if (mActiveCamera != null && !mActiveCamera.equals(key)) {
78                mPreviousCamera = mActiveCamera;
79            }
80
81            Log.v(TAG, "Tracking active camera: " + mActiveCamera);
82            mActiveCamera = key;
83        }
84    }
85
86    public void onCameraClosed(CameraId key) {
87        synchronized (mLock) {
88            if (mActiveCamera != null && mActiveCamera.equals(key)) {
89                mPreviousCamera = mActiveCamera;
90                mActiveCamera = null;
91            }
92        }
93    }
94}
95