Skip to content

Commit

Permalink
Fix camera on q (#306)
Browse files Browse the repository at this point in the history
* handle uri on Q

* add test for camera only
  • Loading branch information
esafirm committed Oct 19, 2020
1 parent 9c90754 commit d9aa1ae
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import java.io.Serializable
class DefaultCameraModule : CameraModule, Serializable {

private var currentImagePath: String? = null
private var currentUri: String? = null

/**
* Helper function to get camera Intent without config
Expand All @@ -28,6 +29,8 @@ class DefaultCameraModule : CameraModule, Serializable {
}

override fun getCameraIntent(context: Context, config: BaseConfig): Intent? {
prepareForNewIntent()

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val imageFile = ImagePickerUtils.createImageFile(config.imageDirectory, context)

Expand All @@ -36,11 +39,17 @@ class DefaultCameraModule : CameraModule, Serializable {
val uri = createCameraUri(appContext, imageFile)
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
ImagePickerUtils.grantAppPermission(context, intent, uri)
currentUri = uri.toString()
return intent
}
return null
}

private fun prepareForNewIntent() {
currentImagePath = null
currentUri = null
}

private fun createCameraUri(appContext: Context, imageFile: File): Uri? {
currentImagePath = "file:" + imageFile.absolutePath
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
Expand All @@ -67,14 +76,19 @@ class DefaultCameraModule : CameraModule, Serializable {

val imageUri = Uri.parse(currentImagePath)
if (imageUri != null) {
MediaScannerConnection.scanFile(context.applicationContext, arrayOf(imageUri.path), null) { path: String?, uri: Uri ->
MediaScannerConnection.scanFile(context.applicationContext, arrayOf(imageUri.path), null) { path: String?, uri: Uri? ->
IpLogger.getInstance().d("File $path was scanned successfully: $uri")

if (path == null) {
IpLogger.getInstance().d("This should not happen, go back to Immediate implementation")
}
if (uri == null) {
IpLogger.getInstance().d("scanFile is failed. Uri is null")
}

val finalPath = path ?: currentImagePath!!
imageReadyListener.onImageReady(ImageFactory.singleImage(uri, finalPath))
val finalUri = uri ?: Uri.parse(currentUri)
imageReadyListener.onImageReady(ImageFactory.singleImage(finalUri, finalPath))
ImagePickerUtils.revokeAppPermission(context, imageUri)
}
}
Expand Down
3 changes: 3 additions & 0 deletions sample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,7 @@ dependencies {
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "androidx.test:runner:$runnerVersion"
androidTestImplementation "androidx.test:rules:$runnerVersion"
androidTestImplementation('com.schibsted.spain:barista:3.7.0') {
exclude group: 'org.jetbrains.kotlin'
}
}
7 changes: 7 additions & 0 deletions sample/src/androidTest/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
package="com.esafirm.sample">

<uses-sdk tools:overrideLibrary="com.schibsted.spain.barista,android_libs.ub_uiautomator" />

</manifest>
56 changes: 56 additions & 0 deletions sample/src/androidTest/java/com/esafirm/sample/CameraOnlyTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.esafirm.sample


import android.widget.ScrollView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import androidx.test.rule.GrantPermissionRule
import androidx.test.runner.AndroidJUnit4
import com.esafirm.sample.matchers.hasDrawable
import com.schibsted.spain.barista.intents.BaristaIntents.mockAndroidCamera
import com.schibsted.spain.barista.interaction.BaristaClickInteractions.clickOn
import org.hamcrest.Matchers.allOf
import org.hamcrest.core.IsInstanceOf
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@LargeTest
@RunWith(AndroidJUnit4::class)
class CameraOnlyTest {

@Rule
@JvmField
var testRule = ActivityTestRule(MainActivity::class.java)

@Rule
@JvmField
var grantPermissionRule = GrantPermissionRule.grant(
"android.permission.CAMERA",
"android.permission.WRITE_EXTERNAL_STORAGE"
)

@Test
fun cameraOnlyTestTwo() {
Intents.init()
mockAndroidCamera()
clickOn(R.id.button_camera)
Intents.release()

clickOn(R.id.text_view)

val imageView = onView(
allOf(ViewMatchers.withParent(allOf(withId(R.id.container),
ViewMatchers.withParent(IsInstanceOf.instanceOf(ScrollView::class.java)))),
isDisplayed()))

imageView.check(ViewAssertions.matches(isDisplayed()))
imageView.check(ViewAssertions.matches(hasDrawable()))
}
}

0 comments on commit d9aa1ae

Please sign in to comment.