Improve Player picture management

feature/players
Aurelien Hubert 7 years ago
parent c2f79015bc
commit b1064100a6
  1. 1
      app/src/main/java/net/pokeranalytics/android/model/realm/Player.kt
  2. 27
      app/src/main/java/net/pokeranalytics/android/ui/activity/EditableDataActivity.kt
  3. 76
      app/src/main/java/net/pokeranalytics/android/ui/activity/components/MediaActivity.kt
  4. 13
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/PokerAnalyticsFragment.kt
  5. 1
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt
  6. 92
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/PlayerDataFragment.kt
  7. 107
      app/src/main/java/net/pokeranalytics/android/ui/view/PlayerImageView.kt
  8. 26
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  9. 12
      app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/PlayerRow.kt
  10. 36
      app/src/main/res/layout/row_player_image.xml
  11. 55
      app/src/main/res/layout/view_player_image.xml
  12. 3
      app/src/main/res/xml/provider_paths.xml

@ -74,6 +74,7 @@ open class Player : RealmObject(), NameManageable, Deletable, StaticRowRepresent
when (row) { when (row) {
SimpleRow.NAME -> this.name = value as String? ?: "" SimpleRow.NAME -> this.name = value as String? ?: ""
PlayerRow.SUMMARY -> this.summary = value as String? ?: "" PlayerRow.SUMMARY -> this.summary = value as String? ?: ""
PlayerRow.PLAYER_IMAGE -> this.picture = value as String? ?: ""
} }
} }

@ -6,10 +6,12 @@ import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.MediaActivity
import net.pokeranalytics.android.ui.fragment.data.* import net.pokeranalytics.android.ui.fragment.data.*
import java.io.File
import java.util.*
class EditableDataActivity : PokerAnalyticsActivity() { class EditableDataActivity : MediaActivity() {
enum class IntentKey(val keyName: String) { enum class IntentKey(val keyName: String) {
DATA_TYPE("DATA_TYPE"), DATA_TYPE("DATA_TYPE"),
@ -43,6 +45,8 @@ class EditableDataActivity : PokerAnalyticsActivity() {
} }
private var currentFragment: EditableDataFragment? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_editable_data) setContentView(R.layout.activity_editable_data)
@ -57,9 +61,7 @@ class EditableDataActivity : PokerAnalyticsActivity() {
val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0) val dataType = intent.getIntExtra(IntentKey.DATA_TYPE.keyName, 0)
val primaryKey = intent.getStringExtra(IntentKey.PRIMARY_KEY.keyName) val primaryKey = intent.getStringExtra(IntentKey.PRIMARY_KEY.keyName)
val fragmentManager = supportFragmentManager currentFragment = when (dataType) {
val fragmentTransaction = fragmentManager.beginTransaction()
val fragment: EditableDataFragment = when (dataType) {
LiveData.BANKROLL.ordinal -> BankrollDataFragment() LiveData.BANKROLL.ordinal -> BankrollDataFragment()
LiveData.LOCATION.ordinal -> LocationDataFragment() LiveData.LOCATION.ordinal -> LocationDataFragment()
LiveData.TRANSACTION.ordinal -> TransactionDataFragment() LiveData.TRANSACTION.ordinal -> TransactionDataFragment()
@ -69,9 +71,24 @@ class EditableDataActivity : PokerAnalyticsActivity() {
else -> EditableDataFragment() else -> EditableDataFragment()
} }
currentFragment?.let { fragment ->
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.add(R.id.container, fragment)
fragmentTransaction.commit() fragmentTransaction.commit()
fragment.setData(dataType, primaryKey) fragment.setData(dataType, primaryKey)
} }
} }
override fun isLoadingNewPictures() {
super.isLoadingNewPictures()
currentFragment?.isLoadingNewPhotos()
}
override fun getPictures(files: ArrayList<File>) {
super.getPictures(files)
currentFragment?.getPhotos(files)
}
}

