Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
6976152
Identified deprecated usages and added initial fixes
camsim99 Oct 11, 2021
49722e4
Fix resolution feature tests
camsim99 Oct 11, 2021
f40abe2
fix mediarecorderbuilder test
camsim99 Oct 11, 2021
38d2310
suppress device orientation/unrelated errors
camsim99 Oct 11, 2021
09a2685
fix camera test
camsim99 Oct 11, 2021
accaed0
update android sdk versions in related build files
camsim99 Oct 12, 2021
a0441d9
add build checks for resolutionfeature:
camsim99 Oct 12, 2021
2383bf3
adjust mediarecorderbuilder and use robolectric
camsim99 Oct 13, 2021
09cbfa8
adjust camera and test
camsim99 Oct 13, 2021
252a6fe
format files
camsim99 Oct 13, 2021
f8fd254
restore device orientation (unrelated todo)
camsim99 Oct 13, 2021
f238289
changed error handling
camsim99 Oct 13, 2021
8532e97
add error check for media recorder
camsim99 Oct 13, 2021
724f891
add robolectric to resolutionfeature test
camsim99 Oct 15, 2021
b77b4fc
push latest changes to resolve camera test
camsim99 Oct 15, 2021
d6110ea
reformat and reorganize resolution feature test
camsim99 Oct 15, 2021
b7f7649
add missing imports
camsim99 Oct 15, 2021
c77ff4e
correct camera test
camsim99 Oct 16, 2021
162309b
removed print statement
camsim99 Oct 18, 2021
e74767a
change names
camsim99 Oct 18, 2021
3fd589c
Document gradle properties
camsim99 Oct 18, 2021
d3547d8
change bcprov jdk version
camsim99 Oct 18, 2021
c8194fc
modify enablejetifier
camsim99 Oct 19, 2021
84a243a
removie blacklist option
camsim99 Oct 19, 2021
95fac07
trying gradle modifications
camsim99 Oct 19, 2021
00a4e0d
upgrade gradle version:
camsim99 Oct 19, 2021
d59ff1f
upgrade gradle version and remove deprecations
camsim99 Oct 19, 2021
fb94483
downgrade robolectric version
camsim99 Oct 19, 2021
e0f71bc
remove robolectric req'd docker lines
camsim99 Oct 19, 2021
92e44c1
fix video_player and target api CI issues
camsim99 Oct 20, 2021
e54ec61
modify connectivity gradle verison
camsim99 Oct 20, 2021
bf9e4f7
circumvent android-lint problems for now
camsim99 Oct 20, 2021
e10031d
Bump plugin versions and update release notes
camsim99 Oct 20, 2021
ef23a8c
Revert mistake versionplugin bump
camsim99 Oct 20, 2021
f59241c
Merge branch 'master' into issue_89578_dev
camsim99 Oct 20, 2021
4fff3f3
Correct video_player version
camsim99 Oct 20, 2021
d2d58b3
Make first round of addressing Stuart's comments
camsim99 Oct 21, 2021
25550d0
rename on31, add back android-lint-artifcats
camsim99 Oct 21, 2021
4cbe753
Merge remote-tracking branch 'upstream/master' into issue_89578_dev
camsim99 Oct 22, 2021
7304068
Removed unneeded annotation
camsim99 Oct 25, 2021
3f50377
undo changes to other plugins
camsim99 Oct 25, 2021
5d6a93a
fix android platform test errors
camsim99 Oct 25, 2021
1e266e0
Remove undone changes from change logs
camsim99 Oct 25, 2021
9acf444
Merge remote-tracking branch 'upstream/master' into issue_89578_dev
camsim99 Oct 25, 2021
2cf0c68
undo changes to dart messenger
camsim99 Oct 25, 2021
e779b26
fix merge conflict
camsim99 Oct 28, 2021
e745349
undo accidental changelog modification
camsim99 Oct 28, 2021
d25fbac
Merge remote-tracking branch 'upstream/master' into issue_89578_dev
camsim99 Oct 29, 2021
979a37f
address nits
camsim99 Oct 29, 2021
11cc4e1
rename on31s
camsim99 Oct 29, 2021
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
Prev Previous commit
Next Next commit
adjust mediarecorderbuilder and use robolectric
  • Loading branch information
