From 80b97f48c2966da9a330f4ff8955bd73fec090a9 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 10:35:43 +0200 Subject: [PATCH 1/6] Fixes fr translation --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 372267b6..e6436138 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -379,7 +379,7 @@ Vérifiez que la transaction possède un type et un montant Il faut choisir un nom! Types de transactions - Transaction + Transactions Autres Choisissez un code PIN pour\n protéger l\'accès à l\'application.\nUn code PIN ne peut pas être retrouvé.\nSoyez attentif lors de l\'activation\n de cette fonction. Code PIN From 01d9e5c53ecbf7d6b983d3f452c14aa7fff61d3d Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 12:12:49 +0200 Subject: [PATCH 2/6] Succeeds in importing from mail CSV --- .../android/PokerAnalyticsApplication.kt | 14 ++-- .../android/ui/activity/ImportActivity.kt | 44 +++++++----- .../android/ui/fragment/ImportFragment.kt | 12 +++- .../android/util/csv/CSVImporter.kt | 68 +++++++++++++------ 4 files changed, 95 insertions(+), 43 deletions(-) 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() } From 8eb617422144989fec65aa0b76b1ba18936a7856 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 14:50:31 +0200 Subject: [PATCH 3/6] Ask confirmation before starting import --- app/src/main/AndroidManifest.xml | 13 +++-- .../android/model/utils/SessionSetManager.kt | 4 +- .../android/ui/activity/HomeActivity.kt | 37 +++++++++++++ .../android/ui/activity/ImportActivity.kt | 53 ++++++------------- .../android/ui/fragment/ImportFragment.kt | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 65 insertions(+), 44 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b068e33e..de2ea637 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,7 @@ @@ -30,11 +31,6 @@ - - - @@ -49,6 +45,13 @@ + + + + { // import + val data = it.data + if (data != null) { + this.requestImportConfirmation(data) + } else { + throw IllegalStateException("URI null on import") + } + } + else -> { + Timber.d("Intent ${intent.action} unmanaged") + } + } + + } + + + } + private fun observeRealmObjects() { val realm = getRealm() @@ -125,4 +152,14 @@ class HomeActivity : PokerAnalyticsActivity() { viewPager.setCurrentItem(index, false) } + // Import + + fun requestImportConfirmation(uri: Uri) { + + showAlertDialog(this, R.string.import_confirmation, showCancelButton = true, positiveAction = { + ImportActivity.newInstance(this, uri) + }) + + } + } 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 cd700239..55b8f7f9 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,12 +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.net.Uri import android.os.Bundle -import androidx.core.app.ActivityCompat import io.realm.Realm import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -18,7 +15,7 @@ class ImportActivity : PokerAnalyticsActivity() { private lateinit var fileURI: Uri enum class IntentKey(val keyName: String) { - FILE_PATH("filepath") + URI("uri") } companion object { @@ -26,13 +23,13 @@ class ImportActivity : PokerAnalyticsActivity() { /** * Create a new instance for result */ - fun newInstance(context: Context, filePath: String) { - context.startActivity(getIntent(context, filePath)) + fun newInstance(context: Context, uri: Uri) { + context.startActivity(getIntent(context, uri)) } - private fun getIntent(context: Context, filePath: String) : Intent { + private fun getIntent(context: Context, uri: Uri) : Intent { val intent = Intent(context, ImportActivity::class.java) - intent.putExtra(ImportActivity.IntentKey.FILE_PATH.keyName, filePath) + intent.putExtra(ImportActivity.IntentKey.URI.keyName, uri) return intent } } @@ -40,10 +37,7 @@ class ImportActivity : PokerAnalyticsActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Timber.d("Start ImportActivity with URI: ${intent.data}") - intent?.data?.let { - this.fileURI = it - } + this.fileURI = intent.getParcelableExtra(ImportActivity.IntentKey.URI.keyName) setContentView(R.layout.activity_import) initUI() @@ -69,34 +63,21 @@ class ImportActivity : PokerAnalyticsActivity() { 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() { - 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 onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - } +// 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 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/fragment/ImportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/ImportFragment.kt index e7a8b8ff..177cd9e9 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 @@ -40,6 +40,7 @@ class ImportFragment : RealmFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + Timber.d("> onViewCreated...") this.startImport() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 294ae6ba..48000625 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,7 @@ Launch Report Progress Save Report + Do you want to proceed with the file import? Address Naming suggestions From a6df9d052e31f0b3b7aa614e76de9eb7a4c2f4bb Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 15:05:39 +0200 Subject: [PATCH 4/6] Fix conflict in strings --- app/src/main/res/values/strings.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc173ff2..8e860c65 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,13 +31,10 @@ Launch Report Progress Save Report -<<<<<<< HEAD Do you want to proceed with the file import? -======= Update %s Comparison chart The filter cannot be deleted because it is currently selected. ->>>>>>> 5d02ab88722ad9a85d1b7d57dac44a54369a9b74 Address Naming suggestions From 6c6f57a2ef396eb2f798b659c020abecb7abbdcf Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 15:22:18 +0200 Subject: [PATCH 5/6] Update lib version + billing warning --- app/build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e633f19c..ab1a65b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,7 +72,7 @@ dependencies { // Android implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'androidx.core:core-ktx:1.1.0-alpha05' + implementation 'androidx.core:core-ktx:1.2.0-alpha01' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' @@ -88,13 +88,15 @@ dependencies { implementation 'com.google.android.libraries.places:places:1.1.0' // Billing / Subscriptions + // WARNING FOR 2.0: https://developer.android.com/google/play/billing/billing_library_releases_notes + // Purchases MUST BE ACKNOWLEDGED implementation 'com.android.billingclient:billing:1.2.2' // Firebase - implementation 'com.google.firebase:firebase-core:16.0.8' + implementation 'com.google.firebase:firebase-core:16.0.9' // Crashlytics - implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9' + implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' // Logs implementation 'com.jakewharton.timber:timber:4.7.1' From e65ef0f2240995e3629d7dcd9d5b05a2350a0da2 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 May 2019 15:29:41 +0200 Subject: [PATCH 6/6] fix warnings --- .../net/pokeranalytics/android/model/realm/Bankroll.kt | 7 ++++--- .../android/ui/fragment/data/DataManagerFragment.kt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index 1d1f34f7..5cfaab03 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -101,12 +101,13 @@ open class Bankroll : RealmObject(), NameManageable, RowRepresentable { fun getOrCreate(realm: Realm, name: String, live: Boolean = true, currencyCode: String? = null, currencyRate: Double? = null) : Bankroll { - val bankroll = realm.where().equalTo("name", name).findFirst() - return if (bankroll != null) { - bankroll + val br = realm.where().equalTo("name", name).findFirst() + return if (br != null) { + br } else { val bankroll = Bankroll() bankroll.name = name + bankroll.live = live val currency = Currency() currency.code = currencyCode currency.rate = currencyRate diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 686671d8..aeb41345 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -95,7 +95,7 @@ open class DataManagerFragment : RealmFragment() { this.getRealm().executeTransaction { val managedItem = it.copyToRealmOrUpdate(this.item) if (managedItem is Savable) { - val uniqueIdentifier = (managedItem as Savable).id + val uniqueIdentifier = managedItem.id finishActivityWithResult(uniqueIdentifier) } }