@ -6,14 +6,17 @@ import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.provider.MediaStore
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.pokeranalytics.android.util.ImageUtils import net.pokeranalytics.android.util.ImageUtils
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.IOException
import java.util.* import java.util.*
@ -30,10 +33,6 @@ open class MediaActivity : PokerAnalyticsActivity() {
// Data // Data
private val outputFileUri: Uri? = null
private val maxSampleWidth = 1024
private val maxSampleHeight = 1024
private val resizeImage = true
private var tempFile: File? = null private var tempFile: File? = null
private var mCurrentPhotoPath: String? = null private var mCurrentPhotoPath: String? = null
private var selectedChoice = -1 private var selectedChoice = -1
@ -55,12 +54,20 @@ open class MediaActivity : PokerAnalyticsActivity() {
val filesList = ArrayList<File>() val filesList = ArrayList<File>()
GlobalScope.launch { GlobalScope.launch {
if (data?.clipData != null) {
if (tempFile != null) {
tempFile?.let {
GlobalScope.launch(Dispatchers.Main) {
filesList.add(it)
getPictures(filesList)
}
}
} else if (data?.clipData != null) {
data?.clipData?.let { clipData -> data?.clipData?.let { clipData ->
try { try {
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
isLoadingNewPhotos() isLoadingNewPictures()
} }
for (i in 0 until clipData.itemCount) { for (i in 0 until clipData.itemCount) {
@ -73,7 +80,7 @@ open class MediaActivity : PokerAnalyticsActivity() {
} }
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
getPhotos(filesList) getPictures(filesList)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -85,7 +92,7 @@ open class MediaActivity : PokerAnalyticsActivity() {
try { try {
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
isLoadingNewPhotos() isLoadingNewPictures()
} }
val inputStream = contentResolver.openInputStream(uri) val inputStream = contentResolver.openInputStream(uri)
@ -93,7 +100,7 @@ open class MediaActivity : PokerAnalyticsActivity() {
ImageUtils.copyInputStreamToFile(inputStream!!, photoFile) ImageUtils.copyInputStreamToFile(inputStream!!, photoFile)
filesList.add(photoFile) filesList.add(photoFile)
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
getPhotos(filesList) getPictures(filesList)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -120,8 +127,10 @@ open class MediaActivity : PokerAnalyticsActivity() {
} }
when (selectedChoice) { when (selectedChoice) {
SELECTED_CHOICE_TAKE_PICTURE -> {
openImageCaptureIntent(multiplePictures)
}
SELECTED_CHOICE_SELECT_PICTURE -> { SELECTED_CHOICE_SELECT_PICTURE -> {
Timber.d("openImageGalleryIntent")
openImageGalleryIntent(multiplePictures) openImageGalleryIntent(multiplePictures)
} }
} }
@ -129,6 +138,47 @@ open class MediaActivity : PokerAnalyticsActivity() {
selectedChoice = -1 selectedChoice = -1
} }
/**
* Open the Camera Intent
*/
fun openImageCaptureIntent(multiplePictures: Boolean) {
this.mCurrentPhotoPath = null
this.multiplePictures = multiplePictures
// Test if we have the permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
selectedChoice = 0
askForCameraPermission()
return
}
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(packageManager) != null) {
// Create the File where the photo should go
try {
tempFile = ImageUtils.createImageFile(this)
mCurrentPhotoPath = "file:" + tempFile?.absolutePath
} catch (ex: IOException) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (tempFile != null) {
Timber.d("tempFile: ${tempFile?.absolutePath}")
val photoURI = FileProvider.getUriForFile(
this,
applicationContext.packageName + ".fileprovider", tempFile!!
)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PICTURE)
}
}
}
/** /**
* Open the gallery intent * Open the gallery intent
*/ */
@ -193,7 +243,6 @@ open class MediaActivity : PokerAnalyticsActivity() {
} }
} }
/** /**
* Called when a bitmap is return * Called when a bitmap is return
* *
@ -205,11 +254,12 @@ open class MediaActivity : PokerAnalyticsActivity() {
/** /**
* Called when the user is adding new photos * Called when the user is adding new photos
*/ */
open fun isLoadingNewPhotos() {} open fun isLoadingNewPictures() {}
/** /**
* Called when the user has selected photos * Called when the user has selected photos
*/ */
open fun getPhotos(files: ArrayList<File>) {} open fun getPictures(files: ArrayList<File>) {}
} }

@ -7,11 +7,12 @@ import androidx.fragment.app.Fragment
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity
import java.io.File
open class PokerAnalyticsFragment : Fragment() { open class PokerAnalyticsFragment : Fragment() {
private var loaderDialogFragment: LoaderDialogFragment? = null private var loaderDialogFragment: LoaderDialogFragment? = null
var parentActivity: PokerAnalyticsActivity? = null open var parentActivity: PokerAnalyticsActivity? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -94,4 +95,14 @@ open class PokerAnalyticsFragment : Fragment() {
parentActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(enabled) parentActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(enabled)
} }
/**
* Called when the user is adding new photos
*/
open fun isLoadingNewPhotos() {}
/*
* Called when the user has selected photos
*/
open fun getPhotos(files: ArrayList<File>) {}
} }