camsim99 committed Oct 18, 2021
commit 2383bf3cdf8bf87e53f36e49c80c67c5b3ef5dcc
2 changes: 1 addition & 1 deletion packages/camera/camera/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,5 @@ dependencies {
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-inline:3.12.4'
testImplementation 'androidx.test:core:1.3.0'
testImplementation 'org.robolectric:robolectric:4.3'
testImplementation 'org.robolectric:robolectric:4.6.1'
}
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException {
.getLockedCaptureOrientation();

mediaRecorder =
new MediaRecorderBuilder(getRecordingProfile(), applicationContext, outputFilePath)
new MediaRecorderBuilder(getRecordingProfile(), outputFilePath)
.setEnableAudio(enableAudio)
.setMediaOrientation(
lockedOrientation == null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,54 @@

import android.media.CamcorderProfile;
import android.media.EncoderProfiles;
import android.content.Context;
import android.media.MediaRecorder;
import android.os.Build;
import androidx.annotation.NonNull;
import java.io.IOException;

public class MediaRecorderBuilder {
@SuppressWarnings("deprecation")
static class MediaRecorderFactory {
MediaRecorder makeMediaRecorder(Context applicationContext) {
return new MediaRecorder(applicationContext);
MediaRecorder makeMediaRecorder() {
return new MediaRecorder();
}
}

private final String outputFilePath;
private final EncoderProfiles recordingProfile;
private final CamcorderProfile camcorderProfile;
private final EncoderProfiles encoderProfiles;
private final MediaRecorderFactory recorderFactory;
private final Context applicationContext;

private boolean enableAudio;
private int mediaOrientation;

public MediaRecorderBuilder(
@NonNull EncoderProfiles recordingProfile, @NonNull Context applicationContext, @NonNull String outputFilePath) {
this(recordingProfile, applicationContext, outputFilePath, new MediaRecorderFactory());
@NonNull CamcorderProfile camcorderProfile, @NonNull String outputFilePath) {
this(camcorderProfile, outputFilePath, new MediaRecorderFactory());
}

public MediaRecorderBuilder(
@NonNull EncoderProfiles encoderProfiles, @NonNull String outputFilePath) {
this(encoderProfiles, outputFilePath, new MediaRecorderFactory());
}

MediaRecorderBuilder(
@NonNull EncoderProfiles recordingProfile,
@NonNull Context applicationContext,
@NonNull CamcorderProfile camcorderProfile,
@NonNull String outputFilePath,
MediaRecorderFactory helper) {
this.outputFilePath = outputFilePath;
this.camcorderProfile = camcorderProfile;
this.encoderProfiles = null;
this.recorderFactory = helper;
}

MediaRecorderBuilder(
@NonNull EncoderProfiles encoderProfiles,
@NonNull String outputFilePath,
MediaRecorderFactory helper) {
this.outputFilePath = outputFilePath;
this.applicationContext = applicationContext;
this.recordingProfile = recordingProfile;
this.encoderProfiles = encoderProfiles;
this.camcorderProfile = null;
this.recorderFactory = helper;
}

Expand All @@ -53,33 +68,42 @@ public MediaRecorderBuilder setMediaOrientation(int orientation) {
}

public MediaRecorder build() throws IOException {
MediaRecorder mediaRecorder = recorderFactory.makeMediaRecorder(applicationContext);

EncoderProfiles.VideoProfile videoProfile = recordingProfile.getVideoProfiles().get(0);
EncoderProfiles.AudioProfile audioProfile = recordingProfile.getAudioProfiles().get(0);
MediaRecorder mediaRecorder = recorderFactory.makeMediaRecorder();

// There's a fixed order that mediaRecorder expects. Only change these functions accordingly.
// You can find the specifics here: https://developer.android.com/reference/android/media/MediaRecorder.
if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
// mediaRecorder.setOutputFormat(recordingProfile.fileFormat);
mediaRecorder.setOutputFormat(recordingProfile.getRecommendedFileFormat());
if (enableAudio) {
// mediaRecorder.setAudioEncoder(recordingProfile.audioCodec);

if (Build.VERSION.SDK_INT >= 31) {
EncoderProfiles.VideoProfile videoProfile = encoderProfiles.getVideoProfiles().get(0);
EncoderProfiles.AudioProfile audioProfile = encoderProfiles.getAudioProfiles().get(0);

mediaRecorder.setOutputFormat(encoderProfiles.getRecommendedFileFormat());
if (enableAudio) {
mediaRecorder.setAudioEncoder(audioProfile.getCodec());
// mediaRecorder.setAudioEncodingBitRate(recordingProfile.audioBitRate);
mediaRecorder.setAudioEncodingBitRate(audioProfile.getBitrate());
// mediaRecorder.setAudioSamplingRate(recordingProfile.audioSampleRate);
mediaRecorder.setAudioSamplingRate(audioProfile.getSampleRate());
}
mediaRecorder.setVideoEncoder(videoProfile.getCodec());
mediaRecorder.setVideoEncodingBitRate(videoProfile.getBitrate());
mediaRecorder.setVideoFrameRate(videoProfile.getFrameRate());
mediaRecorder.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight());
mediaRecorder.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight());
}
// mediaRecorder.setVideoEncoder(recordingProfile.videoCodec);
mediaRecorder.setVideoEncoder(videoProfile.getCodec());
// mediaRecorder.setVideoEncodingBitRate(recordingProfile.videoBitRate);
mediaRecorder.setVideoEncodingBitRate(videoProfile.getBitrate());
// mediaRecorder.setVideoFrameRate(recordingProfile.videoFrameRate);
mediaRecorder.setVideoFrameRate(videoProfile.getFrameRate());
// mediaRecorder.setVideoSize(recordingProfile.videoFrameWidth, recordingProfile.videoFrameHeight);
mediaRecorder.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight());
else {
mediaRecorder.setOutputFormat(camcorderProfile.fileFormat);
if (enableAudio) {
mediaRecorder.setAudioEncoder(camcorderProfile.audioCodec);
mediaRecorder.setAudioEncodingBitRate(camcorderProfile.audioBitRate);
mediaRecorder.setAudioSamplingRate(camcorderProfile.audioSampleRate);
}
mediaRecorder.setVideoEncoder(camcorderProfile.videoCodec);
mediaRecorder.setVideoEncodingBitRate(camcorderProfile.videoBitRate);
mediaRecorder.setVideoFrameRate(camcorderProfile.videoFrameRate);
mediaRecorder.setVideoSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);
}

mediaRecorder.setOutputFile(outputFilePath);
mediaRecorder.setOrientationHint(this.mediaOrientation);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,77 @@
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.*;

import android.content.Context;
import android.media.CamcorderProfile;
import android.media.EncoderProfiles;
import android.media.MediaRecorder;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.List;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.mockito.InOrder;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
public class MediaRecorderBuilderTest {
@Config(maxSdk = 30)
@SuppressWarnings("deprecation")
@Test
public void ctor_test() {
Context mockApplicationContext = mock(Context.class);
MediaRecorderBuilder builder =
new MediaRecorderBuilder(CamcorderProfile.getAll("0",CamcorderProfile.QUALITY_1080P), mockApplicationContext, "");
new MediaRecorderBuilder(CamcorderProfile.get(CamcorderProfile.QUALITY_1080P), "");

assertNotNull(builder);
}

@Config(minSdk = 31)
@Test
public void ctor_test_v31() {
MediaRecorderBuilder builder =
new MediaRecorderBuilder(CamcorderProfile.getAll("0",CamcorderProfile.QUALITY_1080P), "");

assertNotNull(builder);
}

@Config(maxSdk = 30)
@SuppressWarnings("deprecation")
@Test
public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOException {
// CamcorderProfile recorderProfile = getEmptyCamcorderProfile();
CamcorderProfile recorderProfile = getEmptyCamcorderProfile();
MediaRecorderBuilder.MediaRecorderFactory mockFactory =
mock(MediaRecorderBuilder.MediaRecorderFactory.class);
MediaRecorder mockMediaRecorder = mock(MediaRecorder.class);
String outputFilePath = "mock_video_file_path";
int mediaOrientation = 1;
MediaRecorderBuilder builder =
new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory)
.setEnableAudio(false)
.setMediaOrientation(mediaOrientation);

when(mockFactory.makeMediaRecorder()).thenReturn(mockMediaRecorder);

MediaRecorder recorder = builder.build();

InOrder inOrder = inOrder(recorder);
inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE);
inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat);
inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec);
inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate);
inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate);
inOrder
.verify(recorder)
.setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight);
inOrder.verify(recorder).setOutputFile(outputFilePath);
inOrder.verify(recorder).setOrientationHint(mediaOrientation);
inOrder.verify(recorder).prepare();
}

