Merge branch 'master' of gitlab.com:stax-river/poker-analytics

feature/top10
Laurent 7 years ago
commit c70dcfbc8f
  1. 76
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  2. 5
      app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt
  3. 68
      app/src/main/java/net/pokeranalytics/android/ui/helpers/SwipeToDeleteCallback.kt
  4. 17
      app/src/main/res/layout/fragment_data_list.xml
  5. 31
      app/src/main/res/layout/layout_swipe_to_delete.xml
  6. 18
      app/src/main/res/layout/row_title.xml
  7. 1
      app/src/main/res/values/strings.xml

@ -4,11 +4,11 @@ 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 androidx.core.view.isVisible
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar
import io.realm.Realm import io.realm.Realm
import io.realm.RealmObject
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_data_list.* import kotlinx.android.synthetic.main.fragment_data_list.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -19,17 +19,20 @@ import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow
import timber.log.Timber
class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate {
lateinit var dataType: SettingRow private lateinit var dataType: SettingRow
private lateinit var items: RealmResults<*> private lateinit var items: RealmResults<*>
private lateinit var dataListAdapter: RowRepresentableAdapter
private var deletedItem: RealmObject? = null
private var lastDeletedItemPosition: Int = 0
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_data_list, container, false) return inflater.inflate(R.layout.fragment_data_list, container, false)
@ -37,14 +40,12 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
initData()
initUI() initUI()
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
this.recyclerView?.adapter?.notifyDataSetChanged() this.recyclerView?.adapter?.notifyDataSetChanged()
noDataFound.isVisible = items.isEmpty()
} }
override fun rowRepresentableForPosition(position: Int): RowRepresentable? { override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
@ -68,15 +69,11 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
EditableDataActivity.newInstance( EditableDataActivity.newInstance(
requireContext(), requireContext(),
it.ordinal, it.ordinal,
(this.items[position] as Savable).uniqueIdentifier() (row as Savable).uniqueIdentifier()
) )
} }
} }
private fun initData() {
}
/** /**
* Init UI * Init UI
*/ */
@ -91,40 +88,32 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
setHasOptionsMenu(true) setHasOptionsMenu(true)
// Swipe to delete, work in progress val viewManager = LinearLayoutManager(requireContext())
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() { dataListAdapter = RowRepresentableAdapter(this, this)
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position ->
return makeFlag( // Save the delete position & create a copy of the object
ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START or ItemTouchHelper.END val mRecentlyDeletedItem = rowRepresentableForPosition(position)
) lastDeletedItemPosition = position
}
override fun onMove( if (mRecentlyDeletedItem is RealmObject) {
recyclerView: RecyclerView, deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem)
viewHolder: RecyclerView.ViewHolder, getRealm().executeTransaction {
target: RecyclerView.ViewHolder mRecentlyDeletedItem.deleteFromRealm()
): Boolean {
return false
} }
dataListAdapter.notifyItemRemoved(position)
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { showUndoSnackBar()
super.clearView(recyclerView, viewHolder)
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
} }
})
val viewManager = LinearLayoutManager(requireContext()) val itemTouchHelper = ItemTouchHelper(swipeToDelete)
val dataListAdapter = RowRepresentableAdapter(this, this)
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = viewManager layoutManager = viewManager
adapter = dataListAdapter adapter = dataListAdapter
//itemTouchHelper.attachToRecyclerView(this) itemTouchHelper.attachToRecyclerView(this)
} }
this.addButton.setOnClickListener { this.addButton.setOnClickListener {
@ -136,7 +125,23 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
) )
} }
} }
}
/**
* Show undo snack bar
*/
private fun showUndoSnackBar() {
val message = String.format(getString(R.string.data_deleted), this.dataType.localizedTitle(requireContext()))
val snackBar = Snackbar.make(constraintLayout, message, Snackbar.LENGTH_LONG)
snackBar.setAction(R.string.cancel) {
getRealm().executeTransaction {realm ->
deletedItem?.let {
realm.copyToRealm(it)
dataListAdapter.notifyItemInserted(lastDeletedItemPosition)
}
}
}
snackBar.show()
} }
/** /**
@ -144,13 +149,10 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc
*/ */
fun setData(dataType: Int) { fun setData(dataType: Int) {
this.dataType = SettingRow.values()[dataType] this.dataType = SettingRow.values()[dataType]
this.toolbar.title = this.dataType.localizedTitle(requireContext()) this.toolbar.title = this.dataType.localizedTitle(requireContext())
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
this.dataType.relatedResultsRepresentable?.let { this.dataType.relatedResultsRepresentable?.let {
this.items = it.items(realm) this.items = it.items(realm)
noDataFound.isVisible = this.items.isEmpty()
} }
} }
} }

