Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
2c04e86
Add camerax plugin
camsim99 Aug 3, 2022
5a561b9
Merge remote-tracking branch 'upstream/main' into camerax_rewrite
camsim99 Aug 3, 2022
9b4bf45
Bump down dart sdk version
camsim99 Aug 3, 2022
bcd03ff
Rev 1
camsim99 Aug 3, 2022
d66030e
Rev 2
camsim99 Aug 3, 2022
cda8281
Formatting
camsim99 Aug 4, 2022
d505dbb
Rev 3
camsim99 Aug 4, 2022
35d4fd0
Rev 4
camsim99 Aug 4, 2022
b399d6c
Rev 5
camsim99 Aug 4, 2022
a963c56
Rev 6
camsim99 Aug 4, 2022
8eec39c
Rev 7
camsim99 Aug 4, 2022
70c10f3
Add changelog message
camsim99 Aug 4, 2022
921fb0d
Rev 8
camsim99 Aug 4, 2022
7b1d9b0
Rev 9
camsim99 Aug 4, 2022
b0496c9
Add dependency
camsim99 Aug 4, 2022
3cc271e
Try fixing multidex error
camsim99 Aug 5, 2022
4afc191
Fix pubspec
camsim99 Aug 5, 2022
fc94964
Fix pubspec pt 2
camsim99 Aug 5, 2022
f61ec4d
Add camerax plugin to dependabot config file
camsim99 Aug 5, 2022
6b3cdcb
Actually fix pubspec pt 2
camsim99 Aug 5, 2022
867671a
Fix sorting
camsim99 Aug 5, 2022
f174031
Add integration test
camsim99 Aug 5, 2022
ef2fe0e
Add name
camsim99 Aug 5, 2022
d5373c6
Fix integration test
camsim99 Aug 5, 2022
3c24e80
Formatting
camsim99 Aug 5, 2022
d211970
Update packages/camera/camera_android_camerax/CHANGELOG.md
camsim99 Aug 9, 2022
365ba79
Address review
camsim99 Aug 9, 2022
bd3ced4
Fix pubspec
camsim99 Aug 9, 2022
f091371
Add apis for POC
camsim99 Aug 9, 2022
cae72e4
Start dev on availableCameras
camsim99 Aug 12, 2022
e9faee8
continue
camsim99 Aug 12, 2022
eab08f8
Continue
camsim99 Aug 12, 2022
e124f65
Start adding CameraSelectorFlutterApi
camsim99 Aug 12, 2022
2aa7f1c
continue
camsim99 Aug 12, 2022
1e11fe1
Finish adding all files for getAvailableCameras
camsim99 Aug 12, 2022
01c271a
Make some corrections
camsim99 Aug 12, 2022
fbd7e58
Add cam selector flutter api
camsim99 Aug 12, 2022
ebe7eaf
Fixing compiler errors
camsim99 Aug 16, 2022
b5b0738
Merge remote-tracking branch 'upstream/main' into camerax_rewrite_poc
camsim99 Aug 16, 2022
783d779
Revisions for compilation
camsim99 Aug 16, 2022
c33f25d
Address Stuart's review
camsim99 Aug 17, 2022
153edff
Start addressing linter
camsim99 Aug 18, 2022
75d320c
Fix analyzer, debug channel issue
camsim99 Aug 18, 2022
47d2784
Start debugging run app
camsim99 Aug 18, 2022
97f0c54
Debugging poc
camsim99 Aug 19, 2022
daae8d2
It worksgit add -ugit add -u
camsim99 Aug 22, 2022
23e7577
get rid of todos
camsim99 Aug 22, 2022
945e280
Fix analyze
camsim99 Aug 22, 2022
5d3ac51
Formatting
camsim99 Aug 22, 2022
4299817
Rename setupapis
camsim99 Aug 22, 2022
3b62574
Foramtting
camsim99 Aug 23, 2022
2c4b614
Make revisions minus context
camsim99 Aug 30, 2022
481758c
Merge remote-tracking branch 'upstream/main' into camerax_rewrite_poc
camsim99 Aug 30, 2022
fc434f1
Formatting
camsim99 Aug 30, 2022
2466213
Formatting
camsim99 Aug 30, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/camera/camera_android_camerax/AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
# to the Flutter project. Names should be added to the list like so:
#
# Name/Organization <email address>

