From 84702e202adbf8da828c5e83455bf21b61b060d2 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Wed, 20 Feb 2019 12:51:26 +0100 Subject: [PATCH 1/4] Working on Session UI --- .../model/extensions/SessionExtensions.kt | 32 ++++++++++++++ .../android/model/realm/Session.kt | 4 +- .../android/ui/fragment/SessionFragment.kt | 39 ++++++++++++++--- .../pokeranalytics/android/util/Extensions.kt | 14 +++++++ .../{ic_add_white_24dp.xml => ic_add.xml} | 0 .../{ic_check_white_24dp.xml => ic_check.xml} | 0 .../{ic_close_white_24dp.xml => ic_close.xml} | 0 .../{ic_close_24dp.xml => ic_close_black.xml} | 0 .../res/drawable/ic_dashboard_black_24dp.xml | 9 ---- .../res/drawable/ic_delete_white_24dp.xml | 5 --- .../main/res/drawable/ic_home_black_24dp.xml | 9 ---- ...ns_black_24dp.xml => ic_notifications.xml} | 2 +- .../res/drawable/ic_outline_chart_bar.xml | 2 +- .../res/drawable/ic_outline_chart_show.xml | 2 +- .../main/res/drawable/ic_outline_delete.xml | 9 ++++ .../res/drawable/ic_outline_filter_list.xml | 2 +- .../main/res/drawable/ic_outline_history.xml | 2 +- .../main/res/drawable/ic_outline_pause.xml | 2 +- app/src/main/res/drawable/ic_outline_play.xml | 2 +- .../main/res/drawable/ic_outline_restart.xml | 9 ++++ .../main/res/drawable/ic_outline_settings.xml | 2 +- app/src/main/res/drawable/ic_outline_sort.xml | 2 +- app/src/main/res/drawable/ic_outline_stop.xml | 2 +- .../main/res/layout/fragment_data_list.xml | 2 +- ...t_new_session.xml => fragment_session.xml} | 21 ++++++++-- app/src/main/res/layout/row_session_view.xml | 42 +++++++++---------- .../res/layout/row_title_value_action.xml | 2 +- app/src/main/res/menu/bottom_sheet_menu.xml | 6 +-- .../main/res/menu/session_bottom_app_bar.xml | 10 +++++ app/src/main/res/menu/session_toolbar.xml | 17 ++++++++ app/src/main/res/values/styles.xml | 5 +++ 31 files changed, 187 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt rename app/src/main/res/drawable/{ic_add_white_24dp.xml => ic_add.xml} (100%) rename app/src/main/res/drawable/{ic_check_white_24dp.xml => ic_check.xml} (100%) rename app/src/main/res/drawable/{ic_close_white_24dp.xml => ic_close.xml} (100%) rename app/src/main/res/drawable/{ic_close_24dp.xml => ic_close_black.xml} (100%) delete mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_delete_white_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml rename app/src/main/res/drawable/{ic_notifications_black_24dp.xml => ic_notifications.xml} (91%) create mode 100644 app/src/main/res/drawable/ic_outline_delete.xml create mode 100644 app/src/main/res/drawable/ic_outline_restart.xml rename app/src/main/res/layout/{fragment_new_session.xml => fragment_session.xml} (78%) create mode 100644 app/src/main/res/menu/session_bottom_app_bar.xml create mode 100644 app/src/main/res/menu/session_toolbar.xml diff --git a/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt new file mode 100644 index 00000000..11c1ef4d --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/extensions/SessionExtensions.kt @@ -0,0 +1,32 @@ +package net.pokeranalytics.android.model.extensions + +import net.pokeranalytics.android.model.realm.Session +import java.util.* + +enum class SessionState { + PENDING, + STARTED, + PAUSED, + FINISHED, + INVALID; +} + +/** + * Return the current state of a session + * For example: STARTED, PAUSED, FINISHED + */ +fun Session.getState(): SessionState { + val endDate = timeFrame?.endDate + timeFrame?.startDate?.let {startDate -> + if (startDate > Date()) { + return SessionState.PENDING + } else if (endDate != null) { + return SessionState.FINISHED + } else if (isPaused) { + return SessionState.PAUSED + } else { + return SessionState.STARTED + } + } + return SessionState.INVALID +} diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index fe14b6e2..fc52bde3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -88,6 +88,8 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource // The features of the tournament, like Knockout, Shootout, Turbo... var tournamentFeatures: RealmList = RealmList() + var isPaused: Boolean = false + companion object { fun newInstance(): Session { @@ -159,7 +161,7 @@ open class Session : RealmObject(), SessionInterface, RowRepresentableDataSource override fun actionIconForRow(row: RowRepresentable): Int? { return when (row) { SessionRow.START_DATE, SessionRow.END_DATE -> { - R.drawable.ic_close_white_24dp + R.drawable.ic_close } else -> null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt index c89e6e56..84fefb5f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SessionFragment.kt @@ -1,13 +1,11 @@ package net.pokeranalytics.android.ui.fragment 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.recyclerview.widget.LinearLayoutManager import io.realm.kotlin.where -import kotlinx.android.synthetic.main.fragment_new_session.* +import kotlinx.android.synthetic.main.fragment_session.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Session @@ -21,6 +19,7 @@ import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheet import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.SessionRow +import net.pokeranalytics.android.util.toast import java.util.* class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, BottomSheetDelegate { @@ -29,7 +28,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott private lateinit var sessionAdapter : RowRepresentableAdapter override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_new_session, container, false) + return inflater.inflate(R.layout.fragment_session, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -37,6 +36,20 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott initUI() } + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + inflater?.inflate(R.menu.session_toolbar, menu) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.restart -> toast("Restard is clicked!") + R.id.delete -> toast("Delete is clicked!") + } + return true + } + + override fun onRowSelected(row: RowRepresentable) { val data = currentSession.getBottomSheetData(row) when (row) { @@ -86,6 +99,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott val activity = activity as PokerAnalyticsActivity activity.setSupportActionBar(toolbar) activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) val viewManager = LinearLayoutManager(requireContext()) @@ -94,6 +108,21 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott layoutManager = viewManager } + bottomAppBar.inflateMenu(R.menu.session_bottom_app_bar) + bottomAppBar.menu.findItem(R.id.stop).isVisible = false + + bottomAppBar.setOnMenuItemClickListener { item -> + when(item.itemId) { + R.id.stop -> toast("Stop is clicked!") + } + false + } + + floatingActionButton.setOnClickListener { + floatingActionButton.setImageResource(R.drawable.ic_outline_pause) + bottomAppBar.menu.findItem(R.id.stop).isVisible = true + } + } /** diff --git a/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt b/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt index 07b21294..b931034e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Extensions.kt @@ -1,5 +1,8 @@ package net.pokeranalytics.android.util +import android.widget.Toast +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import java.text.DateFormat import java.util.* @@ -18,4 +21,15 @@ fun Date.medium(): String { fun Date.full(): String { return DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(this) +} + + +// Toast + +fun PokerAnalyticsActivity.toast(message: String) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() +} + +fun PokerAnalyticsFragment.toast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_add_white_24dp.xml rename to app/src/main/res/drawable/ic_add.xml diff --git a/app/src/main/res/drawable/ic_check_white_24dp.xml b/app/src/main/res/drawable/ic_check.xml similarity index 100% rename from app/src/main/res/drawable/ic_check_white_24dp.xml rename to app/src/main/res/drawable/ic_check.xml diff --git a/app/src/main/res/drawable/ic_close_white_24dp.xml b/app/src/main/res/drawable/ic_close.xml similarity index 100% rename from app/src/main/res/drawable/ic_close_white_24dp.xml rename to app/src/main/res/drawable/ic_close.xml diff --git a/app/src/main/res/drawable/ic_close_24dp.xml b/app/src/main/res/drawable/ic_close_black.xml similarity index 100% rename from app/src/main/res/drawable/ic_close_24dp.xml rename to app/src/main/res/drawable/ic_close_black.xml diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml deleted file mode 100644 index 85b70f19..00000000 --- a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_delete_white_24dp.xml b/app/src/main/res/drawable/ic_delete_white_24dp.xml deleted file mode 100644 index 8bed121a..00000000 --- a/app/src/main/res/drawable/ic_delete_white_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml deleted file mode 100644 index de832bb2..00000000 --- a/app/src/main/res/drawable/ic_home_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications.xml similarity index 91% rename from app/src/main/res/drawable/ic_notifications_black_24dp.xml rename to app/src/main/res/drawable/ic_notifications.xml index fa1d5fe0..cebca454 100644 --- a/app/src/main/res/drawable/ic_notifications_black_24dp.xml +++ b/app/src/main/res/drawable/ic_notifications.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_outline_chart_bar.xml b/app/src/main/res/drawable/ic_outline_chart_bar.xml index bfc0c1e8..b1c1d2f4 100644 --- a/app/src/main/res/drawable/ic_outline_chart_bar.xml +++ b/app/src/main/res/drawable/ic_outline_chart_bar.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_chart_show.xml b/app/src/main/res/drawable/ic_outline_chart_show.xml index 9a7f2079..0d4f8c3f 100644 --- a/app/src/main/res/drawable/ic_outline_chart_show.xml +++ b/app/src/main/res/drawable/ic_outline_chart_show.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_delete.xml b/app/src/main/res/drawable/ic_outline_delete.xml new file mode 100644 index 00000000..2ca348f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_outline_filter_list.xml b/app/src/main/res/drawable/ic_outline_filter_list.xml index 5959f25e..c349e010 100644 --- a/app/src/main/res/drawable/ic_outline_filter_list.xml +++ b/app/src/main/res/drawable/ic_outline_filter_list.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_history.xml b/app/src/main/res/drawable/ic_outline_history.xml index c1caa0b0..2de7cb47 100644 --- a/app/src/main/res/drawable/ic_outline_history.xml +++ b/app/src/main/res/drawable/ic_outline_history.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_pause.xml b/app/src/main/res/drawable/ic_outline_pause.xml index ed500a75..d62dc651 100644 --- a/app/src/main/res/drawable/ic_outline_pause.xml +++ b/app/src/main/res/drawable/ic_outline_pause.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_play.xml b/app/src/main/res/drawable/ic_outline_play.xml index a5a83b07..e60f917c 100644 --- a/app/src/main/res/drawable/ic_outline_play.xml +++ b/app/src/main/res/drawable/ic_outline_play.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_restart.xml b/app/src/main/res/drawable/ic_outline_restart.xml new file mode 100644 index 00000000..1fb063df --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_restart.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_outline_settings.xml b/app/src/main/res/drawable/ic_outline_settings.xml index e1fb6a23..364c03b7 100644 --- a/app/src/main/res/drawable/ic_outline_settings.xml +++ b/app/src/main/res/drawable/ic_outline_settings.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_sort.xml b/app/src/main/res/drawable/ic_outline_sort.xml index 26453725..ac6dbe47 100644 --- a/app/src/main/res/drawable/ic_outline_sort.xml +++ b/app/src/main/res/drawable/ic_outline_sort.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_outline_stop.xml b/app/src/main/res/drawable/ic_outline_stop.xml index 5074c18d..28ec1ce3 100644 --- a/app/src/main/res/drawable/ic_outline_stop.xml +++ b/app/src/main/res/drawable/ic_outline_stop.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/layout/fragment_data_list.xml b/app/src/main/res/layout/fragment_data_list.xml index 49a6b1a3..c2fd9428 100644 --- a/app/src/main/res/layout/fragment_data_list.xml +++ b/app/src/main/res/layout/fragment_data_list.xml @@ -33,7 +33,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" - android:src="@drawable/ic_add_white_24dp" + android:src="@drawable/ic_add" app:fabSize="normal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/fragment_new_session.xml b/app/src/main/res/layout/fragment_session.xml similarity index 78% rename from app/src/main/res/layout/fragment_new_session.xml rename to app/src/main/res/layout/fragment_session.xml index 8fb00aa2..87e604d0 100644 --- a/app/src/main/res/layout/fragment_new_session.xml +++ b/app/src/main/res/layout/fragment_session.xml @@ -38,23 +38,38 @@ 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:collapsedTitleTextAppearance="@style/PokerAnalyticsTheme.Toolbar.CollapsedTitleAppearance" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> + tools:title="Poker Analytics" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_session_view.xml b/app/src/main/res/layout/row_session_view.xml index 18852686..4927b945 100644 --- a/app/src/main/res/layout/row_session_view.xml +++ b/app/src/main/res/layout/row_session_view.xml @@ -1,25 +1,25 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/layout/row_title_value_action.xml b/app/src/main/res/layout/row_title_value_action.xml index 08e8dd96..b27e805d 100644 --- a/app/src/main/res/layout/row_title_value_action.xml +++ b/app/src/main/res/layout/row_title_value_action.xml @@ -49,6 +49,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@+id/value" - tools:src="@drawable/ic_close_white_24dp" /> + tools:src="@drawable/ic_close" /> \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_sheet_menu.xml b/app/src/main/res/menu/bottom_sheet_menu.xml index 6aa51726..b5839213 100644 --- a/app/src/main/res/menu/bottom_sheet_menu.xml +++ b/app/src/main/res/menu/bottom_sheet_menu.xml @@ -6,17 +6,17 @@ android:id="@+id/actionClear" android:orderInCategory="100" android:title="@string/clear" - android:icon="@drawable/ic_close_white_24dp" + android:icon="@drawable/ic_close" app:showAsAction="always" /> diff --git a/app/src/main/res/menu/session_bottom_app_bar.xml b/app/src/main/res/menu/session_bottom_app_bar.xml new file mode 100644 index 00000000..cab573d5 --- /dev/null +++ b/app/src/main/res/menu/session_bottom_app_bar.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/session_toolbar.xml b/app/src/main/res/menu/session_toolbar.xml new file mode 100644 index 00000000..9f9c815e --- /dev/null +++ b/app/src/main/res/menu/session_toolbar.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ee032d16..80454a2d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -34,6 +34,7 @@ @color/white @style/PokerAnalyticsTheme.Toolbar.TitleAppearance + + From 8f74cffd74ddee3d7a2b4b8b2306c6dd671c6453 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Wed, 20 Feb 2019 18:00:16 +0100 Subject: [PATCH 2/4] add save and delete management on objects from settings --- .../pokeranalytics/android/model/LiveData.kt | 46 ++++++++++-- .../android/model/realm/Bankroll.kt | 3 +- .../android/model/realm/Game.kt | 10 ++- .../ui/fragment/EditableDataFragment.kt | 47 +++++++++++-- .../android/ui/view/RowRepresentable.kt | 70 +++++++++++++++---- .../res/layout/fragment_editable_data.xml | 20 +++++- app/src/main/res/values/strings.xml | 2 + 7 files changed, 167 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index f54b5fd8..7bb063cf 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -4,14 +4,25 @@ import io.realm.Realm import io.realm.RealmObject import io.realm.RealmResults import io.realm.Sort +import net.pokeranalytics.android.R import net.pokeranalytics.android.model.realm.* -import java.util.* +import net.pokeranalytics.android.ui.view.Localizable -enum class LiveData { +/** + * An interface to easily handle the validity of any object we want to save + */ +interface ObjectSavable { + fun isSavable(): Boolean { return true } +} + +/** + * An enum managing the business objects related to a realm results + */ +enum class LiveData : Localizable { BANKROLL, GAME, LOCATION, - TOURNAMENT_TYPE, + TOURNAMENT_FEATURE, TRANSACTION_TYPE; fun items(realm: Realm, fieldName: String? = null, sortOrder: Sort? = null): RealmResults<*> { @@ -28,11 +39,21 @@ enum class LiveData { BANKROLL -> Bankroll::class.java GAME -> Game::class.java LOCATION -> Location::class.java - TOURNAMENT_TYPE -> TournamentFeature::class.java + TOURNAMENT_FEATURE -> TournamentFeature::class.java TRANSACTION_TYPE -> TransactionType::class.java } } + fun newEntity(): RealmObject { + return when (this) { + BANKROLL -> Bankroll() + GAME -> Game() + LOCATION -> Location() + TOURNAMENT_FEATURE -> TournamentFeature() + TRANSACTION_TYPE -> TransactionType() + } + } + fun getData(realm:Realm, primaryKey:String?): RealmObject? { var proxyItem: RealmObject? = null primaryKey?.let { @@ -49,13 +70,24 @@ enum class LiveData { proxyItem?.let { return realm.copyFromRealm(it) } ?: run { - realm.beginTransaction() + return this.newEntity() +/* realm.beginTransaction() val t = realm.createObject(this.relatedEntity, UUID.randomUUID().toString()) realm.commitTransaction() - return realm.copyFromRealm(t) + return realm.copyFromRealm(t)*/ } } -} + + override val resId: Int? + get() { + return when (this) { + BANKROLL -> R.string.bankroll + GAME -> R.string.game + LOCATION -> R.string.location + TOURNAMENT_FEATURE -> R.string.tournament_type + TRANSACTION_TYPE -> R.string.operation_types + } + }} /* interface ListableDataSource { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index bf23ca9c..d33a9174 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -4,6 +4,7 @@ import android.text.InputType import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.model.ObjectSavable import net.pokeranalytics.android.ui.adapter.components.LiveDataDataSource import net.pokeranalytics.android.ui.adapter.components.RowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData @@ -15,7 +16,7 @@ import java.util.* import kotlin.collections.ArrayList open class Bankroll(name: String = "") : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, - RowEditable { + RowEditable, ObjectSavable { companion object { fun newInstance() : Bankroll { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index c0a419a1..2006af81 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.model.realm import android.text.InputType import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import net.pokeranalytics.android.model.ObjectSavable import net.pokeranalytics.android.ui.adapter.components.* import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetData import net.pokeranalytics.android.ui.view.RowEditable @@ -11,7 +12,7 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.SimpleRow import java.util.* -open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable { +open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, RowEditable, ObjectSavable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -35,6 +36,7 @@ open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, override fun stringForRow(row: RowRepresentable): String { return when (row) { SimpleRow.NAME -> this.name + GameRow.SHORT_NAME -> this.shortName?:"" else -> return super.stringForRow(row) } } @@ -43,6 +45,7 @@ open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add(BottomSheetData(this.name, SimpleRow.NAME.resId, InputType.TYPE_CLASS_TEXT)) + GameRow.SHORT_NAME -> data.add(BottomSheetData(this.shortName, GameRow.SHORT_NAME.resId, InputType.TYPE_CLASS_TEXT)) } return data } @@ -50,6 +53,11 @@ open class Game : RealmObject(), RowRepresentableDataSource, LiveDataDataSource, override fun updateValue(value: Any?, row: RowRepresentable) { when (row) { SimpleRow.NAME -> this.name = value as String? ?: "" + GameRow.SHORT_NAME -> this.shortName = value as String } } + + override fun isSavable(): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } } 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 7a1041b0..2635cc08 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,12 @@ 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.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import io.realm.RealmObject @@ -12,6 +14,7 @@ import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* 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.fragment.components.PokerAnalyticsFragment @@ -78,26 +81,56 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, setHasFixedSize(true) layoutManager = viewManager } + + this.saveButton.text = this.saveButton.context.getString(R.string.save) + this.saveButton.setOnClickListener { + + if ((this.item as ObjectSavable).isSavable()) { + this.getRealm().executeTransaction { + it.copyToRealmOrUpdate(this.item) + } + this.activity?.let { + it.finish() + } + } else { + val builder = AlertDialog.Builder(it.context) + builder.setTitle(R.string.warning) + .setNegativeButton(R.string.ok, null) + 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 -> + this.getRealm().executeTransaction { + this.item.deleteFromRealm() + } + this.activity?.let { + it.finish() + } + }) + builder.show() + } } /** * Set fragment data */ fun setData(dataType: Int, primaryKey: String?) { - this.liveDataType = LiveData.values()[dataType] - val realm = Realm.getDefaultInstance() - var proxyItem : RealmObject? = this.liveDataType.getData(realm, primaryKey) + 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()}" } - - this.item = this.liveDataType.updateOrCreate(realm, primaryKey) - + this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) this.rowRepresentableAdapter = RowRepresentableAdapter((this.item as RowRepresentableDataSource), this) this.recyclerView.adapter = rowRepresentableAdapter - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index 58157e5d..6c19108b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -6,11 +6,9 @@ import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType /** - * An interface used so that enums values can be represented visually - * as rows in RecyclerViews + * An interface to easily localize any object */ -interface RowRepresentable { - +interface Localizable { /** * The resource identifier of the localized title */ @@ -28,7 +26,13 @@ interface RowRepresentable { } return "LOCALISATION NOT FOUND" } +} +/** + * An interface used so that enums values can be represented visually + * as rows in RecyclerViews + */ +interface RowRepresentable : Localizable { /** * The type of view associated with the row */ @@ -130,9 +134,53 @@ enum class BankrollRow : RowRepresentable { } enum class GameRow : RowRepresentable { + SHORT_NAME; + + override val resId: Int? + get() { + return when (this) { + SHORT_NAME -> R.string.short_name + } + } + + override val viewType: Int + get() { + return when (this) { + SHORT_NAME -> RowViewType.TITLE_VALUE.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + SHORT_NAME -> BottomSheetType.EDIT_TEXT + } + } } enum class LocationRow : RowRepresentable { + LOCATION_STATUS; + + override val resId: Int? + get() { + return when (this) { + LOCATION_STATUS -> R.string.short_name + } + } + + override val viewType: Int + get() { + return when (this) { + LOCATION_STATUS -> RowViewType.TITLE.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + LOCATION_STATUS -> BottomSheetType.NONE + } + } } enum class TransactionTypeRow : RowRepresentable { @@ -145,17 +193,15 @@ enum class SettingRow: RowRepresentable { BANKROLL, GAME, LOCATION, - TOURNAMENT_TYPE, + TOURNAMENT_FEATURE, TRANSACTION_TYPE; override val resId: Int? get() { - return when (this) { - BANKROLL -> R.string.bankroll - GAME -> R.string.game - LOCATION -> R.string.location - TOURNAMENT_TYPE -> R.string.tournament_type - TRANSACTION_TYPE -> R.string.operation_types + this.relatedResultsRepresentable?. let { + return it.resId + } ?: run { + return super.resId } } @@ -167,7 +213,7 @@ enum class SettingRow: RowRepresentable { BANKROLL -> LiveData.BANKROLL GAME -> LiveData.GAME LOCATION -> LiveData.LOCATION - TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE + TOURNAMENT_FEATURE -> LiveData.TOURNAMENT_FEATURE TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE } } diff --git a/app/src/main/res/layout/fragment_editable_data.xml b/app/src/main/res/layout/fragment_editable_data.xml index d072701e..ed7b8bf4 100644 --- a/app/src/main/res/layout/fragment_editable_data.xml +++ b/app/src/main/res/layout/fragment_editable_data.xml @@ -9,7 +9,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" - app:layout_behavior="@string/appbar_scrolling_view_behavior"> + app:layout_behavior="@string/appbar_scrolling_view_behavior" android:id="@+id/nestedScrollView"> + app:layout_constraintTop_toTopOf="parent"/> @@ -51,10 +51,24 @@ android:layout_height="?attr/actionBarSize" app:title="Poker Analytics" app:titleTextColor="@color/white" - app:layout_collapseMode="pin" /> + app:layout_collapseMode="pin"/> +