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 kotlinx.coroutines.launch
import net.pokeranalytics.android.model.migrations.Patcher import net.pokeranalytics.android.model.migrations.Patcher
import net.pokeranalytics.android.model.migrations.PokerAnalyticsMigration 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.Session
import net.pokeranalytics.android.model.realm.SessionSet
import net.pokeranalytics.android.model.utils.Seed import net.pokeranalytics.android.model.utils.Seed
import net.pokeranalytics.android.util.FakeDataManager import net.pokeranalytics.android.util.FakeDataManager
import net.pokeranalytics.android.util.PokerAnalyticsLogs import net.pokeranalytics.android.util.PokerAnalyticsLogs
@ -40,11 +42,13 @@ class PokerAnalyticsApplication : Application() {
.build() .build()
Realm.setDefaultConfiguration(realmConfiguration) Realm.setDefaultConfiguration(realmConfiguration)
// val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
// realm.executeTransaction { realm.executeTransaction {
// realm.where(Session::class.java).findAll().deleteAllFromRealm() realm.where(Session::class.java).findAll().deleteAllFromRealm()
// } realm.where(ComputableResult::class.java).findAll().deleteAllFromRealm()
// realm.close() realm.where(SessionSet::class.java).findAll().deleteAllFromRealm()
}
realm.close()
// Set up Crashlytics, disabled for debug builds // Set up Crashlytics, disabled for debug builds
val crashlyticsKit = Crashlytics.Builder() val crashlyticsKit = Crashlytics.Builder()

@ -4,8 +4,8 @@ import android.Manifest
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.PersistableBundle
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import io.realm.Realm import io.realm.Realm
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
@ -15,6 +15,8 @@ import timber.log.Timber
class ImportActivity : PokerAnalyticsActivity() { class ImportActivity : PokerAnalyticsActivity() {
private lateinit var fileURI: Uri
enum class IntentKey(val keyName: String) { enum class IntentKey(val keyName: String) {
FILE_PATH("filepath") 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?) { Timber.d("Start ImportActivity with URI: ${intent.data}")
super.onCreate(savedInstanceState, persistentState) intent?.data?.let {
this.fileURI = it
}
setContentView(R.layout.activity_import) setContentView(R.layout.activity_import)
initUI() initUI()
} }
override fun onStop() { override fun onStop() {
@ -59,11 +63,28 @@ class ImportActivity : PokerAnalyticsActivity() {
val fragmentTransaction = supportFragmentManager.beginTransaction() val fragmentTransaction = supportFragmentManager.beginTransaction()
val fragment = ImportFragment() val fragment = ImportFragment()
val filePath = intent.getStringExtra(ImportActivity.IntentKey.FILE_PATH.keyName) val fis = contentResolver.openInputStream(fileURI)
fragment.setData(filePath) 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.add(R.id.container, fragment)
fragmentTransaction.commit() fragmentTransaction.commit()
} }
private fun requestPermission() { 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) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) 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.ui.fragment.components.RealmFragment
import net.pokeranalytics.android.util.csv.CSVImporter import net.pokeranalytics.android.util.csv.CSVImporter
import timber.log.Timber import timber.log.Timber
import java.io.InputStream
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -21,11 +22,17 @@ class ImportFragment : RealmFragment() {
get() = Dispatchers.Main get() = Dispatchers.Main
private lateinit var filePath: String private lateinit var filePath: String
private lateinit var inputStream: InputStream
fun setData(path: String) { fun setData(path: String) {
this.filePath = path 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? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_import, container, false) return inflater.inflate(R.layout.fragment_import, container, false)
@ -33,6 +40,7 @@ class ImportFragment : RealmFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
Timber.d("> onViewCreated...")
this.startImport() this.startImport()
} }
@ -42,9 +50,9 @@ class ImportFragment : RealmFragment() {
val test = GlobalScope.async { val test = GlobalScope.async {
val s = Date() val s = Date()
Timber.d(">>> start...") Timber.d(">>> Start Import...")
val csv = CSVImporter(filePath) val csv = CSVImporter(inputStream)
csv.start() csv.start()
val e = Date() val e = Date()

@ -5,8 +5,24 @@ import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVRecord import org.apache.commons.csv.CSVRecord
import timber.log.Timber import timber.log.Timber
import java.io.FileReader 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 usedDescriptors: MutableList<CSVDescriptor> = mutableListOf()
private var currentDescriptor: CSVDescriptor? = null private var currentDescriptor: CSVDescriptor? = null
@ -15,40 +31,52 @@ open class CSVImporter(var path: String) {
val realm = Realm.getDefaultInstance() 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) val parser = CSVFormat.DEFAULT.withAllowMissingColumnNames().parse(reader)
Timber.d("Starting import...") 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 if (currentDescriptor == null) { // find descriptor
this.findDescriptor(record) this.findDescriptor(record)
} else { } else {
currentDescriptor?.let { if ((index + 1) % COMMIT_FREQUENCY == 0) {
if (record.size() == 0) { Timber.d("****** committing at ${index} sessions...")
this.usedDescriptors.add(it) realm.commitTransaction()
this.currentDescriptor = null // reset descriptor when encountering an empty line (multiple descriptors can be found in a single file) realm.beginTransaction()
} else { }
it.parse(realm, record)
}
} ?: run {
throw IllegalStateException("CSVDescriptor should never be null here")
}
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() realm.close()
} }

Loading…
Cancel
Save