Google Inc.
13 changes: 11 additions & 2 deletions packages/camera/camera_android_camerax/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,23 @@ rootProject.allprojects {
apply plugin: 'com.android.library'

android {
compileSdkVersion 31
compileSdkVersion 32

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

defaultConfig {
minSdkVersion 16
// Many of the CameraX APIs require API 21.
minSdkVersion 21
}
}

dependencies {
// CameraX core library using the camera2 implementation must use same version number.
def camerax_version = "1.2.0-alpha04"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,80 @@

package io.flutter.plugins.camerax;

import android.content.Context;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.BinaryMessenger;

/** CameraAndroidCameraxPlugin */
public class CameraAndroidCameraxPlugin implements FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private MethodChannel channel;
public final class CameraAndroidCameraxPlugin implements FlutterPlugin, ActivityAware {
private InstanceManager instanceManager;
private FlutterPluginBinding pluginBinding;
private ProcessCameraProviderHostApiImpl processCameraProviderHostApi;

/**
* Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment.
*
* <p>See {@code io.flutter.plugins.camera.MainActivity} for an example.
*/
public CameraAndroidCameraxPlugin() {}

void setUp(BinaryMessenger binaryMessenger, Context context) {
// Set up instance manager.
instanceManager = InstanceManager.open(identifier -> {});

// Set up Host APIs.
processCameraProviderHostApi =
new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context);
GeneratedCameraXLibrary.ProcessCameraProviderHostApi.setup(
binaryMessenger, processCameraProviderHostApi);
GeneratedCameraXLibrary.CameraInfoHostApi.setup(
binaryMessenger, new CameraInfoHostApiImpl(instanceManager));
GeneratedCameraXLibrary.CameraSelectorHostApi.setup(
binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager));
}

@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel =
new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "camera_android_camerax");
channel.setMethodCallHandler(this);
pluginBinding = flutterPluginBinding;
(new CameraAndroidCameraxPlugin())
.setUp(
flutterPluginBinding.getBinaryMessenger(),
flutterPluginBinding.getApplicationContext());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add a setContext method to ProcessCameraProviderHostApiImpl. And you should only used the application Context when the Activity is not available.

So just like the WebView plugin, you want to update the context as they are made available to you.

For an example, see where the webview plugin calls updateContext: https://github.com/flutter/plugins/blob/main/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java#L165https://github.com/flutter/plugins/blob/main/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewFlutterPlugin.java#L165

}

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
instanceManager.close();
}

// Activity Lifecycle methods:

@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) {
updateContext(activityPluginBinding.getActivity());
}

@Override
public void onDetachedFromActivityForConfigChanges() {
updateContext(pluginBinding.getApplicationContext());
}

@Override
public void onReattachedToActivityForConfigChanges(
@NonNull ActivityPluginBinding activityPluginBinding) {
updateContext(activityPluginBinding.getActivity());
}

@Override
public void onDetachedFromActivity() {
updateContext(pluginBinding.getApplicationContext());
}

