From a1a4f323028a2947e84cec62192484ffe3458bb9 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 22 Feb 2019 08:58:31 +0100 Subject: [PATCH 01/18] Fix LiveDataAdapter --- .../ui/adapter/components/LiveDataAdapter.kt | 34 ++++++++++++++----- .../bottomsheet/BottomSheetListFragment.kt | 3 +- .../BottomSheetListGameFragment.kt | 3 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt index 2528a469..5cb5cbfe 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/components/LiveDataAdapter.kt @@ -9,6 +9,11 @@ import androidx.recyclerview.widget.RecyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.view.RowViewType +enum class LiveDataViewType { + DATA, + BOTTOM_SHEET_DATA +} + interface LiveDataDataSource { val title: String val primaryKey: String @@ -20,17 +25,20 @@ interface LiveDataDelegate { fun size() : Int } -class LiveDataAdapter(var adapterDelegate: LiveDataDelegate, var layout: Int? = null) : RecyclerView.Adapter() { +class LiveDataAdapter(var adapterDelegate: LiveDataDelegate, var liveDataViewType: LiveDataViewType? = LiveDataViewType.DATA) : RecyclerView.Adapter() { inner class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(row: LiveDataDataSource, listener: View.OnClickListener) { - try { - itemView.findViewById(R.id.title).text = row.title - itemView.findViewById(R.id.container).setOnClickListener(listener) - } catch (e: Exception) { - e.printStackTrace() + when(liveDataViewType) { + LiveDataViewType.DATA -> { + itemView.findViewById(R.id.rowTitle_title).text = row.title + itemView.findViewById(R.id.rowTitle_container).setOnClickListener(listener) + } + LiveDataViewType.BOTTOM_SHEET_DATA -> { + itemView.findViewById(R.id.title).text = row.title + itemView.findViewById(R.id.container).setOnClickListener(listener) + } } - } } @@ -39,8 +47,16 @@ class LiveDataAdapter(var adapterDelegate: LiveDataDelegate, var layout: Int? = } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val layoutToInflate = layout ?: R.layout.row_title - return DataViewHolder(LayoutInflater.from(parent.context).inflate(layoutToInflate, parent, false)) + val layoutToInflate = when(liveDataViewType) { + LiveDataViewType.DATA -> { + R.layout.row_title + } + LiveDataViewType.BOTTOM_SHEET_DATA -> { + R.layout.row_bottom_sheet_title + } + else -> R.layout.row_title + } + return DataViewHolder(LayoutInflater.from(parent.context).inflate(layoutToInflate, parent, false)) } override fun getItemCount(): Int { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt index 7f083f62..2131c53e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt @@ -12,6 +12,7 @@ import net.pokeranalytics.android.model.realm.Game import net.pokeranalytics.android.ui.adapter.components.LiveDataAdapter import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource import net.pokeranalytics.android.ui.adapter.components.LiveDataDelegate +import net.pokeranalytics.android.ui.adapter.components.LiveDataViewType class BottomSheetListFragment : BottomSheetFragment(), LiveDataDelegate { @@ -69,7 +70,7 @@ class BottomSheetListFragment : BottomSheetFragment(), LiveDataDelegate { LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_list, view?.bottomSheetContainer, true) val viewManager = LinearLayoutManager(requireContext()) - dataAdapter = LiveDataAdapter(this, R.layout.row_bottom_sheet_title) + dataAdapter = LiveDataAdapter(this, LiveDataViewType.BOTTOM_SHEET_DATA) reyclerView.apply { setHasFixedSize(true) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index 08fcce2d..f97672fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -13,6 +13,7 @@ import net.pokeranalytics.android.ui.adapter.LimitTypesAdapter import net.pokeranalytics.android.ui.adapter.components.LiveDataAdapter import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource import net.pokeranalytics.android.ui.adapter.components.LiveDataDelegate +import net.pokeranalytics.android.ui.adapter.components.LiveDataViewType import timber.log.Timber @@ -90,7 +91,7 @@ class BottomSheetListGameFragment : BottomSheetFragment(), LiveDataDelegate { val viewManager2 = LinearLayoutManager(requireContext()) - dataAdapter = LiveDataAdapter(this, R.layout.row_bottom_sheet_title) + dataAdapter = LiveDataAdapter(this, LiveDataViewType.BOTTOM_SHEET_DATA) recyclerView2.apply { setHasFixedSize(true) From 1beed62fcf94d02ba8a682248b918dd032b5467c Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Fri, 22 Feb 2019 09:41:14 +0100 Subject: [PATCH 02/18] Improve editable data UI --- .../ui/fragment/EditableDataFragment.kt | 115 +++++++++++------- .../res/layout/fragment_editable_data.xml | 87 ++++++------- app/src/main/res/menu/editable_data.xml | 17 +++ app/src/main/res/values/styles.xml | 13 +- 4 files changed, 138 insertions(+), 94 deletions(-) create mode 100644 app/src/main/res/menu/editable_data.xml diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 62e25c8f..27c2dcc4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -1,10 +1,7 @@ package net.pokeranalytics.android.ui.fragment -import android.content.DialogInterface import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager @@ -15,7 +12,10 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.ObjectSavable import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.adapter.components.* +import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableAdapter +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDelegate import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetDelegate import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment @@ -25,9 +25,10 @@ import timber.log.Timber class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate { - private lateinit var item: RealmObject + private lateinit var item: RealmObject private lateinit var liveDataType: LiveData private lateinit var rowRepresentableAdapter: RowRepresentableAdapter + private var editableMenu: Menu? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_editable_data, container, false) @@ -39,6 +40,22 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, initUI() } + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + inflater?.inflate(R.menu.editable_data, menu) + this.editableMenu = menu + updateMenuUI() + super.onCreateOptionsMenu(menu, inflater) + } + + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.save -> saveData() + R.id.delete -> deleteData() + } + return true + } + override fun onRowSelected(row: RowRepresentable) { BottomSheetFragment.create(fragmentManager, row, this, (this.item as RowEditable).getBottomSheetData(row)) } @@ -74,6 +91,7 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, val activity = activity as PokerAnalyticsActivity activity.setSupportActionBar(toolbar) activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) val viewManager = LinearLayoutManager(requireContext()) @@ -81,49 +99,60 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, setHasFixedSize(true) layoutManager = viewManager } + } + + /** + * Update menu UI + */ + private fun updateMenuUI() { + editableMenu?.findItem(R.id.delete)?.isVisible = item.isManaged + editableMenu?.findItem(R.id.save)?.isVisible = true + } + + /** + * Save data + */ + private fun saveData() { + if ((this.item as ObjectSavable).isValidForSave()) { + this.getRealm().executeTransaction { + it.copyToRealmOrUpdate(this.item) + } + activity?.finish() + } else { + val builder = AlertDialog.Builder(requireContext()) + .setMessage(R.string.empty_name_for_br_error) + .setNegativeButton(R.string.ok, null) + builder.show() + } - this.saveButton.text = this.saveButton.context.getString(R.string.save) - this.saveButton.setOnClickListener { + } - if ((this.item as ObjectSavable).isValidForSave()) { - this.getRealm().executeTransaction { - it.copyToRealmOrUpdate(this.item) + /** + * Delete data + */ + private fun deleteData() { + + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle(R.string.warning) + .setMessage(R.string.are_you_sure_you_want_to_do_that_) + .setNegativeButton(R.string.no, null) + .setPositiveButton(R.string.yes) { dialog, id -> + if (this.item.isManaged) { + Toast.makeText(requireContext(), "isManaged", Toast.LENGTH_SHORT).show() + Timber.d("is managed") + this.getRealm().executeTransaction { + this.liveDataType.deleteData(it, (this.item as LiveDataDataSource)) + } + } else { + Toast.makeText(requireContext(), "isNotManaged", Toast.LENGTH_SHORT).show() + Timber.d("is not managed") } this.activity?.let { it.finish() } - } else { - val builder = AlertDialog.Builder(it.context) - .setMessage(R.string.empty_name_for_br_error) - .setNegativeButton(R.string.ok, null) - builder.show() } - } + builder.show() - this.deleteButton.text = this.deleteButton.context.getString(R.string.delete) - this.deleteButton.setOnClickListener { - val builder = AlertDialog.Builder(it.context) - builder.setTitle(R.string.warning) - .setMessage(R.string.are_you_sure_you_want_to_do_that_) - .setNeutralButton(R.string.no, null) - .setNegativeButton(R.string.yes, DialogInterface.OnClickListener { dialog, id -> - - if (this.item.isManaged) { - Toast.makeText(requireContext(), "isManaged", Toast.LENGTH_SHORT).show() - Timber.d("is managed") - this.getRealm().executeTransaction { - this.liveDataType.deleteData(it, (this.item as LiveDataDataSource)) - } - } else { - Toast.makeText(requireContext(), "isNotManaged", Toast.LENGTH_SHORT).show() - Timber.d("is not managed") - } - this.activity?.let { - it.finish() - } - }) - builder.show() - } } /** @@ -131,8 +160,8 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, */ fun setData(dataType: Int, primaryKey: String?) { this.liveDataType = LiveData.values()[dataType] - var proxyItem : RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) - proxyItem?.let { + var proxyItem: RealmObject? = this.liveDataType.getData(this.getRealm(), primaryKey) + proxyItem?.let { this.appBar.toolbar.title = "Update ${this.liveDataType.name.toLowerCase().capitalize()}" } ?: run { this.appBar.toolbar.title = "New ${this.liveDataType.name.toLowerCase().capitalize()}" diff --git a/app/src/main/res/layout/fragment_editable_data.xml b/app/src/main/res/layout/fragment_editable_data.xml index ed7b8bf4..bab049a9 100644 --- a/app/src/main/res/layout/fragment_editable_data.xml +++ b/app/src/main/res/layout/fragment_editable_data.xml @@ -1,74 +1,61 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent"> + android:id="@+id/nestedScrollView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fillViewport="true" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + android:layout_width="match_parent" + android:layout_height="wrap_content"> + android:id="@+id/recyclerView" + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:id="@+id/appBar" + android:layout_width="match_parent" + android:layout_height="128dp" + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> + android:id="@+id/collapsingToolbar" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:collapsedTitleTextAppearance="@style/PokerAnalyticsTheme.Toolbar.CollapsedTitleAppearance" + app:contentScrim="?attr/colorPrimary" + app:expandedTitleGravity="bottom" + app:expandedTitleMarginStart="72dp" + app:expandedTitleTextAppearance="@style/PokerAnalyticsTheme.Toolbar.ExpandedTitleAppearance" + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + app:layout_collapseMode="pin" + app:title="Poker Analytics" + app:titleTextColor="@color/white" /> -