diff --git a/app/build.gradle b/app/build.gradle index 14abd0a3..9e4dc5e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,13 +44,14 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - // Android implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.core:core-ktx:1.1.0-alpha04' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + implementation 'androidx.browser:browser:1.0.0' + // Places implementation 'com.google.android.libraries.places:places:1.0.0' 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 cb9d1e23..5504d3ad 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 @@ -49,7 +49,7 @@ open class Bankroll(name: String = "") : RealmObject(), Savable, // Row Representable Datasource - override fun adapterRows(): List? { + override fun adapterRows(): List? { val rows = ArrayList() rows.add(SimpleRow.NAME) rows.addAll(BankrollRow.values()) 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 7ea10b75..6e82814d 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 @@ -11,69 +11,68 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* import kotlin.collections.ArrayList -open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, - RowRepresentable { +open class Game : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { - @PrimaryKey - var id = UUID.randomUUID().toString() + @PrimaryKey + var id = UUID.randomUUID().toString() - // The name of the game - var name: String = "" + // The name of the game + var name: String = "" - // A shorter name for the game - var shortName: String? = null + // A shorter name for the game + var shortName: String? = null - override fun getDisplayName(): String { - return this.name - } + override fun getDisplayName(): String { + return this.name + } - override fun uniqueIdentifier(): String { - return this.id - } + override fun uniqueIdentifier(): String { + return this.id + } - override fun adapterRows(): List? { - val rows = ArrayList() - rows.add(SimpleRow.NAME) - rows.addAll(GameRow.values()) - return rows - } + override fun adapterRows(): List? { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + rows.addAll(GameRow.values()) + return rows + } - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SimpleRow.NAME -> this.name - GameRow.SHORT_NAME -> this.shortName?:"" - else -> return super.stringForRow(row) - } - } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + GameRow.SHORT_NAME -> this.shortName ?: "" + else -> return super.stringForRow(row) + } + } - override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowRepresentableEditDescriptor( - this.name, - SimpleRow.NAME.resId - ) - ) - GameRow.SHORT_NAME -> data.add( - RowRepresentableEditDescriptor( - this.shortName, - GameRow.SHORT_NAME.resId - ) - ) - } - return data - } + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId + ) + ) + GameRow.SHORT_NAME -> data.add( + RowRepresentableEditDescriptor( + this.shortName, + GameRow.SHORT_NAME.resId + ) + ) + } + return data + } - 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 updateValue(value: Any?, row: RowRepresentable) { + when (row) { + SimpleRow.NAME -> this.name = value as String? ?: "" + GameRow.SHORT_NAME -> this.shortName = value as String + } + } - override fun isValidForSave(): Boolean { - return this.name.isNotEmpty() - } + override fun isValidForSave(): Boolean { + return this.name.isNotEmpty() + } } 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 4e146df4..e7a53aac 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 @@ -314,7 +314,7 @@ open class Session : RealmObject(), SessionInterface, Savable, return "Session ${this.creationDate}" } - override fun adapterRows(): List? { + override fun adapterRows(): List? { val rows = ArrayList() // Headers @@ -365,7 +365,7 @@ open class Session : RealmObject(), SessionInterface, Savable, } // Rows - rows.addAll(SessionRow.getRows(type, getState())) + rows.addAll(SessionRow.getRows(this)) return rows } @@ -379,7 +379,7 @@ open class Session : RealmObject(), SessionInterface, Savable, SessionRow.BLINDS -> getBlinds() SessionRow.BREAK_TIME -> timeFrame?.breakDuration?.toMinutes() ?: "--" SessionRow.BUY_IN -> buyin.toCurrency() - SessionRow.CASHED_OUT, SessionRow.PRIZE -> result?.cashout?.toCurrency() ?: "--" + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> result?.cashout?.toCurrency() ?: "--" SessionRow.COMMENT -> if (comment.isNotEmpty()) comment else "--" SessionRow.END_DATE -> if (timeFrame != null) timeFrame?.endDate?.shortDateTime() ?: "--" else "--" SessionRow.GAME -> getGameTitle() @@ -464,12 +464,13 @@ open class Session : RealmObject(), SessionInterface, Savable, ) ) } - SessionRow.CASHED_OUT, SessionRow.PRIZE -> { + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> { data.add( RowRepresentableEditDescriptor( result?.cashout?.round(), inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL + or InputType.TYPE_NUMBER_FLAG_SIGNED ) ) } @@ -563,9 +564,19 @@ open class Session : RealmObject(), SessionInterface, Savable, localResult.buyin = value as Double? result = localResult } - SessionRow.CASHED_OUT, SessionRow.PRIZE -> { + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT -> { val localResult = if (result != null) result as Result else realm.createObject(Result::class.java) - localResult.cashout = if (value == null) null else (value as String).toDouble() + + if (value == null) { + localResult.cashout = null + } else { + localResult.cashout = (value as String).toDouble() + val timeFrameToUpdate = + if (timeFrame != null) timeFrame as TimeFrame else realm.createObject(TimeFrame::class.java) + timeFrameToUpdate.setDate(null, Date()) + timeFrame = timeFrameToUpdate + } + result = localResult } SessionRow.COMMENT -> comment = value as String? ?: "" diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index 929fe42b..dcda7dd1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -28,7 +28,7 @@ open class TournamentFeature : RealmObject(), Savable, StaticRowRepresentableDat return this.id } - override fun adapterRows(): List? { + override fun adapterRows(): List? { val rows = ArrayList() rows.add(SimpleRow.NAME) rows.addAll(TournamentFeatureRow.values()) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt index c10cba32..c29e87b7 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentType.kt @@ -3,13 +3,15 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Savable -import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource +import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import java.util.* +import kotlin.collections.ArrayList -open class TournamentType : RealmObject(), Savable, RowRepresentable { +open class TournamentType : RealmObject(), Savable, StaticRowRepresentableDataSource, RowRepresentable { @PrimaryKey var id = UUID.randomUUID().toString() @@ -31,4 +33,36 @@ open class TournamentType : RealmObject(), Savable, RowRepresentable { } } + override fun adapterRows(): List? { + val rows = ArrayList() + rows.add(SimpleRow.NAME) + //rows.addAll(TournamentType.values()) + return rows + } + + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SimpleRow.NAME -> this.name + else -> return super.stringForRow(row) + } + } + + override fun editDescriptors(row: RowRepresentable): ArrayList { + val data = java.util.ArrayList() + when (row) { + SimpleRow.NAME -> data.add( + RowRepresentableEditDescriptor( + this.name, + SimpleRow.NAME.resId + ) + ) + } + return data + } + + override fun isValidForSave(): Boolean { + return this.name.isNotEmpty() + } + + } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 70d8b686..4641418f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -38,7 +38,7 @@ open class TransactionType : RealmObject(), Savable, StaticRowRepresentableDataS return this.id } - override fun adapterRows(): List? { + override fun adapterRows(): List? { val rows = ArrayList() rows.add(SimpleRow.NAME) rows.addAll(TransactionTypeRow.values()) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt index 942b323c..19e6c255 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt @@ -4,7 +4,6 @@ import android.content.Context import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor -import org.w3c.dom.Text /** * Base Interface to provide the RowRepresentable to the adapter @@ -14,7 +13,7 @@ interface RowRepresentableDataSource: EditableDataSource, DisplayableDataSource /** * Returns a prebuild list of rows */ - fun adapterRows(): List? + fun adapterRows(): List? /** * Returns a [RowRepresentable] at position [Int] @@ -74,7 +73,7 @@ interface StaticRowRepresentableDataSource: RowRepresentableDataSource { * To do that, this interface overrides and provides a default implementation to specific methods of [RowRepresentableDataSource] */ interface LiveRowRepresentableDataSource: RowRepresentableDataSource { - override fun adapterRows(): List? { + override fun adapterRows(): List? { return null } } 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 bed75b34..8642d0f1 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 @@ -14,15 +14,19 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.Savable +import net.pokeranalytics.android.model.realm.Bankroll +import net.pokeranalytics.android.model.realm.Game +import net.pokeranalytics.android.model.realm.Location +import net.pokeranalytics.android.model.realm.TournamentType import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate -import net.pokeranalytics.android.ui.helpers.PlacePickerManager 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 +import net.pokeranalytics.android.ui.helpers.PlacePickerManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow @@ -137,10 +141,21 @@ class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, finishActivityWithResult(uniqueIdentifier) } } else { + + val message = when(item) { + is Bankroll -> R.string.empty_name_for_br_error + is Location -> R.string.location_empty_field_error + is Game -> R.string.location_empty_field_error + is TournamentType -> R.string.tt_empty_field_error + //is TransactionType -> R.string.operation_type_empty_field_error + else -> throw IllegalStateException("Need to manage ${item::class.java} error") + } + val builder = AlertDialog.Builder(requireContext()) - .setMessage(R.string.empty_name_for_br_error) + .setMessage(message) .setNegativeButton(R.string.ok, null) builder.show() + } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt index aa692789..f13e6b38 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt @@ -127,7 +127,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource if (!calendar.isSameDay(currentCalendar) || index == 0) { calendar.time = currentCalendar.time val header = HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.longDate() ) rows.add(header) @@ -136,7 +136,7 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource if (!calendar.isSameMonth(currentCalendar) || index == 0) { calendar.time = currentCalendar.time val header = HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, title = session.creationDate.getMonthAndYear() ) rows.add(header) @@ -165,8 +165,8 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource } override fun viewTypeForPosition(position: Int): Int { - return if (rows[position].viewType == RowViewType.HEADER_SESSION.ordinal) { - RowViewType.HEADER_SESSION.ordinal + return if (rows[position].viewType == RowViewType.HEADER_TITLE.ordinal) { + RowViewType.HEADER_TITLE.ordinal } else { RowViewType.ROW_SESSION.ordinal } 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 09b093dc..5e82b00e 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 @@ -104,7 +104,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Bott currentSession.updateValue(value, row) sessionAdapter.refreshRow(row) when (row) { - SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.BUY_IN, SessionRow.TIPS, + SessionRow.CASHED_OUT, SessionRow.PRIZE, SessionRow.NET_RESULT, SessionRow.BUY_IN, SessionRow.TIPS, SessionRow.START_DATE, SessionRow.END_DATE -> updateSessionUI() } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 22376bc3..af907192 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -10,15 +10,19 @@ import kotlinx.android.synthetic.main.fragment_settings.* import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.DataListActivity +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow +import net.pokeranalytics.android.util.* class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource { + private lateinit var parentActivity: PokerAnalyticsActivity + companion object { /** @@ -60,6 +64,20 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { + SettingRow.RATE_APP -> parentActivity.openPlayStorePage() + SettingRow.CONTACT_US -> parentActivity.openContactMail() + SettingRow.BUG_REPORT -> Toast.makeText(requireContext(), "Bug report", Toast.LENGTH_SHORT).show() + SettingRow.FOLLOW_US -> { + when(position) { + 0 -> parentActivity.openUrl(BLOG) + 1 -> parentActivity.openUrl(INSTAGRAM) + 2 -> parentActivity.openUrl(TWITTER) + 3 -> parentActivity.openUrl(FACEBOOK) + } + } + SettingRow.CURRENCY -> Toast.makeText(requireContext(), "Currency", Toast.LENGTH_SHORT).show() + SettingRow.PRIVACY_POLICY -> parentActivity.openUrl(URL_PRIVACY_POLICY) + SettingRow.TERMS_OF_USE -> parentActivity.openUrl(URL_TERMS) SettingRow.GDPR -> Toast.makeText(requireContext(), "Show GDPR", Toast.LENGTH_SHORT).show() } @@ -73,6 +91,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta */ private fun initData() { + parentActivity = activity as PokerAnalyticsActivity + val viewManager = LinearLayoutManager(requireContext()) settingsAdapterRow = RowRepresentableAdapter( this, this diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 4fa1cd8f..6e9d00bf 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -52,7 +52,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc // Row Representable DS - override fun adapterRows(): List? { + override fun adapterRows(): List? { return this.rowRepresentables } @@ -141,7 +141,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc val rows: ArrayList = ArrayList() results.forEach { results -> - rows.add(HeaderRowRepresentable(RowViewType.TITLE, title = results.group.name)) + rows.add(HeaderRowRepresentable(title = results.group.name)) results.group.stats?.forEach { stat -> rows.add(StatRepresentable(stat, results.computedStat(stat))) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index 0635780c..af16dc04 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -72,7 +72,7 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), } } - override fun adapterRows(): List? { + override fun adapterRows(): List? { return TableSize.all } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 4e46a53e..c95c2036 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -3,15 +3,16 @@ package net.pokeranalytics.android.ui.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_bottom_sheet_grid_title.view.* import kotlinx.android.synthetic.main.row_bottom_sheet_title.view.* +import kotlinx.android.synthetic.main.row_header_title.view.* import kotlinx.android.synthetic.main.row_header_title_amount.view.* import kotlinx.android.synthetic.main.row_header_title_value.view.* import kotlinx.android.synthetic.main.row_history_session.view.* -import kotlinx.android.synthetic.main.row_history_session_header.view.* import kotlinx.android.synthetic.main.row_stats_title_value.view.* import kotlinx.android.synthetic.main.row_title.view.* import kotlinx.android.synthetic.main.row_title_switch.view.* @@ -28,21 +29,19 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.HeaderRowRepresentabl * An interface used to factor the configuration of RecyclerView.ViewHolder */ interface BindableHolder { - fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { - } } enum class RowViewType { - HEADER, HEADER_TITLE_VALUE, HEADER_TITLE_AMOUNT, HEADER_TITLE_AMOUNT_BIG, - HEADER_SESSION, + HEADER_TITLE, EDIT_TEXT, TITLE, + TITLE_ARROW, TITLE_VALUE, TITLE_VALUE_ACTION, TITLE_SWITCH, @@ -51,6 +50,7 @@ enum class RowViewType { TITLE_GRID, ROW_SESSION, BUTTON, + FOLLOW_US, STAT; /** @@ -86,6 +86,13 @@ enum class RowViewType { false ) ) + TITLE_ARROW -> TitleViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_title_arrow, + parent, + false + ) + ) TITLE_VALUE -> TitleValueViewHolder( LayoutInflater.from(parent.context).inflate( R.layout.row_title_value, @@ -128,10 +135,10 @@ enum class RowViewType { false ) ) - HEADER_SESSION -> { + HEADER_TITLE -> { HeaderSessionViewHolder( LayoutInflater.from(parent.context).inflate( - R.layout.row_history_session_header, + R.layout.row_header_title, parent, false ) @@ -153,6 +160,15 @@ enum class RowViewType { ) ) } + FOLLOW_US -> { + FollowUsViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.row_follow_us, + parent, + false + ) + ) + } STAT -> StatsTitleValueViewHolder( LayoutInflater.from(parent.context).inflate( R.layout.row_stats_title_value, @@ -168,12 +184,12 @@ enum class RowViewType { BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { itemView.rowHeaderTitleValue_title.text = row.localizedTitle(itemView.context) - adapter.dataSource?.let { + adapter.dataSource.let { itemView.rowHeaderTitleValue_value.text = it.stringForRow(row, itemView.context) } -// val listener = View.OnClickListener { -// adapter.delegate?.onRowSelected(position, row) -// } + //val listener = View.OnClickListener { + // adapter.delegate?.onRowSelected(position, row) + //} //itemView.rowHeaderTitleValue_container.setOnClickListener(listener) itemView.rowHeaderTitleValue_separator.visibility = if (row.needSeparator) View.VISIBLE else View.GONE } @@ -228,6 +244,23 @@ enum class RowViewType { } } + inner class FollowUsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { + override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { + itemView.findViewById(R.id.icon1).setOnClickListener { + adapter.delegate?.onRowSelected(0, row) + } + itemView.findViewById(R.id.icon2).setOnClickListener { + adapter.delegate?.onRowSelected(1, row) + } + itemView.findViewById(R.id.icon3).setOnClickListener { + adapter.delegate?.onRowSelected(2, row) + } + itemView.findViewById(R.id.icon4).setOnClickListener { + adapter.delegate?.onRowSelected(3, row) + } + } + } + inner class StatsTitleValueViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { override fun bind(position: Int, row: RowRepresentable, adapter: RowRepresentableAdapter) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt index bec9dfe3..62f34061 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/HeaderRowRepresentable.kt @@ -8,7 +8,7 @@ import net.pokeranalytics.android.ui.view.RowViewType * A class to display headers as row representable */ class HeaderRowRepresentable( - var customViewType: RowViewType? = RowViewType.HEADER, + var customViewType: RowViewType? = RowViewType.HEADER_TITLE, override var resId: Int? = null, var title: String? = null, var value: String? = null @@ -26,6 +26,6 @@ class HeaderRowRepresentable( } - override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER.ordinal + override val viewType: Int = customViewType?.ordinal ?: RowViewType.HEADER_TITLE.ordinal } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt index f4d8c5be..9be81d54 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -2,6 +2,7 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import net.pokeranalytics.android.R import net.pokeranalytics.android.model.extensions.SessionState +import net.pokeranalytics.android.model.extensions.getState import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable @@ -10,121 +11,131 @@ import net.pokeranalytics.android.ui.view.RowViewType enum class SessionRow : RowRepresentable { - PRIZE, - CASHED_OUT, - INITIAL_BUY_IN, - BUY_IN, - POSITION, - PLAYERS, - TIPS, + PRIZE, + CASHED_OUT, + NET_RESULT, + INITIAL_BUY_IN, + BUY_IN, + POSITION, + PLAYERS, + TIPS, - GAME, - BLINDS, - LOCATION, - BANKROLL, - TABLE_SIZE, - TOURNAMENT_TYPE, - START_DATE, - END_DATE, + GAME, + BLINDS, + LOCATION, + BANKROLL, + TABLE_SIZE, + TOURNAMENT_TYPE, + START_DATE, + END_DATE, - BREAK_TIME, - COMMENT; + BREAK_TIME, + COMMENT; - companion object { - /** - * Return the rows to display for the current session state - */ - fun getRows(type: Int, sessionState: SessionState): ArrayList { - when (type) { - Session.Type.TOURNAMENT.ordinal -> { - return when (sessionState) { - SessionState.PENDING, SessionState.PLANNED -> { - arrayListOf( - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, - START_DATE, END_DATE - ) - } - SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { - arrayListOf( - PRIZE, BUY_IN, POSITION, PLAYERS, TIPS, - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, - START_DATE, END_DATE, BREAK_TIME, COMMENT - ) - } - else -> arrayListOf() - } - } - Session.Type.CASH_GAME.ordinal -> { - return when (sessionState) { - SessionState.PENDING, SessionState.PLANNED -> { - arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) - } - SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { - arrayListOf( - CASHED_OUT, BUY_IN, TIPS, - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT - ) - } - else -> arrayListOf() - } - } - } - return arrayListOf() - } - } + companion object { + /** + * Return the rows to display for the current session state + */ + fun getRows(session: Session): ArrayList { + when (session.type) { + Session.Type.TOURNAMENT.ordinal -> { + return when (session.getState()) { + SessionState.PENDING, SessionState.PLANNED -> { + arrayListOf( + GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, + START_DATE, END_DATE + ) + } + SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { + arrayListOf( + PRIZE, BUY_IN, POSITION, PLAYERS, TIPS, + GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, + START_DATE, END_DATE, BREAK_TIME, COMMENT + ) + } + else -> arrayListOf() + } + } + Session.Type.CASH_GAME.ordinal -> { + when (session.getState()) { + SessionState.PENDING, SessionState.PLANNED -> { + return arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) + } + SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { + val liveBankroll = session.bankroll?.live ?: false + return if (liveBankroll) { + arrayListOf( + CASHED_OUT, BUY_IN, TIPS, + GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT + ) + } else { + arrayListOf( + NET_RESULT, BUY_IN, TIPS, + GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT + ) + } + } + else -> return arrayListOf() + } + } + } + return arrayListOf() + } + } - override val needSeparator: Boolean - get() { - return when (this) { - SessionRow.TIPS -> true - else -> false - } - } + override val needSeparator: Boolean + get() { + return when (this) { + SessionRow.TIPS -> true + else -> false + } + } - override val resId: Int? - get() { - return when (this) { - PRIZE -> R.string.prize - POSITION -> R.string.position - PLAYERS -> R.string.players - CASHED_OUT -> R.string.cashed_out - INITIAL_BUY_IN -> R.string.initial_stack - BUY_IN -> R.string.buyin - TIPS -> R.string.tips - GAME -> R.string.game - BLINDS -> R.string.blinds - LOCATION -> R.string.location - BANKROLL -> R.string.bankroll - TABLE_SIZE -> R.string.table_size - TOURNAMENT_TYPE -> R.string.tournament_type - START_DATE -> R.string.start_date - END_DATE -> R.string.end_date - BREAK_TIME -> R.string.break_time - COMMENT -> R.string.comment - } - } + override val resId: Int? + get() { + return when (this) { + NET_RESULT -> R.string.net_result + PRIZE -> R.string.prize + POSITION -> R.string.position + PLAYERS -> R.string.players + CASHED_OUT -> R.string.cashed_out + INITIAL_BUY_IN -> R.string.initial_stack + BUY_IN -> R.string.buyin + TIPS -> R.string.tips + GAME -> R.string.game + BLINDS -> R.string.blinds + LOCATION -> R.string.location + BANKROLL -> R.string.bankroll + TABLE_SIZE -> R.string.table_size + TOURNAMENT_TYPE -> R.string.tournament_type + START_DATE -> R.string.start_date + END_DATE -> R.string.end_date + BREAK_TIME -> R.string.break_time + COMMENT -> R.string.comment + } + } - override val viewType: Int - get() { - return when (this) { - PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, - TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal - } - } + override val viewType: Int + get() { + return when (this) { + NET_RESULT, PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, + GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, + TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal + } + } - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT - BUY_IN, TIPS -> BottomSheetType.SUM - BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT - GAME -> BottomSheetType.LIST_GAME - LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST - TABLE_SIZE -> BottomSheetType.GRID - COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES - else -> BottomSheetType.NONE - } - } + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + NET_RESULT, CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT + BUY_IN, TIPS -> BottomSheetType.SUM + BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT + GAME -> BottomSheetType.LIST_GAME + LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST + TABLE_SIZE -> BottomSheetType.GRID + COMMENT -> BottomSheetType.EDIT_TEXT_MULTI_LINES + else -> BottomSheetType.NONE + } + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt index d197ecdf..df23556a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt @@ -25,7 +25,6 @@ enum class SettingRow : RowRepresentable { GAME, LOCATION, TOURNAMENT_TYPE, - TRANSACTION_TYPE, // Terms PRIVACY_POLICY, @@ -40,24 +39,24 @@ enum class SettingRow : RowRepresentable { fun getRows(): ArrayList { val rows = ArrayList() - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.information)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.information)) rows.addAll(arrayListOf(VERSION, RATE_APP, CONTACT_US, BUG_REPORT)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.follow_us)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.follow_us)) rows.addAll(arrayListOf(FOLLOW_US)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.preferences)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences)) rows.addAll(arrayListOf(CURRENCY)) rows.add( HeaderRowRepresentable( - customViewType = RowViewType.HEADER_SESSION, + customViewType = RowViewType.HEADER_TITLE, resId = R.string.data_management ) ) - rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE, TRANSACTION_TYPE)) + rows.addAll(arrayListOf(BANKROLL, GAME, LOCATION, TOURNAMENT_TYPE)) - rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_SESSION, resId = R.string.terms)) + rows.add(HeaderRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.terms)) rows.addAll(arrayListOf(PRIVACY_POLICY, TERMS_OF_USE, GDPR)) return rows @@ -90,7 +89,8 @@ enum class SettingRow : RowRepresentable { get() { return when (this) { VERSION -> RowViewType.TITLE_VALUE.ordinal - else -> RowViewType.TITLE.ordinal + FOLLOW_US -> RowViewType.FOLLOW_US.ordinal + else -> RowViewType.TITLE_ARROW.ordinal } } @@ -101,7 +101,6 @@ enum class SettingRow : RowRepresentable { GAME -> LiveData.GAME LOCATION -> LiveData.LOCATION TOURNAMENT_TYPE -> LiveData.TOURNAMENT_TYPE - TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE else -> null } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/Global.kt b/app/src/main/java/net/pokeranalytics/android/util/Global.kt index 978e6109..e121a598 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Global.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Global.kt @@ -1,3 +1,17 @@ package net.pokeranalytics.android.util val NULL_TEXT: String = "--" + +// Support +const val SUPPORT_EMAIL = "support@pokeranalytics.net" + +// Terms +const val URL_PRIVACY_POLICY = "https://www.poker-analytics.net/privacypolicy.html" +const val URL_TERMS = "https://www.poker-analytics.net/terms.html" + +// Social Network +const val BLOG = "https://medium.com/poker-analytics" +const val INSTAGRAM = "https://www.instagram.com/pokeranalytics" +const val TWITTER = "https://twitter.com/paapptweet" +const val FACEBOOK = "https://www.facebook.com/171053452998758" + diff --git a/app/src/main/java/net/pokeranalytics/android/util/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/UIExtensions.kt index f663ba53..75c6e355 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/UIExtensions.kt @@ -1,7 +1,14 @@ package net.pokeranalytics.android.util +import android.content.ActivityNotFoundException +import android.content.Intent import android.content.res.Resources +import android.net.Uri import android.widget.Toast +import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.content.ContextCompat +import net.pokeranalytics.android.BuildConfig +import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment @@ -17,13 +24,49 @@ val Float.px: Float get() = (this * Resources.getSystem().displayMetrics.density) - // 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 +} + +// Open Play Store for rating +fun PokerAnalyticsActivity.openPlayStorePage() { + val uri = Uri.parse("market://details?id=$packageName") + val goToMarket = Intent(Intent.ACTION_VIEW, uri) + goToMarket.addFlags( + Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_NEW_DOCUMENT or + Intent.FLAG_ACTIVITY_MULTIPLE_TASK + ) + try { + startActivity(goToMarket) + } catch (e: ActivityNotFoundException) { + startActivity( + Intent( + Intent.ACTION_VIEW, Uri.parse( + "http://play.google.com/store/apps/details?id=$packageName" + ) + ) + ) + } +} + +// Open email for "Contact us" +fun PokerAnalyticsActivity.openContactMail() { + val info = "v${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE}), Android ${android.os.Build.VERSION.SDK_INT}" + val intent = Intent(Intent.ACTION_SENDTO) + intent.data = Uri.parse("mailto:$SUPPORT_EMAIL") + intent.putExtra(Intent.EXTRA_EMAIL, SUPPORT_EMAIL) + intent.putExtra(Intent.EXTRA_TEXT, "\n\n$info") + startActivity(Intent.createChooser(intent, getString(R.string.contact))) +} + +// Open custom tab +fun PokerAnalyticsActivity.openUrl(url: String) { + val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder() + builder.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary)) + val customTabsIntent = builder.build() + customTabsIntent.launchUrl(this, Uri.parse(url)) +} diff --git a/app/src/main/res/drawable-xxhdpi/add_tournament.png b/app/src/main/res/drawable-xxhdpi/add_tournament.png new file mode 100644 index 00000000..d2532d17 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/add_tournament.png differ diff --git a/app/src/main/res/drawable-xxhdpi/add_tournoi.png b/app/src/main/res/drawable-xxhdpi/add_tournoi.png deleted file mode 100644 index f78065a3..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/add_tournoi.png and /dev/null differ diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml index c5b1fb98..e4ab0748 100644 --- a/app/src/main/res/layout/fragment_history.xml +++ b/app/src/main/res/layout/fragment_history.xml @@ -82,7 +82,7 @@ android:layout_marginEnd="8dp" android:text="@string/new_cash_game" app:icon="@drawable/add_cash_game" - app:iconSize="32dp" + app:iconSize="28dp" app:layout_constraintEnd_toStartOf="@+id/newTournament" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_chainStyle="spread" @@ -99,8 +99,8 @@ android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:text="@string/new_tournament" - app:icon="@drawable/add_tournoi" - app:iconSize="32dp" + app:icon="@drawable/add_tournament" + app:iconSize="28dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/newCashGame" diff --git a/app/src/main/res/layout/row_follow_us.xml b/app/src/main/res/layout/row_follow_us.xml new file mode 100644 index 00000000..b8ad4830 --- /dev/null +++ b/app/src/main/res/layout/row_follow_us.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_history_session_header.xml b/app/src/main/res/layout/row_header_title.xml similarity index 100% rename from app/src/main/res/layout/row_history_session_header.xml rename to app/src/main/res/layout/row_header_title.xml diff --git a/app/src/main/res/layout/row_session_view.xml b/app/src/main/res/layout/row_session_view.xml index fcc7ed1e..67b08d7b 100644 --- a/app/src/main/res/layout/row_session_view.xml +++ b/app/src/main/res/layout/row_session_view.xml @@ -3,7 +3,7 @@ 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:layout_height="56dp" android:background="?selectableItemBackground"> - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_title_value.xml b/app/src/main/res/layout/row_title_value.xml index d5b119fe..718462ed 100644 --- a/app/src/main/res/layout/row_title_value.xml +++ b/app/src/main/res/layout/row_title_value.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rowTitleValue.container" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="48dp" android:orientation="vertical"> #FFFFFF #30FFFFFF - #6AFFFFFF + #8AFFFFFF #141414 #1B1F1B diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6433b80d..3c1d7ae5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -111,7 +111,7 @@ @@ -200,8 +200,9 @@