diff --git a/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt b/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt index f7504c4f..a7caa4a5 100644 --- a/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt +++ b/app/src/main/java/net/pokeranalytics/android/calculus/ReportWhistleBlower.kt @@ -12,6 +12,7 @@ import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurati import net.pokeranalytics.android.model.LiveOnline import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.view.rows.StaticReport +import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.extensions.formattedHourlyDuration import timber.log.Timber import kotlin.coroutines.CoroutineContext @@ -32,7 +33,7 @@ class ReportWhistleBlower(var context: Context) { private val listeners: MutableList = mutableListOf() - private var paused: Boolean = false + var paused: Boolean = false private var timer: CountDownTimer? = null @@ -65,6 +66,7 @@ class ReportWhistleBlower(var context: Context) { // Timber.d(">>> Launch report") if (paused) { + CrashLogging.log("can't start reports comparisons because of paused state") return } @@ -131,10 +133,13 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co private var cancelled = false + var handler: (() -> Unit)? = null + private val coroutineContext: CoroutineContext get() = Dispatchers.Default fun start() { + messages.add("Starting task...") launchReports() } @@ -142,6 +147,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co this.cancelled = true } + var messages: MutableList = mutableListOf() + private fun launchReports() { CoroutineScope(coroutineContext).launch { @@ -190,14 +197,18 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co } private fun launchOptimalDuration(realm: Realm, report: StaticReport) { - LiveOnline.values().forEach { key -> + LiveOnline.entries.forEach { key -> val duration = CashGameOptimalDurationCalculator.start(key.isLive) analyseOptimalDuration(realm, report, key, duration) } + + this.handler?.let { it() } } private fun analyseDefaultReport(realm: Realm, staticReport: StaticReport, result: Report) { + messages.add("Analyse report $staticReport...") + val nameSeparator = " " for (stat in result.options.stats) { @@ -217,6 +228,7 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co // Store if necessary, delete if necessary val bestComputedResults = result.max(stat) bestComputedResults?.let { computedResults -> + messages.add("found new perf...") val performanceQuery = computedResults.group.query val performanceName = performanceQuery.getName(this.context, nameSeparator) @@ -225,6 +237,8 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co var storePerf = true currentPerf?.let { + messages.add("has current perf...") + currentPerf.name?.let { name -> if (computedResults.group.query.getName(this.context, nameSeparator) == name) { storePerf = false @@ -246,6 +260,7 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co } } + messages.add("storePerf = $storePerf...") if (currentPerf == null && storePerf) { val performance = Performance( @@ -261,6 +276,9 @@ class ReportTask(private var whistleBlower: ReportWhistleBlower, var context: Co } } ?: run { // if there is no max but a now irrelevant Performance, we delete it + + messages.add("deletes current perf if necessary: $currentPerf...") + // Timber.d("NO best computed value, current perf = $currentPerf ") currentPerf?.let { perf -> realm.executeTransaction { 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 02ed5483..bdb73611 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 @@ -1,6 +1,8 @@ package net.pokeranalytics.android.ui.fragment import android.app.Activity +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.os.Bundle @@ -8,6 +10,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import io.realm.RealmResults @@ -18,6 +21,8 @@ import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.NewPerformanceListener +import net.pokeranalytics.android.calculus.ReportTask +import net.pokeranalytics.android.calculus.ReportWhistleBlower import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.calcul.ReportDisplay import net.pokeranalytics.android.databinding.FragmentReportsBinding @@ -26,6 +31,7 @@ import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.Performance import net.pokeranalytics.android.model.realm.ReportSetup +import net.pokeranalytics.android.model.realm.Result import net.pokeranalytics.android.ui.activity.ReportCreationActivity import net.pokeranalytics.android.ui.activity.components.ReportActivity import net.pokeranalytics.android.ui.activity.components.RequestCode @@ -41,7 +47,7 @@ import net.pokeranalytics.android.ui.view.rows.StaticReport import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.Preferences import timber.log.Timber -import java.util.* +import java.util.Date data class ReportSection(val report: StaticReport, var performances: MutableList) { @@ -182,10 +188,24 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc adapter = dataListAdapter } - binding.addButton.setOnClickListener { + binding.addButton.setOnClickListener { ReportCreationActivity.newInstanceForResult(this, requireContext()) } + val sessionCount = getRealm().where(Result::class.java).count() + binding.computeButton.isVisible = adapterRows.isEmpty() && sessionCount > 5 + binding.computeButton.setOnClickListener { + + try { + forceReportWhistleBlowerStart() + } catch (e: Exception) { + e.message?.let { + this.showSnackBar(it) + } + } + + } + this.paApplication?.reportWhistleBlower?.addListener(this) } @@ -199,7 +219,7 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc private fun updateRows() { this.adapterRows.clear() - if (this.reportSetups.size > 0) { + if (this.reportSetups.isNotEmpty()) { adapterRows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.custom)) adapterRows.addAll(this.reportSetups) } @@ -342,4 +362,32 @@ class ReportsFragment : DeletableItemFragment(), StaticRowRepresentableDataSourc } + private fun forceReportWhistleBlowerStart() { + + val rwb = ReportWhistleBlower(requireContext()) + val reportTask = ReportTask(rwb, requireContext()) + reportTask.handler = { + + Timber.d("test") + + val paused = paApplication?.reportWhistleBlower?.paused + reportTask.messages.add(">>> main RWB paused = $paused") + + val message = reportTask.messages.joinToString("\n") + CoroutineScope(coroutineContext).launch(Dispatchers.Main) { + Timber.d("test2") + + copyToClipboard(requireContext(), message) + } + } + + reportTask.start() + + } + + fun copyToClipboard(context: Context, text: String) { + val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("label", text) + clipboard.setPrimaryClip(clip) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_reports.xml b/app/src/main/res/layout/fragment_reports.xml index 46542025..b3f3a32c 100644 --- a/app/src/main/res/layout/fragment_reports.xml +++ b/app/src/main/res/layout/fragment_reports.xml @@ -66,4 +66,18 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> + + \ No newline at end of file