@Config(minSdk = 31)
@Test
public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled_v31() throws IOException {
EncoderProfiles recorderProfile = mock(EncoderProfiles.class);
Context mockApplicationContext = mock(Context.class);
List<EncoderProfiles.VideoProfile> mockVideoProfiles = List.of(mock(EncoderProfiles.VideoProfile.class));
List<EncoderProfiles.AudioProfile> mockAudioProfiles = List.of(mock(EncoderProfiles.AudioProfile.class));
MediaRecorderBuilder.MediaRecorderFactory mockFactory =
Expand All @@ -40,11 +86,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx
String outputFilePath = "mock_video_file_path";
int mediaOrientation = 1;
MediaRecorderBuilder builder =
new MediaRecorderBuilder(recorderProfile, mockApplicationContext, outputFilePath, mockFactory)
new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory)
.setEnableAudio(false)
.setMediaOrientation(mediaOrientation);

when(mockFactory.makeMediaRecorder(mockApplicationContext)).thenReturn(mockMediaRecorder);
when(mockFactory.makeMediaRecorder()).thenReturn(mockMediaRecorder);
when(recorderProfile.getVideoProfiles()).thenReturn(mockVideoProfiles);
when(recorderProfile.getAudioProfiles()).thenReturn(mockAudioProfiles);