@ -77,6 +77,11 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc
return TextFormat(NULL_TEXT) return TextFormat(NULL_TEXT)
} }
override fun onResume() {
super.onResume()
statsAdapter.notifyDataSetChanged()
}
// Override // Override
override fun sessionsChanged() { override fun sessionsChanged() {

@ -0,0 +1,68 @@
package net.pokeranalytics.android.ui.helpers
import android.graphics.Canvas
import android.view.View
import androidx.core.view.isVisible
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import net.pokeranalytics.android.R
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
/**
* Swipe to delete callback
*/
class SwipeToDeleteCallback(var adapter: RowRepresentableAdapter, var onDelete: ((position: Int) -> Unit)? = null) :
ItemTouchHelper.SimpleCallback(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.START or ItemTouchHelper.END) {
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.adapterPosition
onDelete?.invoke(position)
}
override fun onChildDraw(
c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,
dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean
) {
val foregroundView = viewHolder.itemView.findViewById<View?>(net.pokeranalytics.android.R.id.foreground)
val backgroundView = viewHolder.itemView.findViewById<View?>(net.pokeranalytics.android.R.id.background)
foregroundView?.let {
getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive)
backgroundView?.findViewById<View?>(R.id.leftIcon)?.isVisible = dX > 0
backgroundView?.findViewById<View?>(R.id.rightIcon)?.isVisible = dX < 0
}
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
val foregroundView = viewHolder.itemView.findViewById<View?>(net.pokeranalytics.android.R.id.foreground)
foregroundView?.let {
getDefaultUIUtil().clearView(foregroundView)
}
}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
viewHolder?.let {
val foregroundView = viewHolder.itemView.findViewById<View?>(net.pokeranalytics.android.R.id.foreground)
foregroundView?.let {
getDefaultUIUtil().onSelected(foregroundView)
}
}
}
override fun onChildDrawOver(
c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder?, dX: Float, dY: Float,
actionState: Int, isCurrentlyActive: Boolean
) {
viewHolder?.let {
val foregroundView = viewHolder.itemView.findViewById<View?>(net.pokeranalytics.android.R.id.foreground)
foregroundView?.let {
getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive)
}
}
}
}

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
xmlns:tools="http://schemas.android.com/tools">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView" android:id="@+id/nestedScrollView"
@ -24,30 +24,30 @@
android:layout_height="0dp" android:layout_height="0dp"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingBottom="96dp" android:paddingBottom="96dp"
tools:listitem="@layout/row_title"
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"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/row_title" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/noDataFound" android:id="@+id/noDataFound"
style="@style/PokerAnalyticsTheme.TextView.Header"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
style="@style/PokerAnalyticsTheme.TextView.Header"
android:textSize="24sp"
android:text="@string/no_data_found" android:text="@string/no_data_found"
android:textSize="24sp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"
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"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3" /> app:layout_constraintVertical_bias="0.3"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@ -91,6 +91,7 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:src="@drawable/ic_add" android:src="@drawable/ic_add"
android:tint="@color/black"
app:fabSize="normal" app:fabSize="normal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />

@ -0,0 +1,31 @@
<?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"
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:background="@color/red">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/leftIcon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_outline_delete" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/rightIcon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_outline_delete" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -1,11 +1,19 @@
<?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" <FrameLayout 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" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp">
android:background="?selectableItemBackground">
<include layout="@layout/layout_swipe_to_delete" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/foreground"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/gray_dark"
android:foreground="?selectableItemBackground">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title" android:id="@+id/title"
@ -34,4 +42,6 @@
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintGuide_end="16dp" /> app:layout_constraintGuide_end="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

@ -19,6 +19,7 @@
<string name="hands_played">Hands played</string> <string name="hands_played">Hands played</string>
<string name="address">Address</string> <string name="address">Address</string>
<string name="data_deleted" formatted="false">%s deleted</string>
<!-- <!--

Loading…
Cancel
Save