diff options
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 9 | ||||
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 14 | ||||
-rw-r--r-- | src/com/android/camera/app/CameraController.java | 58 | ||||
-rw-r--r-- | src/com/android/camera/app/CameraProvider.java | 9 | ||||
-rw-r--r-- | src/com/android/camera/settings/AppUpgrader.java | 3 | ||||
-rw-r--r-- | src/com/android/camera/settings/CameraSettingsActivity.java | 4 | ||||
-rw-r--r-- | src_pd/com/android/camera/util/GservicesHelper.java | 5 |
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; + } } |