Expand All @@ -55,29 +101,60 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsDisabled() throws IOEx

InOrder inOrder = inOrder(recorder);
inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE);
// inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat);
inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat());
// inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec);
inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec());
// inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate);
inOrder.verify(recorder).setVideoEncodingBitRate(videoProfile.getBitrate());
// inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate);
inOrder.verify(recorder).setVideoFrameRate(videoProfile.getFrameRate());

inOrder
.verify(recorder)
.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight());
// .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight);
inOrder.verify(recorder).setOutputFile(outputFilePath);
inOrder.verify(recorder).setOrientationHint(mediaOrientation);
inOrder.verify(recorder).prepare();
}

@Config(maxSdk = 30)
@SuppressWarnings("deprecation")
@Test
public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOException {
// CamcorderProfile recorderProfile = getEmptyCamcorderProfile();
CamcorderProfile recorderProfile = getEmptyCamcorderProfile();
MediaRecorderBuilder.MediaRecorderFactory mockFactory =
mock(MediaRecorderBuilder.MediaRecorderFactory.class);
MediaRecorder mockMediaRecorder = mock(MediaRecorder.class);
String outputFilePath = "mock_video_file_path";
int mediaOrientation = 1;
MediaRecorderBuilder builder =
new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory)
.setEnableAudio(true)
.setMediaOrientation(mediaOrientation);

when(mockFactory.makeMediaRecorder()).thenReturn(mockMediaRecorder);

MediaRecorder recorder = builder.build();

InOrder inOrder = inOrder(recorder);
inOrder.verify(recorder).setAudioSource(MediaRecorder.AudioSource.MIC);
inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE);
inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat);
inOrder.verify(recorder).setAudioEncoder(recorderProfile.audioCodec);
inOrder.verify(recorder).setAudioEncodingBitRate(recorderProfile.audioBitRate);
inOrder.verify(recorder).setAudioSamplingRate(recorderProfile.audioSampleRate);
inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec);
inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate);
inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate);
inOrder
.verify(recorder)
.setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight);
inOrder.verify(recorder).setOutputFile(outputFilePath);
inOrder.verify(recorder).setOrientationHint(mediaOrientation);
inOrder.verify(recorder).prepare();
}

