diff --git a/app/build.gradle b/app/build.gradle index feb8ce92..93a201ef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -151,6 +151,10 @@ dependencies { implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}" + // Image picking and registerForActivityResult + implementation 'androidx.activity:activity-ktx:1.6.1' + implementation "androidx.fragment:fragment-ktx:1.4.1" + // Instrumented Tests androidTestImplementation 'androidx.test:core:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6fedda6..f381a06a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,7 +4,6 @@ package="net.pokeranalytics.android"> - diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt index f617d188..c84e7bf7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt @@ -1,7 +1,6 @@ package net.pokeranalytics.android.model.realm import android.content.Context -import android.net.Uri import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject @@ -32,9 +31,6 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, RowRepres var picture: String? = null var comments: RealmList = RealmList() - @Ignore - var pictureUri: Uri? = null - @Ignore override val realmObjectClass: Class = Player::class.java @@ -67,7 +63,7 @@ open class Player : RealmObject(), NameManageable, Savable, Deletable, RowRepres when (row) { PlayerPropertiesRow.NAME -> this.name = value as String? ?: "" PlayerPropertiesRow.SUMMARY -> this.summary = value as String? ?: "" - PlayerPropertiesRow.IMAGE -> this.pictureUri = value as? Uri + PlayerPropertiesRow.IMAGE -> this.picture = value as? String } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/CameraActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/CameraActivity.kt index 29e7d0eb..5a97c8bf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/CameraActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/CameraActivity.kt @@ -39,8 +39,7 @@ class CameraActivity : BaseActivity() { private const val REQUEST_CODE_PERMISSIONS = 10 private val REQUIRED_PERMISSIONS = mutableListOf ( - Manifest.permission.CAMERA, - Manifest.permission.RECORD_AUDIO + Manifest.permission.CAMERA ).apply { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { add(Manifest.permission.WRITE_EXTERNAL_STORAGE) @@ -171,9 +170,9 @@ class CameraActivity : BaseActivity() { override fun onImageSaved(output: ImageCapture.OutputFileResults) { - val msg = "Photo capture succeeded: ${output.savedUri}" - Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() - Timber.d(msg) +// val msg = "Photo capture succeeded: ${output.savedUri}" +// Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() +// Timber.d(msg) val intent = Intent() intent.putExtra(IMAGE_URI, output.savedUri.toString()) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt index 97d40a70..beaf1f39 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt @@ -9,6 +9,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -33,6 +36,7 @@ import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rows.PlayerPropertiesRow import net.pokeranalytics.android.ui.viewmodel.DataManagerViewModel import net.pokeranalytics.android.util.NULL_TEXT +import timber.log.Timber import java.io.File /** @@ -93,6 +97,8 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou _binding = null } + var pickVisualMediaRequest: ActivityResultLauncher? = null + /** * Init UI */ @@ -110,6 +116,16 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou rowRepresentableAdapter.notifyDataSetChanged() onRowSelected(-1, comment) } + + this.pickVisualMediaRequest = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + this.player.picture = uri.toString() + if (uri != null) { + Timber.d("Selected URI: $uri") + } else { + Timber.d("No media selected") + } + rowRepresentableAdapter.refreshRow(PlayerPropertiesRow.IMAGE) + } } override fun getPhotos(files: ArrayList) { @@ -232,7 +248,10 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou // mediaActivity?.takePicture() } // mediaActivity?.openImageCaptureIntent(false) - getString(R.string.library) -> mediaActivity?.openImageGalleryIntent(false) + getString(R.string.library) -> { + pickVisualMediaRequest?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } +// mediaActivity?.openImageGalleryIntent(false) getString(R.string.select_a_color) -> { ColorPickerActivity.newInstanceForResult(this, REQUEST_CODE_PICK_COLOR) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsViewModel.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsViewModel.kt index fcca1b00..fd2909cb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsViewModel.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsViewModel.kt @@ -15,7 +15,7 @@ import timber.log.Timber class FilterDetailsViewModelFactory(var filter: Filter, private var categoryRow: FilterCategoryRow): ViewModelProvider.Factory { - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { return FilterDetailsViewModel(categoryRow, filter) as T } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt index d8981d8c..34888d01 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt @@ -2,10 +2,7 @@ package net.pokeranalytics.android.ui.view import android.content.Context import android.graphics.Color -import android.graphics.ImageDecoder import android.graphics.drawable.GradientDrawable -import android.os.Build -import android.provider.MediaStore import android.util.AttributeSet import android.util.TypedValue import android.view.LayoutInflater @@ -16,7 +13,6 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat.getColor import androidx.core.content.res.ResourcesCompat -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.net.toUri import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.Player @@ -96,41 +92,13 @@ class PlayerImageView : FrameLayout { // Picture player.picture?.let { picture -> - Timber.d("picture = $picture") - - val uri = picture.toUri() - - context?.contentResolver?.let { resolver -> - val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - ImageDecoder.decodeBitmap(ImageDecoder.createSource(resolver, uri)) - } else { - MediaStore.Images.Media.getBitmap(resolver, uri) - } - - val rDrawable = RoundedBitmapDrawableFactory.create(resources, bitmap) - rDrawable.isCircular = true - this.playerImage.setImageDrawable(rDrawable) - - } - -// player.picture?.let { pic -> -// pic.toUri().path?.let { -// val rDrawable = RoundedBitmapDrawableFactory.create(resources, it) -// rDrawable.isCircular = true -// this.playerImage.setImageDrawable(rDrawable) -// } -// -// this.playerImage.setImageURI(uri) -// } - - } ?: run { - + this.playerImage.setImageURI(picture.toUri()) + } ?: run { // no pic this.playerStroke.background = ResourcesCompat.getDrawable(resources, R.drawable.circle_stroke_kaki, null) this.playerImage.setImageDrawable(null) this.playerInitial.text = player.initials this.playerInitial.setTextSize(TypedValue.COMPLEX_UNIT_SP, size.getFontSize()) - } // Player color diff --git a/app/src/main/res/drawable/circle_border.xml b/app/src/main/res/drawable/circle_border.xml new file mode 100644 index 00000000..81d6bc85 --- /dev/null +++ b/app/src/main/res/drawable/circle_border.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_camera.xml b/app/src/main/res/layout/activity_camera.xml index 71504c4b..c76bada2 100644 --- a/app/src/main/res/layout/activity_camera.xml +++ b/app/src/main/res/layout/activity_camera.xml @@ -2,24 +2,27 @@ + android:layout_height="match_parent" + tools:layout_editor_absoluteX="0dp" + tools:layout_editor_absoluteY="0dp" /> -