diff --git a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt index 8ec3a204..0c9573ab 100644 --- a/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt +++ b/app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt @@ -11,7 +11,9 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import net.pokeranalytics.android.model.migrations.Patcher import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration +import net.pokeranalytics.android.model.realm.ComputableResult import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.model.realm.SessionSet import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.util.FakeDataManager import net.pokeranalytics.android.util.PokerAnalyticsLogs @@ -40,11 +42,13 @@ class PokerAnalyticsApplication : Application() { .build() Realm.setDefaultConfiguration(realmConfiguration) -// val realm = Realm.getDefaultInstance() -// realm.executeTransaction { -// realm.where(Session::class.java).findAll().deleteAllFromRealm() -// } -// realm.close() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + realm.where(Session::class.java).findAll().deleteAllFromRealm() + realm.where(ComputableResult::class.java).findAll().deleteAllFromRealm() + realm.where(SessionSet::class.java).findAll().deleteAllFromRealm() + } + realm.close() // Set up Crashlytics, disabled for debug builds val crashlyticsKit = Crashlytics.Builder() 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 fc86d727..cd700239 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 @@ -4,8 +4,8 @@ import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.net.Uri import android.os.Bundle -import android.os.PersistableBundle import androidx.core.app.ActivityCompat import io.realm.Realm import net.pokeranalytics.android.R @@ -15,6 +15,8 @@ import timber.log.Timber class ImportActivity : PokerAnalyticsActivity() { + private lateinit var fileURI: Uri + enum class IntentKey(val keyName: String) { FILE_PATH("filepath") } @@ -35,14 +37,16 @@ class ImportActivity : PokerAnalyticsActivity() { } } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { - super.onCreate(savedInstanceState, persistentState) + Timber.d("Start ImportActivity with URI: ${intent.data}") + intent?.data?.let { + this.fileURI = it + } setContentView(R.layout.activity_import) - initUI() - } override fun onStop() { @@ -59,11 +63,28 @@ class ImportActivity : PokerAnalyticsActivity() { val fragmentTransaction = supportFragmentManager.beginTransaction() val fragment = ImportFragment() - val filePath = intent.getStringExtra(ImportActivity.IntentKey.FILE_PATH.keyName) - fragment.setData(filePath) + val fis = contentResolver.openInputStream(fileURI) + Timber.d("Load fragment data with: $fis") + fis?.let { + fragment.setData(it) + } + +// val +// CSVFormat.DEFAULT.parse() + +// val path = fileURI.path(contentResolver) +// Timber.d("Load fragment with path: ${path}") +// +// val file = File(path) +// Timber.d(">>>> length = ${file.length()}") +// +// path?.let { filePath -> +// fragment.setData(filePath) +// } fragmentTransaction.add(R.id.container, fragment) fragmentTransaction.commit() + } private fun requestPermission() { @@ -74,15 +95,6 @@ class ImportActivity : PokerAnalyticsActivity() { } } - override fun onNewIntent(intent: Intent?) { - super.onNewIntent(intent) - - val f = intent?.data - val uri = f.toString() - Timber.d("!!!Intent!!! uri = $uri") - - } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) } 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 fc084b97..e7a8b8ff 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 @@ -12,6 +12,7 @@ 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.io.InputStream import java.util.* import kotlin.coroutines.CoroutineContext @@ -21,11 +22,17 @@ class ImportFragment : RealmFragment() { get() = Dispatchers.Main private lateinit var filePath: String + private lateinit var inputStream: InputStream fun setData(path: String) { this.filePath = path } + fun setData(inputStream: InputStream) { + Timber.d("> setData with IS...") + this.inputStream = inputStream + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater.inflate(R.layout.fragment_import, container, false) @@ -33,6 +40,7 @@ class ImportFragment : RealmFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + Timber.d("> onViewCreated...") this.startImport() } @@ -42,9 +50,9 @@ class ImportFragment : RealmFragment() { val test = GlobalScope.async { val s = Date() - Timber.d(">>> start...") + Timber.d(">>> Start Import...") - val csv = CSVImporter(filePath) + val csv = CSVImporter(inputStream) csv.start() val e = Date() diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt index ef18a235..b988a824 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt @@ -5,8 +5,24 @@ import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVRecord import timber.log.Timber import java.io.FileReader +import java.io.InputStream +import java.io.InputStreamReader +import java.io.Reader -open class CSVImporter(var path: String) { +open class CSVImporter { + + private val COMMIT_FREQUENCY = 100 + + var path: String? = null + var inputStream: InputStream? = null + + constructor(istream: InputStream) { + inputStream = istream + } + + constructor(filePath: String) { + path = filePath + } private var usedDescriptors: MutableList = mutableListOf() private var currentDescriptor: CSVDescriptor? = null @@ -15,40 +31,52 @@ open class CSVImporter(var path: String) { val realm = Realm.getDefaultInstance() - val reader = FileReader(this.path) + var reader: Reader? = null + if (this.path != null) { + reader = FileReader(this.path) + } + if (this.inputStream != null) { + reader = InputStreamReader(this.inputStream) + } val parser = CSVFormat.DEFAULT.withAllowMissingColumnNames().parse(reader) Timber.d("Starting import...") - realm.executeTransaction { + realm.beginTransaction() - parser.forEachIndexed { index, record -> + parser.forEachIndexed { index, record -> - Timber.d("line $index") + Timber.d("line $index") - if (currentDescriptor == null) { // find descriptor - this.findDescriptor(record) - } else { + if (currentDescriptor == null) { // find descriptor + this.findDescriptor(record) + } else { - currentDescriptor?.let { - if (record.size() == 0) { - this.usedDescriptors.add(it) - this.currentDescriptor = null // reset descriptor when encountering an empty line (multiple descriptors can be found in a single file) - } else { - it.parse(realm, record) - } - } ?: run { - throw IllegalStateException("CSVDescriptor should never be null here") - } + if ((index + 1) % COMMIT_FREQUENCY == 0) { + Timber.d("****** committing at ${index} sessions...") + realm.commitTransaction() + realm.beginTransaction() + } + currentDescriptor?.let { + if (record.size() == 0) { + this.usedDescriptors.add(it) + this.currentDescriptor = + null // reset descriptor when encountering an empty line (multiple descriptors can be found in a single file) + } else { + it.parse(realm, record) + } + } ?: run { + throw IllegalStateException("CSVDescriptor should never be null here") } + } } - Timber.d("Ending import...") + realm.commitTransaction() -// this.save(realm) + Timber.d("Ending import...") realm.close() }