@ -16,6 +16,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import java.io.File
open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegate { open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegate {

@ -1,21 +1,23 @@
package net.pokeranalytics.android.ui.fragment.data package net.pokeranalytics.android.ui.fragment.data
import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.model.realm.Player
import net.pokeranalytics.android.ui.activity.components.MediaActivity
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource
import net.pokeranalytics.android.ui.extensions.toast
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.PlayerRow import net.pokeranalytics.android.ui.view.rowrepresentable.PlayerRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow
import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.NULL_TEXT
import java.util.* import java.io.File
/** /**
* Player data fragment * Player data fragment
@ -27,18 +29,28 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou
return this.item as Player return this.item as Player
} }
private var mediaActivity: MediaActivity? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_player, container, false) return inflater.inflate(R.layout.fragment_player, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initUI() initUI()
} }
override fun getPhotos(files: ArrayList<File>) {
super.getPhotos(files)
files.firstOrNull()?.let { picture ->
player.updateValue(picture.absolutePath, PlayerRow.PLAYER_IMAGE)
rowRepresentableAdapter.refreshRow(PlayerRow.PLAYER_IMAGE)
}
}
override fun getDataSource(): RowRepresentableDataSource { override fun getDataSource(): RowRepresentableDataSource {
return this return this
} }
@ -47,23 +59,22 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou
return player.adapterRows() return player.adapterRows()
} }
override fun stringForRow(row: RowRepresentable): String { override fun viewTypeForPosition(position: Int): Int {
return when (row) { return when (position) {
PlayerRow.PLAYER_IMAGE -> { 0 -> RowViewType.ROW_PLAYER_IMAGE.ordinal
if (player.name.isNotEmpty()) { else -> super.viewTypeForPosition(position)
val playerData = player.name.split(" ") }
if (playerData.size > 1) {
playerData[0].first().toString() + playerData[1].first().toString()
} else if (player.name.length > 1) {
player.name.substring(0, 2)
} else {
player.name.substring(0, player.name.length)
} }
} else {
NULL_TEXT override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
return when (position) {
0 -> player
else -> super.rowRepresentableForPosition(position)
} }
} }
override fun stringForRow(row: RowRepresentable): String {
return when (row) {
SimpleRow.NAME -> if (player.name.isNotEmpty()) player.name else NULL_TEXT SimpleRow.NAME -> if (player.name.isNotEmpty()) player.name else NULL_TEXT
PlayerRow.SUMMARY -> if (player.summary.isNotEmpty()) player.summary else NULL_TEXT PlayerRow.SUMMARY -> if (player.summary.isNotEmpty()) player.summary else NULL_TEXT
else -> super.stringForRow(row) else -> super.stringForRow(row)
@ -81,16 +92,14 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
when (row) { when (row) {
PlayerRow.PLAYER_IMAGE -> { PlayerRow.PLAYER_IMAGE -> {
toast("Yo.") openPictureDialog()
} }
PlayerRow.SUMMARY -> { PlayerRow.SUMMARY -> {
val data = editDescriptors(row) val data = editDescriptors(row)
BottomSheetFragment.create(fragmentManager, row, this, data, isClearable = false, isDeletable = true) BottomSheetFragment.create(fragmentManager, row, this, data, isClearable = false, isDeletable = true)
} }
SimpleRow.NAME -> super.onRowSelected(position, row, fromAction) SimpleRow.NAME -> super.onRowSelected(position, row, fromAction)
} }
} }
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { override fun onRowValueChanged(value: Any?, row: RowRepresentable) {
@ -100,39 +109,38 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou
} }
} }
override fun onRowDeleted(row: RowRepresentable) {
super.onRowDeleted(row)
}
/** /**
* Init UI * Init UI
*/ */
private fun initUI() { private fun initUI() {
/* mediaActivity = parentActivity as MediaActivity?
customField.updateRowRepresentation()
bottomBar.translationY = 72f.px
bottomBar.visibility = View.VISIBLE
*/
/*
addItem.setOnClickListener {
val customFieldEntry = player.addEntry()
rowRepresentableAdapter.notifyDataSetChanged()
onRowSelected(-1, customFieldEntry)
} }
/**
* Open picture dialog
*/ */
private fun openPictureDialog() {
val builder = AlertDialog.Builder(requireContext())
val placesArray = ArrayList<CharSequence>()
placesArray.add(getString(R.string.take_a_picture))
placesArray.add(getString(R.string.library))
placesArray.add(getString(R.string.select_a_color))
/* if (player.picture != null) {
updateUI() placesArray.add(getString(R.string.remove_picture))
rowRepresentableAdapter.notifyDataSetChanged() }
if (!this.deleteButtonShouldAppear) { builder.setItems(placesArray.toTypedArray()) { dialog, which ->
rowRepresentableForPosition(0)?.let { when (which) {
onRowSelected(0, it) 0 -> mediaActivity?.openImageCaptureIntent(false)
1 -> mediaActivity?.openImageGalleryIntent(false)
2 -> {
} }
3 -> player.updateValue(null, PlayerRow.PLAYER_IMAGE)
} }
*/ }
builder.show()
} }
} }