/** Updates context that ProcessCameraProvider will use to bind UseCases to. */
private void updateContext(Context context) {
processCameraProviderHostApi.setContext(context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugins.camerax;

import androidx.camera.core.CameraInfo;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraInfoFlutterApi;

public class CameraInfoFlutterApiImpl extends CameraInfoFlutterApi {
private final InstanceManager instanceManager;

public CameraInfoFlutterApiImpl(
BinaryMessenger binaryMessenger, InstanceManager instanceManager) {
super(binaryMessenger);
this.instanceManager = instanceManager;
}

void create(CameraInfo cameraInfo, Reply<Void> reply) {
create(instanceManager.getIdentifierForStrongReference(cameraInfo), reply);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugins.camerax;

import androidx.annotation.NonNull;
import androidx.camera.core.CameraInfo;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraInfoHostApi;

public class CameraInfoHostApiImpl implements CameraInfoHostApi {
private final InstanceManager instanceManager;

public CameraInfoHostApiImpl(InstanceManager instanceManager) {
this.instanceManager = instanceManager;
}

@Override
public Long getSensorRotationDegrees(@NonNull Long instanceId) {
CameraInfo cameraInfo =
(CameraInfo) instanceManager.getInstance(instanceId); // may return null?
return Long.valueOf(cameraInfo.getSensorRotationDegrees());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugins.camerax;

import androidx.camera.core.CameraSelector;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraSelectorFlutterApi;

public class CameraSelectorFlutterApiImpl extends CameraSelectorFlutterApi {
private final InstanceManager instanceManager;

public CameraSelectorFlutterApiImpl(
BinaryMessenger binaryMessenger, InstanceManager instanceManager) {
super(binaryMessenger);
this.instanceManager = instanceManager;
}

void create(CameraSelector cameraSelector, Long lensDirection, Reply<Void> reply) {
create(instanceManager.getIdentifierForStrongReference(cameraSelector), lensDirection, reply);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugins.camerax;

import androidx.annotation.NonNull;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.CameraSelector;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraSelectorHostApi;
import java.util.ArrayList;
import java.util.List;

public class CameraSelectorHostApiImpl implements CameraSelectorHostApi {
private final BinaryMessenger binaryMessenger;
private final InstanceManager instanceManager;

public CameraSelectorHostApiImpl(
BinaryMessenger binaryMessenger, InstanceManager instanceManager) {
this.binaryMessenger = binaryMessenger;
this.instanceManager = instanceManager;
}

@Override
public Long requireLensFacing(@NonNull Long lensDirection) {
CameraSelector cameraSelectorWithLensSpecified =
(new CameraSelector.Builder()).requireLensFacing(Math.toIntExact(lensDirection)).build();

final CameraSelectorFlutterApiImpl cameraInfoFlutterApi =
new CameraSelectorFlutterApiImpl(binaryMessenger, instanceManager);
long cameraSelectorWithLensSpecifiedId =
instanceManager.addHostCreatedInstance(cameraSelectorWithLensSpecified);
cameraInfoFlutterApi.create(cameraSelectorWithLensSpecified, lensDirection, result -> {});

return cameraSelectorWithLensSpecifiedId;
}

@Override
public List<Long> filter(@NonNull Long instanceId, @NonNull List<Long> cameraInfoIds) {
CameraSelector cameraSelector = (CameraSelector) instanceManager.getInstance(instanceId);
List<CameraInfo> cameraInfosForFilter = new ArrayList<CameraInfo>();

for (Number cameraInfoId1 : cameraInfoIds) {
Long cameraInfoId = cameraInfoId1.longValue();

CameraInfo cameraInfo = (CameraInfo) instanceManager.getInstance(cameraInfoId);
cameraInfosForFilter.add(cameraInfo);
}

List<CameraInfo> filteredCameraInfos = cameraSelector.filter(cameraInfosForFilter);
final CameraInfoFlutterApiImpl cameraInfoFlutterApiImpl =
new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager);
List<Long> filteredCameraInfosIds = new ArrayList<Long>();

for (CameraInfo cameraInfo : filteredCameraInfos) {
long cameraInfoId = instanceManager.addHostCreatedInstance(cameraInfo);
cameraInfoFlutterApiImpl.create(cameraInfo, result -> {});
filteredCameraInfosIds.add(cameraInfoId);
}

return filteredCameraInfosIds;
}
}
Loading