diff --git a/app/src/androidTest/assets/schema_3.realm b/app/src/androidTest/assets/schema_3.realm new file mode 100644 index 00000000..4409e5b8 Binary files /dev/null and b/app/src/androidTest/assets/schema_3.realm differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b593e589..4caf0748 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -44,6 +44,16 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + + + + - - diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index a92e3af4..cfe97dca 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -51,7 +51,7 @@ class PokerAnalyticsApplication : Application() { } if (BuildConfig.DEBUG) { - // this.createFakeSessions() + //this.createFakeSessions() } } diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt index e8cd78ca..af908c6a 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -35,7 +35,7 @@ class Calculator { enum class EvolutionValues { NONE, STANDARD, - DATED + TIMED } var display: Display = Display.TABLE @@ -146,12 +146,17 @@ class Calculator { tBuyinSum += computable.ratedBuyin tHands += computable.estimatedHands - val session = computable.session ?: throw IllegalStateException("Computing lone ComputableResult") + val session = + computable.session ?: throw IllegalStateException("Computing lone ComputableResult") results.addEvolutionValue(tSum, stat = NETRESULT, data = session) results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) - results.addEvolutionValue((tWinningSessionCount / index).toDouble(), stat = WIN_RATIO, data = session) + results.addEvolutionValue( + (tWinningSessionCount.toDouble() / index.toDouble()), + stat = WIN_RATIO, + data = session + ) results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> @@ -182,7 +187,7 @@ class Calculator { // var bbHourlyRate = gBBSum / gDuration when (options.evolutionValues) { - Options.EvolutionValues.DATED -> { + Options.EvolutionValues.STANDARD, Options.EvolutionValues.TIMED -> { var tHourlyDuration = 0.0 var tIndex = 0 @@ -202,16 +207,49 @@ class Calculator { tHourlyRate = gSum / tHourlyDuration tHourlyRateBB = gBBSum / tHourlyDuration - results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) - results.addEvolutionValue(tSum / tHourlyDuration, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) - results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet) - results.addEvolutionValue(sessionSet.netDuration.toDouble(), tHourlyDuration, DURATION, sessionSet) - results.addEvolutionValue(tHourlyDuration / tIndex, tHourlyDuration, AVERAGE_DURATION, sessionSet) - results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) - - Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> - results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet) + when (options.evolutionValues) { + Options.EvolutionValues.STANDARD -> { + results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) + results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + stat = DURATION, + data = sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + stat = AVERAGE_DURATION, + data = sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = sessionSet) + } + + } + Options.EvolutionValues.TIMED -> { + results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT, sessionSet) + results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) + results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS, sessionSet) + results.addEvolutionValue( + sessionSet.netDuration.toDouble(), + tHourlyDuration, + DURATION, + sessionSet + ) + results.addEvolutionValue( + tHourlyDuration / tIndex, + tHourlyDuration, + AVERAGE_DURATION, + sessionSet + ) + results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) + + Stat.netBBPer100Hands(gBBSum, gTotalHands)?.let { netBB100 -> + results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS, sessionSet) + } + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt index efbf89c7..2d72b901 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Stat.kt @@ -201,7 +201,24 @@ enum class Stat : RowRepresentable { get() { return when (this) { NETRESULT -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) - else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR, AggregationType.DURATION) + NUMBER_OF_GAMES, NUMBER_OF_SETS -> listOf(AggregationType.MONTH, AggregationType.YEAR) + else -> listOf(AggregationType.SESSION, AggregationType.MONTH, AggregationType.YEAR) + } + } + + val hasEvolutionGraph: Boolean + get() { + return when (this) { + DURATION, AVERAGE_DURATION -> false + else -> true + } + } + + val significantIndividualValue: Boolean + get() { + return when (this) { + WIN_RATIO, NUMBER_OF_SETS, NUMBER_OF_GAMES -> false + else -> true } } 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 0b7b044f..3b661a74 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 @@ -879,6 +879,7 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat Stat.DURATION, Stat.AVERAGE_DURATION -> this.netDuration.toDouble() Stat.HOURLY_RATE, Stat.STANDARD_DEVIATION_HOURLY -> this.hourlyRate Stat.HANDS_PLAYED -> this.estimatedHands + Stat.WIN_RATIO -> null else -> throw StatFormattingException("format undefined for stat ${stat.name}") } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt index 4b3178e7..77f4dc1b 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/SessionSet.kt @@ -14,6 +14,7 @@ import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.model.filter.Filterable import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.model.interfaces.Timed +import net.pokeranalytics.android.util.NULL_TEXT import java.util.* @@ -79,12 +80,26 @@ open class SessionSet() : RealmObject(), Timed, Filterable { var bbNet: BB = 0.0 + val bbHourlyRate: BB + get() { + return this.bbNet / this.hourlyDuration + } + override fun formattedValue(stat: Stat, context: Context) : TextFormat { return when (stat) { Stat.NETRESULT, Stat.AVERAGE -> stat.format(this.ratedNet, null, context) Stat.DURATION, Stat.AVERAGE_DURATION -> stat.format(this.netDuration.toDouble(), null, context) Stat.HOURLY_RATE -> stat.format(this.hourlyRate, null, context) Stat.HANDS_PLAYED -> stat.format(this.estimatedHands, null, context) + Stat.HOURLY_RATE_BB -> stat.format(this.bbHourlyRate, null, context) + Stat.NET_BB_PER_100_HANDS, Stat.STANDARD_DEVIATION_BB_PER_100_HANDS -> { + val netBBPer100Hands = Stat.netBBPer100Hands(this.bbNet, this.estimatedHands) + if (netBBPer100Hands != null) { + return stat.format(this.estimatedHands, null, context) + } else { + return TextFormat(NULL_TEXT) + } + } else -> throw StatFormattingException("format undefined for stat ${stat.name}") } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonChartActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonChartActivity.kt new file mode 100644 index 00000000..a38ca702 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ComparisonChartActivity.kt @@ -0,0 +1,33 @@ +package net.pokeranalytics.android.ui.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity + +class ComparisonChartActivity : PokerAnalyticsActivity() { + + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, ComparisonChartActivity::class.java) + context.startActivity(intent) + } + + /** + * Create a new instance for result + */ + fun newInstanceForResult(fragment: Fragment, requestCode: Int) { + val intent = Intent(fragment.requireContext(), ComparisonChartActivity::class.java) + fragment.startActivityForResult(intent, requestCode) + } + + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_comparison_chart) + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index 096a6de5..af6939bb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -73,7 +73,7 @@ class HomeActivity : PokerAnalyticsActivity() { } override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.home_menu, menu) + menuInflater.inflate(R.menu.toolbar_home, menu) this.homeMenu = menu //TODO: Change filter button visibility homeMenu?.findItem(R.id.filter)?.isVisible = true diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt index 56a1701d..031da0f3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/SettingsActivity.kt @@ -9,25 +9,25 @@ import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity class SettingsActivity : PokerAnalyticsActivity() { - companion object { - fun newInstance(context: Context) { - val intent = Intent(context, SettingsActivity::class.java) - context.startActivity(intent) - } + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, SettingsActivity::class.java) + context.startActivity(intent) + } - /** - * Create a new instance for result - */ - fun newInstanceForResult(fragment: Fragment, requestCode: Int) { - val intent = Intent(fragment.requireContext(), SettingsActivity::class.java) - fragment.startActivityForResult(intent, requestCode) - } + /** + * Create a new instance for result + */ + fun newInstanceForResult(fragment: Fragment, requestCode: Int) { + val intent = Intent(fragment.requireContext(), SettingsActivity::class.java) + fragment.startActivityForResult(intent, requestCode) + } - } + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_settings) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt similarity index 53% rename from app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt rename to app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt index e0a840d9..4a9ef680 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/GraphActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/StatisticDetailsActivity.kt @@ -4,17 +4,14 @@ import android.content.Context import android.content.Intent import android.os.Bundle import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_graph.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity -import net.pokeranalytics.android.ui.fragment.GraphFragment +import net.pokeranalytics.android.ui.fragment.GraphParameters -class GraphParameters(stat: Stat, entries: List) { - var stat: Stat = stat - var entries: List = entries -} -class GraphActivity : PokerAnalyticsActivity() { +class StatisticDetailsActivity : PokerAnalyticsActivity() { private enum class IntentKey(val keyName: String) { STAT("STAT"), @@ -30,10 +27,8 @@ class GraphActivity : PokerAnalyticsActivity() { * Default constructor */ fun newInstance(context: Context, stat: Stat, entries: List) { - - GraphActivity.parameters = GraphParameters(stat, entries) - - val intent = Intent(context, GraphActivity::class.java) + parameters = GraphParameters(stat, entries) + val intent = Intent(context, StatisticDetailsActivity::class.java) context.startActivity(intent) } @@ -41,7 +36,7 @@ class GraphActivity : PokerAnalyticsActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_graph) + setContentView(R.layout.activity_statistic_details) initUI() } @@ -50,20 +45,6 @@ class GraphActivity : PokerAnalyticsActivity() { */ private fun initUI() { - val fragmentManager = supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() - val fragment = GraphFragment() - - fragmentTransaction.add(R.id.container, fragment) - fragmentTransaction.commit() - - GraphActivity.parameters?.let { - fragment.setData(it.stat, it.entries) - GraphActivity.parameters = null - } ?: run { - throw Exception("Missing graph parameters") - } - } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt new file mode 100644 index 00000000..193065c5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/ComparisonChartPagerAdapter.kt @@ -0,0 +1,80 @@ +package net.pokeranalytics.android.ui.adapter + +import android.content.Context +import android.util.SparseArray +import android.view.ViewGroup +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.* +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import java.lang.ref.WeakReference + +/** + * Comparison Chart Pager Adapter + */ +class ComparisonChartPagerAdapter(val context: Context, fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) { + + var weakReferences = SparseArray>() + + override fun getItem(position: Int): PokerAnalyticsFragment { + return when (position) { + 0 -> GraphFragment() + 1 -> GraphFragment() + 2 -> CalendarFragment.newInstance() + else -> HistoryFragment.newInstance() + } + } + + override fun getCount(): Int { + return 3 + } + + override fun getPageTitle(position: Int): CharSequence? { + return when(position) { + 0 -> context.getString(R.string.bar) + 1 -> context.getString(R.string.line) + 2-> context.getString(R.string.table) + else -> super.getPageTitle(position) + } + } + + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + super.destroyItem(container, position, `object`) + weakReferences.remove(position) + } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val fragment = super.instantiateItem(container, position) as PokerAnalyticsFragment + weakReferences.put(position, WeakReference(fragment)) + return fragment + } + + override fun getItemPosition(obj: Any): Int { + return when (obj) { + //CLEAN + /* + HistoryFragment::class.java -> 0 + StatsFragment::class.java -> 1 + SettingsFragment::class.java -> 2 + */ + HistoryFragment::class.java -> 0 + StatsFragment::class.java -> 1 + CalendarFragment::class.java -> 2 + ReportsFragment::class.java -> 3 + MoreFragment::class.java -> 4 + else -> -1 + } + } + + /** + * Return the fragment at the position key + */ + fun getFragment(key: Int): PokerAnalyticsFragment? { + if (weakReferences.get(key) != null) { + return weakReferences.get(key).get() + } + return null + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt similarity index 88% rename from app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt rename to app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt index 8a642069..e860242e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/ChipGroupExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/ChipGroupExtension.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.util.extensions +package net.pokeranalytics.android.ui.extensions import com.google.android.material.chip.ChipGroup diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt similarity index 91% rename from app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt rename to app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt index 06f89e3b..e7535db1 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/extensions/UIExtensions.kt @@ -1,4 +1,4 @@ -package net.pokeranalytics.android.util.extensions +package net.pokeranalytics.android.ui.extensions import android.content.ActivityNotFoundException import android.content.Context @@ -7,10 +7,12 @@ import android.content.res.Resources import android.net.Uri import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.appcompat.widget.AppCompatTextView import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.ContextCompat import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.TextFormat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.util.DeviceUtils @@ -100,4 +102,9 @@ fun showAlertDialog(context: Context, title: Int? = null, message: Int? = null) } builder.setPositiveButton(R.string.ok, null) builder.show() +} + +fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { + this.setTextColor(textFormat.getColor(context)) + this.text = textFormat.text } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt new file mode 100644 index 00000000..eb2d3041 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ComparisonChartFragment.kt @@ -0,0 +1,122 @@ +package net.pokeranalytics.android.ui.fragment + +import android.os.Bundle +import android.view.* +import kotlinx.android.synthetic.main.fragment_comparison_chart.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.activity.BankrollActivity +import net.pokeranalytics.android.ui.activity.SettingsActivity +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.adapter.ComparisonChartPagerAdapter +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.MoreTabRow +import net.pokeranalytics.android.ui.extensions.toast + +class ComparisonChartFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { + + companion object { + + /** + * Create new instance + */ + fun newInstance(): ComparisonChartFragment { + val fragment = ComparisonChartFragment() + val bundle = Bundle() + fragment.arguments = bundle + return fragment + } + + val rowRepresentation: List by lazy { + val rows = ArrayList() + rows.addAll(MoreTabRow.values()) + rows + } + + } + + private lateinit var parentActivity: PokerAnalyticsActivity + private lateinit var viewPagerAdapter: ComparisonChartPagerAdapter + private var comparisonChartMenu: Menu? = null + + + // Life Cycle + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_comparison_chart, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initData() + initUI() + } + + override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { + inflater?.inflate(R.menu.toolbar_comparison_chart, menu) + this.comparisonChartMenu = menu + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item!!.itemId) { + R.id.settings -> openChangeStatistics() + } + return true + } + + // Rows + override fun adapterRows(): List? { + return rowRepresentation + } + + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + super.onRowSelected(position, row, fromAction) + when(row) { + MoreTabRow.BANKROLL -> BankrollActivity.newInstance(requireContext()) + MoreTabRow.SETTINGS -> SettingsActivity.newInstance(requireContext()) + } + } + + // Business + + /** + * Init data + */ + private fun initData() { + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + toolbar.title = "Comparison chart" + + viewPagerAdapter = ComparisonChartPagerAdapter(requireContext(), parentActivity.supportFragmentManager) + viewPager.adapter = viewPagerAdapter + viewPager.offscreenPageLimit = 2 + + tabs.setupWithViewPager(viewPager) + + } + + /** + * Open change statistics + */ + private fun openChangeStatistics() { + //TODO + toast("Open change statistics") + } + +} \ No newline at end of file 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 44e8b118..9b0123c7 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 @@ -52,7 +52,7 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.editable_data, menu) + inflater?.inflate(R.menu.toolbar_editable_data, menu) this.editableMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt index 8a9915a4..c470f429 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/FiltersFragment.kt @@ -71,7 +71,7 @@ open class FiltersFragment : PokerAnalyticsFragment(), StaticRowRepresentableDat } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.editable_data, menu) + inflater?.inflate(R.menu.toolbar_editable_data, menu) this.filterMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt index 6afffdbf..7e0b6647 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/GraphFragment.kt @@ -9,7 +9,6 @@ import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.LineData -import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.listener.OnChartValueSelectedListener import com.google.android.material.chip.Chip @@ -21,19 +20,25 @@ import net.pokeranalytics.android.calculus.ObjectIdentifier import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.ui.graph.PALineDataSet import net.pokeranalytics.android.ui.graph.setStyle import net.pokeranalytics.android.ui.view.LegendView -import net.pokeranalytics.android.util.extensions.ChipGroupExtension -import net.pokeranalytics.android.util.extensions.px -import net.pokeranalytics.android.util.extensions.toast +import net.pokeranalytics.android.ui.extensions.ChipGroupExtension +import net.pokeranalytics.android.ui.extensions.px +import net.pokeranalytics.android.ui.extensions.toast import java.text.DateFormat +class GraphParameters(stat: Stat, entries: List) { + var stat: Stat = stat + var entries: List = entries +} + class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private lateinit var parentActivity: PokerAnalyticsActivity - lateinit var stat: Stat - lateinit var entries: List + private var stat: Stat = Stat.NETRESULT + private var entries: List = ArrayList() lateinit var legendView: LegendView lateinit var chartView: BarLineChartBase<*> @@ -62,21 +67,13 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { private fun initUI() { parentActivity = activity as PokerAnalyticsActivity + parentActivity.title = stat.localizedTitle(requireContext()) this.legendView = LegendView(requireContext()) this.legendContainer.addView(this.legendView) this.legendView.prepareWithStat(this.stat, this.entries.size) - // Avoid a bug during setting the title - toolbar.title = "" - - parentActivity.setSupportActionBar(toolbar) - parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - setHasOptionsMenu(true) - - toolbar.title = stat.localizedTitle(requireContext()) - - val dataSet = LineDataSet(this.entries, this.stat.name) + val dataSet = PALineDataSet(this.entries, this.stat.name, requireContext()) val colors = arrayOf(R.color.green_light).toIntArray() dataSet.setColors(colors, context) dataSet.setDrawCircles(false) @@ -96,9 +93,11 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chartContainer.addView(this.chartView) - this.chartView.setStyle(requireContext()) + this.chartView.setStyle(false, requireContext()) this.chartView.setOnChartValueSelectedListener(this) + this.chartView.highlightValue((this.entries.size - 1).toFloat(), 0) + this.stat.aggregationTypes.forEach { type -> val chip = Chip(requireContext()) chip.id = type.ordinal @@ -108,6 +107,8 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { this.chipGroup.addView(chip) } + this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) + this.chipGroup.setOnCheckedChangeListener(object : ChipGroupExtension.SingleSelectionOnCheckedListener() { override fun onCheckedChanged(group: ChipGroup, checkedId: Int) { super.onCheckedChanged(group, checkedId) @@ -115,7 +116,6 @@ class GraphFragment : PokerAnalyticsFragment(), OnChartValueSelectedListener { } }) - this.chipGroup.check(this.stat.aggregationTypes.first().ordinal) } // OnChartValueSelectedListener diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt index 8dc97324..7883f75e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ReportsFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.fragment_stats.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.activity.ComparisonChartActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource @@ -56,6 +57,11 @@ class ReportsFragment : PokerAnalyticsFragment(), StaticRowRepresentableDataSour return rowRepresentation } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { + super.onRowSelected(position, row, fromAction) + ComparisonChartActivity.newInstance(requireContext()) + } + // Business 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 41fdd733..45767d22 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 @@ -63,7 +63,7 @@ class SessionFragment : PokerAnalyticsFragment(), RowRepresentableDelegate { } override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { - inflater?.inflate(R.menu.session_toolbar, menu) + inflater?.inflate(R.menu.toolbar_session, menu) this.sessionMenu = menu updateMenuUI() super.onCreateOptionsMenu(menu, inflater) 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 7348188b..3d681cee 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 @@ -25,15 +25,14 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.URL import net.pokeranalytics.android.util.UserDefaults -import net.pokeranalytics.android.util.extensions.openContactMail -import net.pokeranalytics.android.util.extensions.openPlayStorePage -import net.pokeranalytics.android.util.extensions.openUrl +import net.pokeranalytics.android.ui.extensions.openContactMail +import net.pokeranalytics.android.ui.extensions.openPlayStorePage +import net.pokeranalytics.android.ui.extensions.openUrl import java.util.* class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, StaticRowRepresentableDataSource { - private lateinit var parentActivity: PokerAnalyticsActivity companion object { @@ -56,15 +55,8 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta const val REQUEST_CODE_CURRENCY: Int = 100 } - override fun stringForRow(row: RowRepresentable): String { - return when (row) { - SettingRow.VERSION -> BuildConfig.VERSION_NAME + if (BuildConfig.DEBUG) " (${BuildConfig.VERSION_CODE}) DEBUG" else "" - SettingRow.CURRENCY -> UserDefaults.currency.symbol - else -> "" - } - } - private lateinit var settingsAdapterRow: RowRepresentableAdapter + private lateinit var parentActivity: PokerAnalyticsActivity override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -97,6 +89,14 @@ class SettingsFragment : PokerAnalyticsFragment(), RowRepresentableDelegate, Sta return rowRepresentation } + override fun stringForRow(row: RowRepresentable): String { + return when (row) { + SettingRow.VERSION -> BuildConfig.VERSION_NAME + if (BuildConfig.DEBUG) " (${BuildConfig.VERSION_CODE}) DEBUG" else "" + SettingRow.CURRENCY -> UserDefaults.currency.symbol + else -> "" + } + } + override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { when (row) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt new file mode 100644 index 00000000..50413327 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatisticDetailsFragment.kt @@ -0,0 +1,79 @@ +package net.pokeranalytics.android.ui.fragment + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.fragment_statistic_details.* +import net.pokeranalytics.android.R +import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity +import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity +import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment + +class StatisticDetailsFragment : PokerAnalyticsFragment() { + + companion object { + fun newInstance(context: Context) { + val intent = Intent(context, StatisticDetailsFragment::class.java) + context.startActivity(intent) + } + } + + private lateinit var parentActivity: PokerAnalyticsActivity + + private var stat: Stat = Stat.NETRESULT + private var entries: List = ArrayList() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_statistic_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initUI() + } + + /** + * Init UI + */ + private fun initUI() { + + parentActivity = activity as PokerAnalyticsActivity + + // Avoid a bug during setting the title + toolbar.title = "" + + parentActivity.setSupportActionBar(toolbar) + parentActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + setHasOptionsMenu(true) + + toolbar.title = stat.localizedTitle(requireContext()) + + val fragmentManager = parentActivity.supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + val fragment = GraphFragment() + + fragmentTransaction.add(R.id.container, fragment) + fragmentTransaction.commit() + + StatisticDetailsActivity.parameters?.let { + fragment.setData(it.stat, it.entries) + StatisticDetailsActivity.parameters = null + } ?: run { + throw Exception("Missing graph parameters") + } + } + + /** + * Set data + */ + fun setData(stat: Stat, entries: List) { + this.stat = stat + this.entries = entries + } + +} \ No newline at end of file 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 65cb1378..14202d82 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 @@ -12,7 +12,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.* import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.filter.QueryCondition -import net.pokeranalytics.android.ui.activity.GraphActivity +import net.pokeranalytics.android.ui.activity.StatisticDetailsActivity import net.pokeranalytics.android.ui.adapter.DisplayDescriptor import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -199,7 +199,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { - if (row is StatRepresentable) { + if (row is StatRepresentable && row.stat.hasEvolutionGraph) { // filter groups val groupResults = this.report?.results?.filter { @@ -237,7 +237,7 @@ class StatsFragment : SessionObserverFragment(), StaticRowRepresentableDataSourc if (!isDetached) { report.results.firstOrNull()?.defaultStatEntries(stat)?.let { entries -> - GraphActivity.newInstance(requireContext(), stat, entries) + StatisticDetailsActivity.newInstance(requireContext(), stat, entries) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 57c17392..f883c7f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -97,7 +97,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { private fun initUI() { row.let { bottomSheetToolbar.title = row.localizedTitle(requireContext()) - bottomSheetToolbar.inflateMenu(R.menu.bottom_sheet_menu) + bottomSheetToolbar.inflateMenu(R.menu.toolbar_bottom_sheet) bottomSheetToolbar.setOnMenuItemClickListener { false } 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 919acd05..3782f246 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 @@ -14,7 +14,7 @@ import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorExcep import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.extensions.px /** * Bottom Sheet List Game Fragment 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 e2a7ac37..7c199c09 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 @@ -13,7 +13,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.extensions.px class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowRepresentableDataSource, RowRepresentableDelegate { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt new file mode 100644 index 00000000..df878d24 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/ChartDataSet.kt @@ -0,0 +1,15 @@ +package net.pokeranalytics.android.ui.graph + +import android.content.Context +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineDataSet +import net.pokeranalytics.android.R + +class PALineDataSet(yVals: List, label: String, context: Context) : LineDataSet(yVals, label) { + + init { + this.highLightColor = context.getColor(R.color.chart_highlight_indicator) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt index ee94423e..e5f6e8a9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/graph/GraphExtensions.kt @@ -1,76 +1,61 @@ package net.pokeranalytics.android.ui.graph import android.content.Context +import android.graphics.Typeface import androidx.core.content.ContextCompat import com.github.mikephil.charting.charts.BarLineChartBase import com.github.mikephil.charting.components.XAxis import net.pokeranalytics.android.R -import net.pokeranalytics.android.util.extensions.px +import net.pokeranalytics.android.ui.extensions.px -//fun BarChart.setStyle(context: Context) { -// GraphHelper.setStyle(this, context) -//} +fun BarLineChartBase<*>.setStyle(small: Boolean, context: Context) { -fun BarLineChartBase<*>.setStyle(context: Context) { - GraphHelper.setStyle(this, context) -} + // X Axis + this.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.labelCount = 4 + this.xAxis.position = XAxis.XAxisPosition.BOTTOM -class GraphHelper { + this.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.xAxis.typeface = Typeface.DEFAULT + this.xAxis.labelCount = 4 + this.xAxis.position = XAxis.XAxisPosition.BOTTOM - companion object { + this.xAxis.setDrawLabels(true) + this.xAxis.setDrawGridLines(true) + this.xAxis.granularity = 1.0f + this.xAxis.isGranularityEnabled = true + this.xAxis.isEnabled = true - fun setStyle(chart: BarLineChartBase<*>, context: Context) { + // Y Axis + this.axisLeft.setDrawAxisLine(false) + this.axisLeft.setDrawGridLines(true) + this.axisLeft.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - chart.xAxis.axisLineColor = ContextCompat.getColor(context, R.color.chart_default) - chart.xAxis.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) - chart.xAxis.textColor = ContextCompat.getColor(context, R.color.chart_default) - chart.xAxis.labelCount = 4 - chart.xAxis.position = XAxis.XAxisPosition.BOTTOM + this.axisLeft.setDrawZeroLine(true) +// this.axisLeft.zeroLineWidth = 1.0f.px + this.axisLeft.zeroLineColor = ContextCompat.getColor(context, R.color.chart_default) - chart.axisLeft.enableGridDashedLine(3.0f.px, 5.0f.px, 1.0f.px) + this.axisLeft.isGranularityEnabled = true + this.axisLeft.granularity = 1.0f -// this.xAxis.axisLineWidth = ChartAppearance.lineWidth -// this.xAxis.enableGridDashedLine(3.0f, 5.0f, 1.0f) -// -// this.xAxis.labelTextColor = ChartAppearance.defaultColor -// this.xAxis.labelFont = Fonts.graphAxis -// this.xAxis.labelCount = 4 -// this.xAxis.labelPosition = .bottom -// -// this.xAxis.drawLabelsEnabled = true -// this.xAxis.drawGridLinesEnabled = true -// this.xAxis.granularity = 1.0 -// this.xAxis.granularityEnabled = true -// this.xAxis.enabled = true -// -// // Y Axis -// this.leftAxis.drawAxisLineEnabled = false -// this.leftAxis.drawGridLinesEnabled = true -// this.leftAxis.gridLineDashLengths = [3.0, 5.0] -// -// this.leftAxis.drawZeroLineEnabled = true -// this.leftAxis.zeroLineWidth = ChartAppearance.lineWidth -// this.leftAxis.zeroLineColor = ChartAppearance.defaultColor -// -// this.leftAxis.granularityEnabled = true -// this.leftAxis.granularity = 1.0 -// -// this.leftAxis.labelTextColor = ChartAppearance.defaultColor -// this.leftAxis.labelFont = Fonts.graphAxis -// this.leftAxis.labelCount = small ? 1 : 7 // @todo not great if interval is [0..2] for number of records as we get decimals -// + this.axisLeft.textColor = ContextCompat.getColor(context, R.color.chart_default) + this.axisLeft.typeface = Typeface.DEFAULT + this.axisLeft.labelCount = + if (small) 1 else 7 // @todo not great if interval is [0..2] for number of records as we get decimals + + this.axisRight.isEnabled = false + this.legend.isEnabled = false + + +// @todo // if timeYAxis { -// this.leftAxis.valueFormatter = HourValueFormatter() +// this.axisLeft.valueFormatter = HourValueFormatter() // } else { -// this.leftAxis.valueFormatter = LargeNumberFormatter() +// this.axisLeft.valueFormatter = LargeNumberFormatter() // } // -// this.rightAxis.enabled = false -// -// this.legend.enabled = false - - } - } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt index 03552cde..eab4bfe2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/LegendView.kt @@ -5,11 +5,12 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.FrameLayout import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible import kotlinx.android.synthetic.main.layout_legend_default.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.TextFormat -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat /** * Display a row session @@ -48,8 +49,14 @@ class LegendView : FrameLayout { */ fun prepareWithStat(stat: Stat, counter: Int) { - this.stat1Name.text = stat.localizedTitle(context) - this.stat2Name.text = stat.cumulativeLabelResId(context) + if (stat.significantIndividualValue) { + this.stat1Name.text = stat.localizedTitle(context) + this.stat2Name.text = stat.cumulativeLabelResId(context) + } else { + this.stat1Name.text = stat.cumulativeLabelResId(context) + this.stat2Name.isVisible = false + } + this.counter.text = "$counter ${context.getString(R.string.sessions)}" } @@ -60,8 +67,13 @@ class LegendView : FrameLayout { fun setItemData(stat: Stat, title: String, statFormat1: TextFormat, statFormat2: TextFormat) { this.title.text = title - this.stat1Value.setTextFormat(statFormat1, context) - this.stat2Value.setTextFormat(statFormat2, context) + + if (stat.significantIndividualValue) { + this.stat1Value.setTextFormat(statFormat1, context) + this.stat2Value.setTextFormat(statFormat2, context) + } else { + this.stat1Value.setTextFormat(statFormat2, context) + } } 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 1659120d..387756b9 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 @@ -13,10 +13,11 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_transaction.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable /** @@ -232,11 +233,13 @@ enum class RowViewType(private var layoutRes: Int) { itemView.findViewById(R.id.value)?.let { view -> adapter.dataSource.contentDescriptorForRow(row)?.textFormat?.let { view.setTextFormat(it, itemView.context) -// view.text = it.text -// view.setTextColor(it.getColor(itemView.context)) } } + if (row is StatRepresentable) { + itemView.findViewById(R.id.nextArrow)?.isVisible = row.stat.hasEvolutionGraph + } + // Listener val listener = View.OnClickListener { adapter.delegate?.onRowSelected(position, row) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt index bce8118f..362a83fb 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/SessionRowView.kt @@ -15,7 +15,7 @@ import net.pokeranalytics.android.model.TournamentType 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.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName import net.pokeranalytics.android.util.extensions.shortTime @@ -151,8 +151,6 @@ class SessionRowView : FrameLayout { val result = session.result?.net ?: 0.0 val formattedStat = ComputedStat(Stat.NETRESULT, result, currency = session.currency).format(context) rowHistorySession.gameResult.setTextFormat(formattedStat, context) -// rowHistorySession.gameResult.setTextColor(formattedStat.getColor(context)) -// rowHistorySession.gameResult.text = formattedStat.text } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt index 25f3b5a3..6ccb8219 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/TransactionRowView.kt @@ -10,7 +10,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.model.realm.Transaction -import net.pokeranalytics.android.ui.view.fields.setTextFormat +import net.pokeranalytics.android.ui.extensions.setTextFormat import net.pokeranalytics.android.util.extensions.getDayNumber import net.pokeranalytics.android.util.extensions.getShortDayName @@ -65,8 +65,6 @@ class TransactionRowView : FrameLayout { // Amount val formattedStat = ComputedStat(Stat.NETRESULT, transaction.amount).format(context) rowTransaction.transactionAmount.setTextFormat(formattedStat, context) -// rowTransaction.transactionAmount.setTextColor(formattedStat.getColor(context)) -// rowTransaction.transactionAmount.text = formattedStat.text } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt deleted file mode 100644 index 1a7b35c5..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/fields/FieldsExtension.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.pokeranalytics.android.ui.view.fields - -import android.content.Context -import androidx.appcompat.widget.AppCompatTextView -import net.pokeranalytics.android.calculus.TextFormat - -fun AppCompatTextView.setTextFormat(textFormat: TextFormat, context: Context) { - this.setTextColor(textFormat.getColor(context)) - this.text = textFormat.text -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_comparison_chart.xml b/app/src/main/res/layout/activity_comparison_chart.xml new file mode 100644 index 00000000..9ef4638e --- /dev/null +++ b/app/src/main/res/layout/activity_comparison_chart.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_graph.xml b/app/src/main/res/layout/activity_graph.xml index b1ce6c7a..44e1e283 100644 --- a/app/src/main/res/layout/activity_graph.xml +++ b/app/src/main/res/layout/activity_graph.xml @@ -1,8 +1,26 @@ - + + + android:layout_height="?attr/actionBarSize" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:title="@string/app_name" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 275db019..d5788e1c 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -34,6 +34,6 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:menu="@menu/navigation" /> + app:menu="@menu/navigation_home" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_statistic_details.xml b/app/src/main/res/layout/activity_statistic_details.xml new file mode 100644 index 00000000..62d1cb20 --- /dev/null +++ b/app/src/main/res/layout/activity_statistic_details.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_comparison_chart.xml b/app/src/main/res/layout/fragment_comparison_chart.xml new file mode 100644 index 00000000..e24de7cb --- /dev/null +++ b/app/src/main/res/layout/fragment_comparison_chart.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evograph.xml b/app/src/main/res/layout/fragment_evograph.xml index eba9d9ac..63506299 100644 --- a/app/src/main/res/layout/fragment_evograph.xml +++ b/app/src/main/res/layout/fragment_evograph.xml @@ -5,22 +5,13 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + diff --git a/app/src/main/res/layout/layout_legend_default.xml b/app/src/main/res/layout/layout_legend_default.xml index 4d65f59a..e5684cbf 100644 --- a/app/src/main/res/layout/layout_legend_default.xml +++ b/app/src/main/res/layout/layout_legend_default.xml @@ -88,7 +88,7 @@ android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/stat2Value" + app:layout_constraintTop_toBottomOf="@id/stat1Value" tools:text="152 sessions" /> \ No newline at end of file diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation_home.xml similarity index 100% rename from app/src/main/res/menu/navigation.xml rename to app/src/main/res/menu/navigation_home.xml diff --git a/app/src/main/res/menu/bottom_sheet_menu.xml b/app/src/main/res/menu/toolbar_bottom_sheet.xml similarity index 100% rename from app/src/main/res/menu/bottom_sheet_menu.xml rename to app/src/main/res/menu/toolbar_bottom_sheet.xml diff --git a/app/src/main/res/menu/toolbar_comparison_chart.xml b/app/src/main/res/menu/toolbar_comparison_chart.xml new file mode 100644 index 00000000..2132026e --- /dev/null +++ b/app/src/main/res/menu/toolbar_comparison_chart.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/editable_data.xml b/app/src/main/res/menu/toolbar_editable_data.xml similarity index 100% rename from app/src/main/res/menu/editable_data.xml rename to app/src/main/res/menu/toolbar_editable_data.xml diff --git a/app/src/main/res/menu/home_menu.xml b/app/src/main/res/menu/toolbar_home.xml similarity index 100% rename from app/src/main/res/menu/home_menu.xml rename to app/src/main/res/menu/toolbar_home.xml diff --git a/app/src/main/res/menu/session_toolbar.xml b/app/src/main/res/menu/toolbar_session.xml similarity index 100% rename from app/src/main/res/menu/session_toolbar.xml rename to app/src/main/res/menu/toolbar_session.xml diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 65d61cb7..16a219a4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -38,5 +38,6 @@ #8e35c8 #5c7258 + #f8ffe5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 958ed4bf..3e35818b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ Minute More Variant + Line diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4853c382..58c93d7e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -19,6 +19,7 @@ @style/PokerAnalyticsTheme.TextView @style/PokerAnalyticsTheme.AlertDialog @style/PokerAnalyticsTheme.Chip + @style/PokerAnalyticsTheme.TabLayout @@ -179,6 +180,14 @@ @font/roboto + + +