@Config(minSdk = 31)
@Test
public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled_v31() throws IOException {
System.out.println(getEmptyCamcorderProfile());
EncoderProfiles recorderProfile = mock(EncoderProfiles.class);
Context mockApplicationContext = mock(Context.class);
List<EncoderProfiles.VideoProfile> mockVideoProfiles = List.of(mock(EncoderProfiles.VideoProfile.class));
List<EncoderProfiles.AudioProfile> mockAudioProfiles = List.of(mock(EncoderProfiles.AudioProfile.class));
MediaRecorderBuilder.MediaRecorderFactory mockFactory =
Expand All @@ -86,11 +163,11 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc
String outputFilePath = "mock_video_file_path";
int mediaOrientation = 1;
MediaRecorderBuilder builder =
new MediaRecorderBuilder(recorderProfile, mockApplicationContext, outputFilePath, mockFactory)
new MediaRecorderBuilder(recorderProfile, outputFilePath, mockFactory)
.setEnableAudio(true)
.setMediaOrientation(mediaOrientation);

when(mockFactory.makeMediaRecorder(mockApplicationContext)).thenReturn(mockMediaRecorder);
when(mockFactory.makeMediaRecorder()).thenReturn(mockMediaRecorder);
when(recorderProfile.getVideoProfiles()).thenReturn(mockVideoProfiles);
when(recorderProfile.getAudioProfiles()).thenReturn(mockAudioProfiles);

Expand All @@ -102,24 +179,16 @@ public void build_shouldSetValuesInCorrectOrderWhenAudioIsEnabled() throws IOExc
InOrder inOrder = inOrder(recorder);
inOrder.verify(recorder).setAudioSource(MediaRecorder.AudioSource.MIC);
inOrder.verify(recorder).setVideoSource(MediaRecorder.VideoSource.SURFACE);
// inOrder.verify(recorder).setOutputFormat(recorderProfile.fileFormat);
inOrder.verify(recorder).setOutputFormat(recorderProfile.getRecommendedFileFormat());
// inOrder.verify(recorder).setAudioEncoder(recorderProfile.audioCodec);
inOrder.verify(recorder).setAudioEncoder(audioProfile.getCodec());
// inOrder.verify(recorder).setAudioEncodingBitRate(recorderProfile.audioBitRate);
inOrder.verify(recorder).setAudioEncodingBitRate(audioProfile.getBitrate());
// inOrder.verify(recorder).setAudioSamplingRate(recorderProfile.audioSampleRate);
inOrder.verify(recorder).setAudioSamplingRate(audioProfile.getSampleRate());
// inOrder.verify(recorder).setVideoEncoder(recorderProfile.videoCodec);
inOrder.verify(recorder).setVideoEncoder(videoProfile.getCodec());
// inOrder.verify(recorder).setVideoEncodingBitRate(recorderProfile.videoBitRate);
inOrder.verify(recorder).setVideoEncodingBitRate(videoProfile.getBitrate());
// inOrder.verify(recorder).setVideoFrameRate(recorderProfile.videoFrameRate);
inOrder.verify(recorder).setVideoFrameRate(videoProfile.getFrameRate());
inOrder
.verify(recorder)
.setVideoSize(videoProfile.getWidth(), videoProfile.getHeight());
// .setVideoSize(recorderProfile.videoFrameWidth, recorderProfile.videoFrameHeight);
inOrder.verify(recorder).setOutputFile(outputFilePath);
inOrder.verify(recorder).setOrientationHint(mediaOrientation);
inOrder.verify(recorder).prepare();
Expand Down
1 change: 1 addition & 0 deletions packages/camera/camera/example/android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
android.enableR8=true
android.jetifier.blacklist=bcprov-jdk15on