Succeeds in importing from mail CSV

dev
Laurent 7 years ago
parent 80b97f48c2
commit 01d9e5c53e
  1. 14
      app/src/main/java/net/pokeranalytics/android/PokerAnalyticsApplication.kt
  2. 44
      app/src/main/java/net/pokeranalytics/android/ui/activity/ImportActivity.kt
  3. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt
  4. 68
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.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()

@ -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<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

@ -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()

@ -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<CSVDescriptor> = 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()
}

Loading…
Cancel
Save