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 31094164..9b2aac56 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/Calculator.kt @@ -27,11 +27,11 @@ import kotlin.math.min class Calculator { /** - * The options used for calculations or display + * The options used for calculations and display */ class Options( var display: Display = Display.TABLE, - evolutionValues: EvolutionValues = EvolutionValues.NONE, + progressValues: ProgressValues = ProgressValues.NONE, var stats: List = listOf(), var criterias: List = listOf(), query: Query = Query(), @@ -41,14 +41,20 @@ class Calculator { var reportSetupId: String? = null ) { - var evolutionValues: EvolutionValues = evolutionValues + /** + * Specifies whether progress values should be added and their kind + */ + var progressValues: ProgressValues = progressValues get() { - if (field == EvolutionValues.NONE && this.display == Display.PROGRESS) { - return EvolutionValues.STANDARD + if (field == ProgressValues.NONE && this.display == Display.PROGRESS) { + return ProgressValues.STANDARD } return field } + /** + * The query used to filter data + */ private var _query: Query = query init { @@ -56,14 +62,14 @@ class Calculator { throw IllegalStateException("Can't specify a query with conditions AND a filter") } - when (this.aggregationType) { - AggregationType.MONTH -> this.criterias = listOf(Criteria.AllMonthsUpToNow) - AggregationType.YEAR -> this.criterias = listOf(Criteria.Years) - else -> {} + this.aggregationType?.let { + this.criterias = it.criterias } - } + /** + * The query used, either filter query or the provided query + */ val query: Query get() { this.filter?.let { @@ -73,7 +79,7 @@ class Calculator { } /** - * The way the statIds are going to be displayed + * The way the computed stats are going to be displayed */ enum class Display : RowRepresentable { TABLE, @@ -105,13 +111,12 @@ class Calculator { } } - } /** * The type of evolution numericValues */ - enum class EvolutionValues { + enum class ProgressValues { NONE, STANDARD, TIMED @@ -130,23 +135,37 @@ class Calculator { return false } + /** + * Whether the longest streaks should be computed + */ val computeLongestStreak: Boolean get() { return this.stats.contains(LONGEST_STREAKS) } + /** + * Whether the values should be sorted + */ val shouldSortValues: Boolean get() { - return this.evolutionValues != EvolutionValues.NONE || this.computeLongestStreak + return this.progressValues != ProgressValues.NONE || this.computeLongestStreak } + /** + * Whether the number of locations played should be computed + */ val computeLocationsPlayed: Boolean get() { return this.stats.contains(LOCATIONS_PLAYED) } + /** + * Whether the number of days played should be computed + */ val computeDaysPlayed: Boolean get() { return this.stats.contains(DAYS_PLAYED) } - + /** + * Whether progress values should be managed at the group level + */ val shouldManageMultiGroupProgressValues: Boolean get() { return if (this.aggregationType != null) { @@ -178,13 +197,15 @@ class Calculator { stats: List? = null ): Report { - val options = Options(display = Options.Display.PROGRESS, - evolutionValues = Options.EvolutionValues.STANDARD, + val options = Options( + display = Options.Display.PROGRESS, + progressValues = Options.ProgressValues.STANDARD, stats = listOf(stat), - aggregationType = aggregationType) + aggregationType = aggregationType + ) if (aggregationType == AggregationType.DURATION) { - options.evolutionValues = Options.EvolutionValues.TIMED + options.progressValues = Options.ProgressValues.TIMED } stats?.let { @@ -227,7 +248,7 @@ class Calculator { val report = Report(options) groups.forEach { group -> -// val s = Date() + // val s = Date() // Clean existing computables / sessionSets if group is reused group.cleanup() @@ -325,7 +346,7 @@ class Calculator { } val shouldIterateOverComputables = - (options.evolutionValues == Options.EvolutionValues.STANDARD || options.computeLongestStreak) + (options.progressValues == Options.ProgressValues.STANDARD || options.computeLongestStreak) // Computable Result if (shouldIterateOverComputables) { @@ -419,7 +440,7 @@ class Calculator { } val shouldIterateOverSets = computableGroup.conditions.isNotEmpty() || - options.evolutionValues != Options.EvolutionValues.NONE || + options.progressValues != Options.ProgressValues.NONE || options.computeDaysPlayed // Session Set @@ -450,8 +471,8 @@ class Calculator { tHourlyRateBB = tBBSum / tHourlyDuration daysSet.add(sessionSet.startDate.startOfDay()) - when (options.evolutionValues) { - Options.EvolutionValues.STANDARD -> { + when (options.progressValues) { + Options.ProgressValues.STANDARD -> { results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) results.addEvolutionValue( @@ -472,7 +493,7 @@ class Calculator { } } - Options.EvolutionValues.TIMED -> { + Options.ProgressValues.TIMED -> { results.addEvolutionValue(tRatedNetSum, tHourlyDuration, NET_RESULT, sessionSet) results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) results.addEvolutionValue( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt index 275fdd3b..fc86d727 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt @@ -1,7 +1,9 @@ package net.pokeranalytics.android.ui.activity import android.Manifest +import android.content.Context import android.content.Intent +import android.content.pm.PackageManager import android.os.Bundle import android.os.PersistableBundle import androidx.core.app.ActivityCompat @@ -9,14 +11,36 @@ import io.realm.Realm import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.ImportFragment -import net.pokeranalytics.android.util.csv.CSVImporter import timber.log.Timber class ImportActivity : PokerAnalyticsActivity() { + enum class IntentKey(val keyName: String) { + FILE_PATH("filepath") + } + + companion object { + + /** + * Create a new instance for result + */ + fun newInstance(context: Context, filePath: String) { + context.startActivity(getIntent(context, filePath)) + } + + private fun getIntent(context: Context, filePath: String) : Intent { + val intent = Intent(context, ImportActivity::class.java) + intent.putExtra(ImportActivity.IntentKey.FILE_PATH.keyName, filePath) + return intent + } + } + + override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) + setContentView(R.layout.activity_import) + initUI() } @@ -24,6 +48,7 @@ class ImportActivity : PokerAnalyticsActivity() { override fun onStop() { super.onStop() + // Updates the main thread instance with newly inserted data val realm = Realm.getDefaultInstance() realm.refresh() realm.close() @@ -34,20 +59,19 @@ class ImportActivity : PokerAnalyticsActivity() { val fragmentTransaction = supportFragmentManager.beginTransaction() val fragment = ImportFragment() + val filePath = intent.getStringExtra(ImportActivity.IntentKey.FILE_PATH.keyName) + fragment.setData(filePath) + fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.commit() } - private fun csv() { - - val path = "sdcard/Download/RunGoodSessions1.csv" - val csv = CSVImporter(path) - csv.start() - - ActivityCompat.requestPermissions( - this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_REQUEST_ACCESS_FINE_LOCATION - ) - + private fun requestPermission() { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions( + this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_REQUEST_ACCESS_FINE_LOCATION + ) + } } override fun onNewIntent(intent: Intent?) { @@ -61,7 +85,6 @@ class ImportActivity : PokerAnalyticsActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt index 151cfdd6..77b324f0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt @@ -20,6 +20,7 @@ open class PokerAnalyticsActivity : AppCompatActivity() { companion object { const val PERMISSION_REQUEST_ACCESS_FINE_LOCATION = 1000 + const val PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 1001 const val PLAY_SERVICES_RESOLUTION_REQUEST = 2000 } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt index 72b7bfc3..a58d034b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarDetailsFragment.kt @@ -188,7 +188,7 @@ class CalendarDetailsFragment : PokerAnalyticsFragment(), StaticRowRepresentable val requiredStats: List = listOf(Stat.LOCATIONS_PLAYED, Stat.LONGEST_STREAKS, Stat.DAYS_PLAYED, Stat.STANDARD_DEVIATION_HOURLY) val options = Calculator.Options( - evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + progressValues = Calculator.Options.ProgressValues.STANDARD, stats = requiredStats, query = query ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt index 6ef0f106..238f7f5c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/CalendarFragment.kt @@ -261,7 +261,7 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable monthlyQueries.forEach { query -> val options = Calculator.Options( - evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + progressValues = Calculator.Options.ProgressValues.STANDARD, stats = requiredStats, query = query ) @@ -295,7 +295,7 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable yearConditions.forEach { query -> val options = Calculator.Options( - evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + progressValues = Calculator.Options.ProgressValues.STANDARD, stats = requiredStats, query = query ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt index f1bc88b4..fc084b97 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt @@ -1,11 +1,59 @@ package net.pokeranalytics.android.ui.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.components.RealmFragment +import net.pokeranalytics.android.util.csv.CSVImporter +import timber.log.Timber +import java.util.* +import kotlin.coroutines.CoroutineContext class ImportFragment : RealmFragment() { + val coroutineContext: CoroutineContext + get() = Dispatchers.Main + private lateinit var filePath: String + fun setData(path: String) { + this.filePath = path + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + super.onCreateView(inflater, container, savedInstanceState) + return inflater.inflate(R.layout.fragment_import, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + this.startImport() + } + + fun startImport() { + + GlobalScope.launch(coroutineContext) { + + val test = GlobalScope.async { + val s = Date() + Timber.d(">>> start...") + + val csv = CSVImporter(filePath) + csv.start() + + val e = Date() + val duration = (e.time - s.time) / 1000.0 + Timber.d(">>> Import ended in $duration seconds") + + } + test.await() + } + } } \ No newline at end of file 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 00594ac2..9759ec4e 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 @@ -170,7 +170,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc val requiredStats: List = listOf(Stat.NET_RESULT) val options = Calculator.Options( display = Calculator.Options.Display.COMPARISON, - evolutionValues = Calculator.Options.EvolutionValues.STANDARD, + progressValues = Calculator.Options.ProgressValues.STANDARD, stats = requiredStats, criterias = criteriaList ) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt index 6def0117..8cfaa841 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/AbstractReportFragment.kt @@ -56,11 +56,11 @@ abstract class AbstractReportFragment : DataManagerFragment() { val nameEditText = view.findViewById(R.id.reportName) builder.setView(view) // Add action buttons - .setPositiveButton(R.string.save) { dialog, id -> + .setPositiveButton(R.string.save) { dialog, _ -> saveReport(nameEditText.text.toString()) dialog.dismiss() } - .setNegativeButton(R.string.cancel) { dialog, id -> + .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.cancel() } diff --git a/app/src/main/res/layout/activity_import.xml b/app/src/main/res/layout/activity_import.xml new file mode 100644 index 00000000..70454fb9 --- /dev/null +++ b/app/src/main/res/layout/activity_import.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_new_data.xml b/app/src/main/res/layout/activity_new_data.xml index c64d69c4..e1cdc09b 100644 --- a/app/src/main/res/layout/activity_new_data.xml +++ b/app/src/main/res/layout/activity_new_data.xml @@ -27,7 +27,7 @@ android:transitionName="newButtonTransition" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:background="@color/gray_darker" + android:background="@color/kaki_darker" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -57,7 +57,7 @@ style="@style/PokerAnalyticsTheme.TextView.RowTitle" android:layout_width="160dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" + android:layout_marginStart="16dp" android:text="@string/new_cash_game" app:layout_constraintEnd_toEndOf="parent" /> @@ -88,7 +88,7 @@ style="@style/PokerAnalyticsTheme.TextView.RowTitle" android:layout_width="160dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" + android:layout_marginStart="16dp" android:text="@string/new_tournament" app:layout_constraintEnd_toEndOf="parent" /> @@ -121,7 +121,7 @@ style="@style/PokerAnalyticsTheme.TextView.RowTitle" android:layout_width="160dp" android:layout_height="wrap_content" - android:layout_marginStart="20dp" + android:layout_marginStart="16dp" android:text="@string/new_operation" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/fragment_import.xml b/app/src/main/res/layout/fragment_import.xml new file mode 100644 index 00000000..efbb84d7 --- /dev/null +++ b/app/src/main/res/layout/fragment_import.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a8d685f0..ec3eb74a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -30,6 +30,7 @@ #57815a #657d60 #9bae8d + #283227 #FF5F57