Merge branch 'edit_fix' into 'master'

Fix edit button, add test

Closes #276

See merge request pixeldroid/PixelDroid!329
This commit is contained in:
Matthieu 2021-04-21 22:07:05 +00:00
commit b9d11aa153
5 changed files with 79 additions and 43 deletions

View File

@ -70,7 +70,9 @@ class EditPhotoTest {
file.writeBitmap(image) file.writeBitmap(image)
uri = file.toUri() uri = file.toUri()
} }
val intent = Intent(context, PhotoEditActivity::class.java).putExtra("picture_uri", uri) val intent = Intent(context, PhotoEditActivity::class.java)
.putExtra(PhotoEditActivity.PICTURE_URI, uri)
.putExtra(PhotoEditActivity.PICTURE_POSITION, 0)
activityScenario = ActivityScenario.launch<PhotoEditActivity>(intent).onActivity{a -> activity = a} activityScenario = ActivityScenario.launch<PhotoEditActivity>(intent).onActivity{a -> activity = a}

View File

@ -7,26 +7,21 @@ import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.graphics.Color
import android.net.Uri import android.net.Uri
import android.util.Log
import android.view.View.VISIBLE
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.os.bundleOf
import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule import androidx.test.rule.GrantPermissionRule
import com.h.pixeldroid.postCreation.PostCreationActivity import com.h.pixeldroid.postCreation.PostCreationActivity
import com.h.pixeldroid.postCreation.photoEdit.ThumbnailAdapter
import com.h.pixeldroid.settings.AboutActivity import com.h.pixeldroid.settings.AboutActivity
import com.h.pixeldroid.testUtility.* import com.h.pixeldroid.testUtility.*
import com.h.pixeldroid.utils.db.AppDatabase import com.h.pixeldroid.utils.db.AppDatabase
import org.hamcrest.CoreMatchers.not
import org.junit.* import org.junit.*
import org.junit.rules.Timeout import org.junit.rules.Timeout
import org.junit.runner.RunWith import org.junit.runner.RunWith
@ -44,7 +39,8 @@ class PostCreationActivityTest {
val globalTimeout: Timeout = Timeout.seconds(30) val globalTimeout: Timeout = Timeout.seconds(30)
@get:Rule @get:Rule
val mRuntimePermissionRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE) val mRuntimePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)
private fun File.writeBitmap(bitmap: Bitmap) { private fun File.writeBitmap(bitmap: Bitmap) {
outputStream().use { out -> outputStream().use { out ->
@ -112,32 +108,65 @@ class PostCreationActivityTest {
// should send on main activity // should send on main activity
onView(withId(R.id.retry_upload_button)).check(matches(not(isDisplayed()))) onView(withId(R.id.retry_upload_button)).check(matches(not(isDisplayed())))
} }
*/
/**
* Makes sure the [com.h.pixeldroid.postCreation.photoEdit.PhotoEditActivity] is launched
* when the edit button is pressed
*/
@Test @Test
fun editImage() { fun editImage() {
Thread.sleep(1000) waitForView(R.id.postTextInputLayout)
onView(withId(R.id.image_grid)).perform( onView(withId(R.id.editPhotoButton)).perform(click())
RecyclerViewActions.actionOnItemAtPosition<PostCreationActivity.PostCreationAdapter.ViewHolder>(
0,
CustomMatchers.clickChildViewWithId(R.id.galleryImage)
)
)
Thread.sleep(1000)
onView(withId(R.id.recycler_view)) waitForView(R.id.cropImageButton)
.perform(
RecyclerViewActions.actionOnItemAtPosition<ThumbnailAdapter.MyViewHolder>(
2,
CustomMatchers.clickChildViewWithId(R.id.thumbnail)
)
)
Thread.sleep(1000)
onView(withId(R.id.action_save)).perform(click())
Thread.sleep(1000)
onView(withId(R.id.carousel)).check(matches(isDisplayed()))
} }
/**
* Switch from carousel to grid and back
*/
@Test
fun carouselSwitch() {
waitForView(R.id.postTextInputLayout)
onView(withId(R.id.switchToGridButton)).perform(click())
waitForView(R.id.galleryImage)
onView(withId(R.id.switchToCarouselButton)).perform(click())
waitForView(R.id.btn_previous)
}
/**
* Delete images and check if it worked
*/
@Test
fun deleteImages() {
waitForView(R.id.postTextInputLayout)
onView(withId(R.id.removePhotoButton)).perform(click()).perform(click())
onView(withId(R.id.switchToGridButton)).perform(click())
onView(withId(R.id.galleryImage)).check(doesNotExist())
onView(withId(R.id.addPhotoSquare)).check(matches(isDisplayed()))
}
/**
* Makes sure the [com.h.pixeldroid.postCreation.camera.CameraActivity] is launched
* when the add image button is pressed
*/
@Test
fun addImage() {
waitForView(R.id.postTextInputLayout)
onView(withId(R.id.addPhotoButton)).perform(click())
waitForView(R.id.camera_activity_fragment)
}
/*
@Test @Test
fun cancelEdit() { fun cancelEdit() {
onView(withId(R.id.image_grid)).perform( onView(withId(R.id.image_grid)).perform(

View File

@ -16,6 +16,7 @@ import android.view.View.INVISIBLE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.net.toFile import androidx.core.net.toFile
import androidx.core.net.toUri import androidx.core.net.toUri
@ -412,18 +413,18 @@ class PostCreationActivity : BaseActivity() {
} }
private fun editResultContract(position: Int) = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ private val editResultContract: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
result: ActivityResult? -> result: ActivityResult? ->
if (result?.resultCode == Activity.RESULT_OK && result.data != null) { if (result?.resultCode == Activity.RESULT_OK && result.data != null) {
photoData[position].apply { val position: Int = result.data!!.getIntExtra(PhotoEditActivity.PICTURE_POSITION, 0)
imageUri = result.data!!.getStringExtra("result")!!.toUri() photoData.getOrNull(position)?.apply {
imageUri = result.data!!.getStringExtra(PhotoEditActivity.PICTURE_URI)!!.toUri()
size = imageUri.getSize() size = imageUri.getSize()
} progress = null
uploadId = null
} ?: Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show()
binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription) }) binding.carousel.addData(photoData.map { CarouselItem(it.imageUri, it.imageDescription) })
photoData[position].progress = null
photoData[position].uploadId = null
} else if(result?.resultCode != Activity.RESULT_CANCELED){ } else if(result?.resultCode != Activity.RESULT_CANCELED){
Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show() Toast.makeText(applicationContext, "Error while editing", Toast.LENGTH_SHORT).show()
} }
@ -431,8 +432,8 @@ class PostCreationActivity : BaseActivity() {
private fun edit(position: Int) { private fun edit(position: Int) {
val intent = Intent(this, PhotoEditActivity::class.java) val intent = Intent(this, PhotoEditActivity::class.java)
.putExtra("picture_uri", photoData[position].imageUri) .putExtra(PhotoEditActivity.PICTURE_URI, photoData[position].imageUri)
.putExtra("no upload", false) .putExtra(PhotoEditActivity.PICTURE_POSITION, position)
editResultContract(position).launch(intent) editResultContract.launch(intent)
} }
} }

View File

@ -65,6 +65,8 @@ class PhotoEditActivity : BaseActivity() {
private lateinit var filterListFragment: FilterListFragment private lateinit var filterListFragment: FilterListFragment
private lateinit var editImageFragment: EditImageFragment private lateinit var editImageFragment: EditImageFragment
private var picturePosition: Int? = null
private var brightnessFinal = BRIGHTNESS_START private var brightnessFinal = BRIGHTNESS_START
private var saturationFinal = SATURATION_START private var saturationFinal = SATURATION_START
private var contrastFinal = CONTRAST_START private var contrastFinal = CONTRAST_START
@ -74,6 +76,9 @@ class PhotoEditActivity : BaseActivity() {
} }
companion object{ companion object{
internal const val PICTURE_URI = "picture_uri"
internal const val PICTURE_POSITION = "picture_position"
private var executor: ExecutorService = newSingleThreadExecutor() private var executor: ExecutorService = newSingleThreadExecutor()
private var future: Future<*>? = null private var future: Future<*>? = null
@ -97,7 +102,8 @@ class PhotoEditActivity : BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeButtonEnabled(true) supportActionBar?.setHomeButtonEnabled(true)
initialUri = intent.getParcelableExtra("picture_uri") initialUri = intent.getParcelableExtra(PICTURE_URI)
picturePosition = intent.getIntExtra(PICTURE_POSITION, 0)
imageUri = initialUri imageUri = initialUri
// Crop button on-click listener // Crop button on-click listener
@ -342,7 +348,8 @@ class PhotoEditActivity : BaseActivity() {
private fun sendBackImage(file: String) { private fun sendBackImage(file: String) {
val intent = Intent(this, PostCreationActivity::class.java) val intent = Intent(this, PostCreationActivity::class.java)
.apply { .apply {
putExtra("result", file) putExtra(PICTURE_URI, file)
putExtra(PICTURE_POSITION, picturePosition)
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
} }

View File

@ -16,9 +16,6 @@ class DatabaseModule(private val context: Context) {
return Room.databaseBuilder( return Room.databaseBuilder(
context, context,
AppDatabase::class.java, "pixeldroid" AppDatabase::class.java, "pixeldroid"
).allowMainThreadQueries() ).allowMainThreadQueries().build()
//TODO remove this for 1.0 release
.fallbackToDestructiveMigration()
.build()
} }
} }