summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/camera/CameraActivity.java9
-rw-r--r--src/com/android/camera/PhotoModule.java14
-rw-r--r--src/com/android/camera/app/CameraController.java58
-rw-r--r--src/com/android/camera/app/CameraProvider.java9
-rw-r--r--src/com/android/camera/settings/AppUpgrader.java3
-rw-r--r--src/com/android/camera/settings/CameraSettingsActivity.java4
-rw-r--r--src_pd/com/android/camera/util/GservicesHelper.java5
7 files changed, 86 insertions, 16 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index ab2015877..a711e63af 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1334,9 +1334,9 @@ public class CameraActivity extends Activity
mActionBar = getActionBar();
mActionBar.addOnMenuVisibilityListener(this);
mMainHandler = new MainHandler(this, getMainLooper());
- mCameraController =
- new CameraController(mAppContext, this, mMainHandler,
- CameraAgentFactory.getAndroidCameraAgent(this));
+ mCameraController = new CameraController(mAppContext, this, mMainHandler,
+ CameraAgentFactory.getAndroidCameraAgent(this, CameraAgentFactory.CameraApi.API_1),
+ CameraAgentFactory.getAndroidCameraAgent(this, CameraAgentFactory.CameraApi.AUTO));
mCameraController.setCameraDefaultExceptionCallback(mCameraDefaultExceptionCallback,
mMainHandler);
@@ -1861,7 +1861,8 @@ public class CameraActivity extends Activity
mCameraAppUI = null;
mOrientationManager = null;
mButtonManager = null;
- CameraAgentFactory.recycle();
+ CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.API_1);
+ CameraAgentFactory.recycle(CameraAgentFactory.CameraApi.AUTO);
super.onDestroy();
}
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 8af71c06a..59539b0b8 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -72,6 +72,7 @@ import com.android.camera.ui.TouchCoordinate;
import com.android.camera.util.ApiHelper;
import com.android.camera.util.CameraUtil;
import com.android.camera.util.GcamHelper;
+import com.android.camera.util.GservicesHelper;
import com.android.camera.util.SessionStatsCollector;
import com.android.camera.util.UsageStatistics;
import com.android.camera.widget.AspectRatioSelector;
@@ -651,7 +652,7 @@ public class PhotoModule
closeCamera();
mCameraId = mPendingSwitchCameraId;
settingsManager.set(mAppController.getModuleScope(), Keys.KEY_CAMERA_ID, mCameraId);
- mActivity.getCameraProvider().requestCamera(mCameraId);
+ requestCameraOpen();
mUI.clearFaces();
if (mFocusManager != null) {
mFocusManager.removeMessages();
@@ -663,6 +664,15 @@ public class PhotoModule
// onFrameAvailable from the old camera may already exist.
}
+ /**
+ * Uses the {@link CameraProvider} to open the currently-selected camera
+ * device, using {@link GservicesHelper} to choose between API-1 and API-2.
+ */
+ private void requestCameraOpen() {
+ mActivity.getCameraProvider().requestCamera(mCameraId,
+ GservicesHelper.useCamera2ApiThroughPortabilityLayer(mActivity));
+ }
+
private final ButtonManager.ButtonCallback mCameraCallback =
new ButtonManager.ButtonCallback() {
@Override
@@ -1567,7 +1577,7 @@ public class PhotoModule
// No camera provider, the Activity is destroyed already.
return;
}
- camProvider.requestCamera(mCameraId);
+ requestCameraOpen();
mJpegPictureCallbackTime = 0;
mZoomValue = 0;
diff --git a/src/com/android/camera/app/CameraController.java b/src/com/android/camera/app/CameraController.java
index 819aeb187..5f912f25b 100644
--- a/src/com/android/camera/app/CameraController.java
+++ b/src/com/android/camera/app/CameraController.java
@@ -39,12 +39,22 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
private CameraAgent.CameraOpenCallback mCallbackReceiver;
private final Handler mCallbackHandler;
private final CameraAgent mCameraAgent;
- private final CameraDeviceInfo mInfo;
+ private final CameraAgent mCameraAgentNg;
+
+ /** The one for the API that is currently in use (deprecated one by default). */
+ private CameraDeviceInfo mInfo;
private CameraAgent.CameraProxy mCameraProxy;
private int mRequestingCameraId = EMPTY_REQUEST;
/**
+ * Determines which of mCameraAgent and mCameraAgentNg is currently in use.
+ * <p>It's only possible to enable this if the new API is actually
+ * supported.</p>
+ */
+ private boolean mUsingNewApi = false;
+
+ /**
* Constructor.
*
* @param context The {@link android.content.Context} used to check if the
@@ -52,13 +62,20 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
* @param handler The {@link android.os.Handler} to post the camera
* callbacks to.
* @param cameraManager Used for camera open/close.
+ * @param cameraManagerNg Used for camera open/close with the new API. If
+ * {@code null} or the same object as
+ * {@code cameraManager}, the new API will not be
+ * exposed and requests for it will get the old one.
*/
public CameraController(Context context, CameraAgent.CameraOpenCallback callbackReceiver,
- Handler handler, CameraAgent cameraManager) {
+ Handler handler, CameraAgent cameraManager, CameraAgent cameraManagerNg) {
mContext = context;
mCallbackReceiver = callbackReceiver;
mCallbackHandler = handler;
mCameraAgent = cameraManager;
+ // If the new implementation is the same as the old, the
+ // CameraAgentFactory decided this device doesn't support the new API.
+ mCameraAgentNg = cameraManagerNg != cameraManager ? cameraManagerNg : null;
mInfo = mCameraAgent.getCameraDeviceInfo();
if (mInfo == null && mCallbackReceiver != null) {
mCallbackReceiver.onDeviceOpenFailure(-1, "GETTING_CAMERA_INFO");
@@ -69,6 +86,9 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
public void setCameraDefaultExceptionCallback(CameraExceptionCallback callback,
Handler handler) {
mCameraAgent.setCameraDefaultExceptionCallback(callback, handler);
+ if (mCameraAgentNg != null) {
+ mCameraAgentNg.setCameraDefaultExceptionCallback(callback, handler);
+ }
}
@Override
@@ -180,6 +200,11 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
@Override
public void requestCamera(int id) {
+ requestCamera(id, false);
+ }
+
+ @Override
+ public void requestCamera(int id, boolean useNewApi) {
// Based on
// (mRequestingCameraId == id, mRequestingCameraId == EMPTY_REQUEST),
// we have (T, T), (T, F), (F, T), (F, F).
@@ -195,19 +220,31 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
return;
}
mRequestingCameraId = id;
+
+ // Only actually use the new API if it's supported on this device.
+ useNewApi = mCameraAgentNg != null && useNewApi;
+ CameraAgent cameraManager = useNewApi ? mCameraAgentNg : mCameraAgent;
+
if (mCameraProxy == null) {
// No camera yet.
- checkAndOpenCamera(mContext, mCameraAgent, id, mCallbackHandler, this);
- } else if (mCameraProxy.getCameraId() != id) {
- // Already has another camera opened.
- mCameraAgent.closeCamera(mCameraProxy, false);
- checkAndOpenCamera(mContext, mCameraAgent, id, mCallbackHandler, this);
+ checkAndOpenCamera(mContext, cameraManager, id, mCallbackHandler, this);
+ } else if (mCameraProxy.getCameraId() != id || mUsingNewApi != useNewApi) {
+ // Already has camera opened, and is switching cameras and/or APIs.
+ if (mUsingNewApi) {
+ mCameraAgentNg.closeCamera(mCameraProxy, true);
+ } else {
+ mCameraAgent.closeCamera(mCameraProxy, true);
+ }
+ checkAndOpenCamera(mContext, cameraManager, id, mCallbackHandler, this);
} else {
// The same camera, just do a reconnect.
Log.v(TAG, "reconnecting to use the existing camera");
mCameraProxy.reconnect(mCallbackHandler, this);
mCameraProxy = null;
}
+
+ mUsingNewApi = useNewApi;
+ mInfo = cameraManager.getCameraDeviceInfo();
}
@Override
@@ -247,8 +284,13 @@ public class CameraController implements CameraAgent.CameraOpenCallback, CameraP
}
Log.v(TAG, "Closing camera");
mCameraProxy = null;
- mCameraAgent.closeCamera(mCameraProxy, synced);
+ if (mUsingNewApi) {
+ mCameraAgentNg.closeCamera(mCameraProxy, synced);
+ } else {
+ mCameraAgent.closeCamera(mCameraProxy, synced);
+ }
mRequestingCameraId = EMPTY_REQUEST;
+ mUsingNewApi = false;
}
private static void checkAndOpenCamera(Context context, CameraAgent cameraManager,
diff --git a/src/com/android/camera/app/CameraProvider.java b/src/com/android/camera/app/CameraProvider.java
index 6e9fd62d5..40c602f6c 100644
--- a/src/com/android/camera/app/CameraProvider.java
+++ b/src/com/android/camera/app/CameraProvider.java
@@ -35,6 +35,15 @@ public interface CameraProvider {
*/
public void requestCamera(int id);
+ /**
+ * Requests the camera device. If the camera device of the same ID is
+ * already requested, then no-op here.
+ *
+ * @param id The ID of the requested camera device.
+ * @param useNewApi Whether to use the new API if this platform provides it.
+ */
+ public void requestCamera(int id, boolean useNewApi);
+
public boolean waitingForCamera();
/**
diff --git a/src/com/android/camera/settings/AppUpgrader.java b/src/com/android/camera/settings/AppUpgrader.java
index ef2acd433..8d7e57912 100644
--- a/src/com/android/camera/settings/AppUpgrader.java
+++ b/src/com/android/camera/settings/AppUpgrader.java
@@ -111,7 +111,8 @@ public class AppUpgrader extends SettingsUpgrader {
if (lastVersion < CAMERA_SIZE_SETTING_UPGRADE_VERSION) {
CameraDeviceInfo infos = CameraAgentFactory
- .getAndroidCameraAgent(context).getCameraDeviceInfo();
+ .getAndroidCameraAgent(context, CameraAgentFactory.CameraApi.API_1)
+ .getCameraDeviceInfo();
upgradeCameraSizeSetting(settingsManager, context, infos,
SettingsUtil.CAMERA_FACING_FRONT);
upgradeCameraSizeSetting(settingsManager, context, infos,
diff --git a/src/com/android/camera/settings/CameraSettingsActivity.java b/src/com/android/camera/settings/CameraSettingsActivity.java
index ca31913e7..94e8a3230 100644
--- a/src/com/android/camera/settings/CameraSettingsActivity.java
+++ b/src/com/android/camera/settings/CameraSettingsActivity.java
@@ -110,7 +110,9 @@ public class CameraSettingsActivity extends FragmentActivity {
CameraSettingsActivityHelper.addAdditionalPreferences(this, context);
}
mCamcorderProfileNames = getResources().getStringArray(R.array.camcorder_profile_names);
- mInfos = CameraAgentFactory.getAndroidCameraAgent(context).getCameraDeviceInfo();
+ mInfos = CameraAgentFactory
+ .getAndroidCameraAgent(context, CameraAgentFactory.CameraApi.API_1)
+ .getCameraDeviceInfo();
}
@Override
diff --git a/src_pd/com/android/camera/util/GservicesHelper.java b/src_pd/com/android/camera/util/GservicesHelper.java
index f5fe9f9c2..6c388596c 100644
--- a/src_pd/com/android/camera/util/GservicesHelper.java
+++ b/src_pd/com/android/camera/util/GservicesHelper.java
@@ -22,4 +22,9 @@ public class GservicesHelper {
public static int getMaxAllowedNativeMemoryMb(Context context) {
return -1;
}
+
+ public static boolean useCamera2ApiThroughPortabilityLayer(Context context) {
+ // Use the camera2 API by default. This only affects PhotoModule on L.
+ return true;
+ }
}