@ -0,0 +1,107 @@
package net.pokeranalytics.android.ui.view
import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.res.ResourcesCompat
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade
import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.view_player_image.view.*
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Player
import net.pokeranalytics.android.ui.extensions.px
import net.pokeranalytics.android.util.NULL_TEXT
/**
* Display a row session
*/
class PlayerImageView : FrameLayout {
private lateinit var playerImageView: ConstraintLayout
private var onImageClickListener: OnClickListener? = null
/**
* Constructors
*/
constructor(context: Context) : super(context) {
init()
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
init()
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init()
}
/**
* Init
*/
private fun init() {
val layoutInflater = LayoutInflater.from(context)
playerImageView = layoutInflater.inflate(R.layout.view_player_image, this, false) as ConstraintLayout
val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
addView(playerImageView, layoutParams)
}
/**
* Set the session data to the view
*/
fun setPlayer(player: Player) {
// Initial
val playerInitial = if (player.name.isNotEmpty()) {
val playerData = player.name.split(" ")
if (playerData.size > 1) {
playerData[0].first().toString() + playerData[1].first().toString()
} else if (player.name.length > 1) {
player.name.substring(0, 2)
} else {
player.name.substring(0, player.name.length)
}
} else {
NULL_TEXT
}
playerImageView.playerInitial.text = playerInitial
// Picture
if (player.picture != null && player.picture?.isNotEmpty() == true) {
playerImageView.playerStroke.background = null
Glide.with(this)
.load(player.picture)
.apply(RequestOptions().circleCrop())
.transition(withCrossFade())
.into(playerImageView.playerImage)
} else {
playerImageView.playerStroke.background = ResourcesCompat.getDrawable(resources, R.drawable.circle_stroke_kaki, null)
}
// Stroke
player.color?.let {
val drawable = playerImageView.playerStroke.background as GradientDrawable?
drawable?.setStroke(4.px, it)
}
// Click listener
playerImageView.playerImageSelection.setOnClickListener {
onImageClickListener?.onClick(it)
}
}
/**
* Set image click listener
*/
fun setOnImageClickListener(onImageClickListener: OnClickListener) {
this.onImageClickListener = onImageClickListener
}
}

