You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
5.0 KiB

/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.incallui;
import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/** Used to track which camera is used for outgoing video. */
public class InCallCameraManager {
private final Set<Listener> cameraSelectionListeners =
Collections.newSetFromMap(new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
/** The camera ID for the front facing camera. */
private String frontFacingCameraId;
/** The camera ID for the rear facing camera. */
private String rearFacingCameraId;
/** The currently active camera. */
private boolean useFrontFacingCamera;
/**
* Indicates whether the list of cameras has been initialized yet. Initialization is delayed until
* a video call is present.
*/
private boolean isInitialized = false;
/** The context. */
private Context context;
/**
* Initializes the InCall CameraManager.
*
* @param context The current context.
*/
public InCallCameraManager(Context context) {
useFrontFacingCamera = true;
this.context = context;
}
/**
* Sets whether the front facing camera should be used or not.
*
* @param useFrontFacingCamera {@code True} if the front facing camera is to be used.
*/
public void setUseFrontFacingCamera(boolean useFrontFacingCamera) {
this.useFrontFacingCamera = useFrontFacingCamera;
for (Listener listener : cameraSelectionListeners) {
listener.onActiveCameraSelectionChanged(this.useFrontFacingCamera);
}
}
/**
* Determines whether the front facing camera is currently in use.
*
* @return {@code True} if the front facing camera is in use.
*/
public boolean isUsingFrontFacingCamera() {
return useFrontFacingCamera;
}
/**
* Determines the active camera ID.
*
* @return The active camera ID.
*/
public String getActiveCameraId() {
maybeInitializeCameraList(context);
if (useFrontFacingCamera) {
return frontFacingCameraId;
} else {
return rearFacingCameraId;
}
}
/** Calls when camera permission is granted by user. */
public void onCameraPermissionGranted() {
for (Listener listener : cameraSelectionListeners) {
listener.onCameraPermissionGranted();
}
}
/**
* Get the list of cameras available for use.
*
* @param context The context.
*/
private void maybeInitializeCameraList(Context context) {
if (isInitialized || context == null) {
return;
}
Log.v(this, "initializeCameraList");
CameraManager cameraManager = null;
try {
cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
} catch (Exception e) {
Log.e(this, "Could not get camera service.");
return;
}
if (cameraManager == null) {
return;
}
String[] cameraIds = {};
try {
cameraIds = cameraManager.getCameraIdList();
} catch (CameraAccessException e) {
Log.d(this, "Could not access camera: " + e);
// Camera disabled by device policy.
return;
}
for (int i = 0; i < cameraIds.length; i++) {
CameraCharacteristics c = null;
try {
c = cameraManager.getCameraCharacteristics(cameraIds[i]);
} catch (IllegalArgumentException e) {
// Device Id is unknown.
} catch (CameraAccessException e) {
// Camera disabled by device policy.
}
if (c != null) {
int facingCharacteristic = c.get(CameraCharacteristics.LENS_FACING);
if (facingCharacteristic == CameraCharacteristics.LENS_FACING_FRONT) {
frontFacingCameraId = cameraIds[i];
} else if (facingCharacteristic == CameraCharacteristics.LENS_FACING_BACK) {
rearFacingCameraId = cameraIds[i];
}
}
}
isInitialized = true;
Log.v(this, "initializeCameraList : done");
}
public void addCameraSelectionListener(Listener listener) {
if (listener != null) {
cameraSelectionListeners.add(listener);
}
}
public void removeCameraSelectionListener(Listener listener) {
if (listener != null) {
cameraSelectionListeners.remove(listener);
}
}
public interface Listener {
void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera);
void onCameraPermissionGranted();
}
}