@ -27,6 +27,7 @@ import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.bankroll.BankrollReport import net.pokeranalytics.android.calculus.bankroll.BankrollReport
import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Player
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
@ -518,32 +519,17 @@ enum class RowViewType(private var layoutRes: Int) {
} }
/** /**
* Display a transaction view * Display a player image view
*/ */
inner class RowPlayerImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { inner class RowPlayerImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) {
itemView.findViewById<PlayerImageView>(R.id.playerImageView)?.let { playerImageView ->
itemView.findViewById<AppCompatTextView?>(R.id.playerInitial)?.let { textView ->
textView.text = adapter.dataSource.stringForRow(row)
}
itemView.findViewById<AppCompatImageView?>(R.id.playerImage)?.let { imageView ->
}
itemView.findViewById<AppCompatImageView?>(R.id.playerImageSelection)?.let { imageView ->
val listener = View.OnClickListener { val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row) adapter.delegate?.onRowSelected(position, PlayerRow.PLAYER_IMAGE)
} }
imageView.setOnClickListener(listener) playerImageView.setPlayer(row as Player)
playerImageView.setOnImageClickListener(listener)
} }
/*
itemView.transactionRow.setData(row as Transaction)
val listener = View.OnClickListener {
adapter.delegate?.onRowSelected(position, row)
}
itemView.transactionRow.setOnClickListener(listener)
*/
} }
} }

@ -13,18 +13,6 @@ enum class PlayerRow : RowRepresentable {
PLAYER_IMAGE, PLAYER_IMAGE,
SUMMARY; SUMMARY;
companion object {
/**
* Return the report rows
*/
fun getRows(): ArrayList<RowRepresentable> {
val rows = ArrayList<RowRepresentable>()
rows.addAll(values())
return rows
}
}
override val resId: Int? override val resId: Int?
get() { get() {
return when (this) { return when (this) {

@ -1,43 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/gray_dark" android:background="@color/gray_dark"
android:foreground="?selectableItemBackground"> android:foreground="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView <net.pokeranalytics.android.ui.view.PlayerImageView
android:id="@+id/playerInitial" android:id="@+id/playerImageView"
style="@style/PokerAnalyticsTheme.TextView.Player" android:layout_width="128dp"
android:layout_width="96dp" android:layout_height="128dp"
android:layout_height="96dp"
android:layout_margin="16dp" android:layout_margin="16dp"
android:background="?selectableItemBackgroundBorderless" android:background="@android:color/transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="AH" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/playerImage"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_margin="16dp"
android:background="?selectableItemBackgroundBorderless"
android:foreground="@drawable/circle_stroke_kaki"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/playerImageSelection"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_margin="16dp"
android:background="?selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/playerInitial"
style="@style/PokerAnalyticsTheme.TextView.Player"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="AH" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/playerImage"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/playerStroke"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="1:1"
android:background="@drawable/circle_stroke_kaki"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/playerImageSelection"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintWidth_percent="0.7"
app:layout_constraintHeight_percent="0.7"
android:background="?selectableItemBackgroundBorderless"
android:elevation="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -3,4 +3,7 @@
<files-path <files-path
name="files" name="files"
path="." /> path="." />
<external-path name="external_files" path="."/>
</paths> </paths>
Loading…
Cancel
Save