From 6441c04bae52b98f8689a8f667a40a03b37247bb Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 23 Jun 2023 15:33:12 +0200 Subject: [PATCH] Adds red dot when no email is set --- .../pokeranalytics/android/api/BackupApi.kt | 21 +++++++------ .../ui/adapter/RowRepresentableAdapter.kt | 1 - .../android/ui/fragment/SettingsFragment.kt | 15 ++++++---- .../ui/fragment/SubscriptionFragment.kt | 7 +++-- .../ui/fragment/components/BaseFragment.kt | 12 -------- .../android/ui/view/RowViewType.kt | 30 +++++++++---------- .../android/ui/view/rows/SettingsRow.kt | 3 +- .../android/util/BackupOperator.kt | 15 ++++++---- .../android/util/Preferences.kt | 7 +++++ .../util/extensions/ContextExtensions.kt | 15 ++++++++++ 10 files changed, 73 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/util/extensions/ContextExtensions.kt diff --git a/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt b/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt index 9be7d784..838f5490 100644 --- a/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt +++ b/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt @@ -1,8 +1,10 @@ package net.pokeranalytics.android.api +import android.content.Context import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import net.pokeranalytics.android.util.extensions.isNetworkAvailable import okhttp3.MediaType import okhttp3.MultipartBody import okhttp3.RequestBody @@ -33,13 +35,12 @@ interface MyBackupApi { fun postFile(@Part mail: MultipartBody.Part, @Part fileBody: MultipartBody.Part): Call } - object BackupApi { val service = BackupService() // curl -F recipient=laurent@staxriver.com -F file=@test.txt https://www.pokeranalytics.net/backup/send - fun backupFile(mail: String, fileName: String, fileContent: String) { + fun backupFile(context: Context, mail: String, fileName: String, fileContent: String): Boolean { val filePart = MultipartBody.Part.createFormData( "file", @@ -49,14 +50,16 @@ object BackupApi { val mailPart = MultipartBody.Part.createFormData("recipient", mail) - CoroutineScope(context = Dispatchers.IO).launch { - - val response = service.backupApi.postFile(mailPart, filePart).execute() - Timber.d("response code = ${response.code()}") - Timber.d("success = ${response.isSuccessful}") - + return if (context.isNetworkAvailable()) { + CoroutineScope(context = Dispatchers.IO).launch { + val response = service.backupApi.postFile(mailPart, filePart).execute() + Timber.d("response code = ${response.code()}") + Timber.d("success = ${response.isSuccessful}") + } + true + } else { + false } - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt index 75ae1dbe..7f0a2b60 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt @@ -68,5 +68,4 @@ class RowRepresentableAdapter( this.dataSource = dataSource } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index d0ef99c3..2e29525a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -70,11 +70,12 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep return fragment } - val rowRepresentation: List by lazy { - val rows = ArrayList() - rows.addAll(SettingsRow.getRows()) - rows - } +// fun rowRepresentation(context: Context): List { +// val rows = ArrayList() +// val hasBackupEmail = Preferences.getBackupEmail(context)?.isNotBlank() ?: false +// rows.addAll(SettingsRow.getRows(hasBackupEmail)) +// return rows +// } } @@ -201,7 +202,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep } override fun adapterRows(): List { - return rowRepresentation + return SettingsRow.getRows() } override fun charSequenceForRow( @@ -223,6 +224,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep SettingsRow.STOP_NOTIFICATION -> Preferences.showStopNotifications(requireContext()) SettingsRow.SHOULD_SHOW_BLOG_TIPS -> Preferences.shouldShowBlogTips(requireContext()) SettingsRow.SHOW_INAPP_BADGES -> Preferences.showInAppBadges(requireContext()) + SettingsRow.BACKUP_EMAIL -> !Preferences.hasBackupEmail(requireContext()) else -> false } } @@ -298,6 +300,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep context?.let { context -> showEditTextAlertDialog(context, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, messageResId = R.string.backup_email_title, editTextText = Preferences.getBackupEmail(context)) { value -> Preferences.setBackupEmail(value, context) + this.settingsAdapterRow.notifyDataSetChanged() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt index 29ae2d9b..37d9c0f2 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt @@ -30,6 +30,7 @@ import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.billing.AppGuard import net.pokeranalytics.android.util.billing.IAPProducts import net.pokeranalytics.android.util.billing.PurchaseListener +import net.pokeranalytics.android.util.extensions.isNetworkAvailable import timber.log.Timber import java.lang.ref.WeakReference import java.time.Period @@ -75,7 +76,7 @@ class SubscriptionFragment : BaseFragment(), ProductDetailsResponseListener, Pur AppGuard.registerListener(this) - if (!isNetworkAvailable()) { + if (!requireContext().isNetworkAvailable()) { Toast.makeText(requireContext(), R.string.connection_unavailable, Toast.LENGTH_LONG).show() return } @@ -158,10 +159,10 @@ class SubscriptionFragment : BaseFragment(), ProductDetailsResponseListener, Pur purchase.isEnabled = true purchase.setOnClickListener { - val network = isNetworkAvailable() + val network = requireContext().isNetworkAvailable() Timber.d("isNetworkAvailable = $network ") - if (!isNetworkAvailable()) { + if (!network) { Toast.makeText(requireContext(), R.string.connection_unavailable, Toast.LENGTH_LONG).show() return@setOnClickListener } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt index 1608817f..4b876b9e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt @@ -1,8 +1,5 @@ package net.pokeranalytics.android.ui.fragment.components -import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkCapabilities import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar @@ -176,15 +173,6 @@ abstract class BaseFragment : Fragment() { alternativeLabels) } - /*** - * Returns whether the network is available or not - */ - fun isNetworkAvailable(): Boolean { - val cm = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val capability = cm.getNetworkCapabilities(cm.activeNetwork) - return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false - } - fun showSnackBar(message: String) { this.view?.let { view -> val snackBar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt index 379d4567..ef2eefd7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt @@ -702,17 +702,22 @@ enum class RowViewType(private var layoutRes: Int) : ViewIdentifier { BindableHolder { override fun onBind(position: Int, row: RowRepresentable, adapter: RecyclerAdapter) { - if (row is PerformanceRow) { + itemView.findViewById(R.id.title)?.let { + it.text = row.localizedTitle(itemView.context) + } + itemView.findViewById(R.id.value)?.let { + it.text = adapter.dataSource.charSequenceForRow(row, itemView.context) + } + itemView.findViewById(R.id.badge)?.let { + it.isVisible = adapter.dataSource.boolForRow(row) + } - itemView.findViewById(R.id.title)?.let { - it.text = row.localizedTitle(itemView.context) - } - itemView.findViewById(R.id.value)?.let { - it.text = adapter.dataSource.charSequenceForRow(row, itemView.context) - } - itemView.findViewById(R.id.badge)?.let { - it.isVisible = adapter.dataSource.boolForRow(row) - } + val listener = View.OnClickListener { + adapter.delegate?.onRowSelected(position, row) + } + itemView.setOnClickListener(listener) + + if (row is PerformanceRow) { itemView.findViewById(R.id.nextArrow)?.let { it.visibility = if (row.report.hasGraph) { View.VISIBLE @@ -720,11 +725,6 @@ enum class RowViewType(private var layoutRes: Int) : ViewIdentifier { View.GONE } } - - val listener = View.OnClickListener { - adapter.delegate?.onRowSelected(position, row) - } - itemView.setOnClickListener(listener) } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt index 7e75ba1a..e2b5041f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt @@ -143,7 +143,8 @@ enum class SettingsRow : RowRepresentable { return when (this) { BANKROLL_REPORT, TOP_10, PLAYERS -> RowViewType.TITLE_ICON_ARROW.ordinal VERSION, SUBSCRIPTION -> RowViewType.TITLE_VALUE.ordinal - LANGUAGE, CURRENCY, BACKUP_EMAIL -> RowViewType.TITLE_VALUE_ARROW.ordinal + LANGUAGE, CURRENCY -> RowViewType.TITLE_VALUE_ARROW.ordinal + BACKUP_EMAIL -> RowViewType.TITLE_BADGE_VALUE.ordinal FOLLOW_US -> RowViewType.ROW_FOLLOW_US.ordinal STOP_NOTIFICATION, SHOULD_SHOW_BLOG_TIPS, SHOW_INAPP_BADGES -> RowViewType.TITLE_SWITCH.ordinal STOP_NOTIFICATION_MESSAGE -> RowViewType.INFO.ordinal diff --git a/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt b/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt index a74a79a3..b1cf9182 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt @@ -23,13 +23,13 @@ class BackupOperator(var context: Context) { init { - this.sessions = this.realm.where(Session::class.java).findAll() + this.sessions = this.realm.where(Session::class.java).findAllAsync() this.sessions?.addChangeListener { _ -> sessionsChanged = true // backupIfNecessary() } - this.transactions = this.realm.where(Transaction::class.java).findAll() + this.transactions = this.realm.where(Transaction::class.java).findAllAsync() this.transactions?.addChangeListener { _ -> transactionsChanged = true } @@ -54,8 +54,10 @@ class BackupOperator(var context: Context) { val sessions = this.realm.where(Session::class.java).findAll().sort("startDate") val csv = ProductCSVDescriptors.pokerAnalyticsAndroid6Sessions.toCSV(sessions) val fileName = "sessions_${Date().dateTimeFileFormatted}.csv" - BackupApi.backupFile(email, fileName, csv) - this.sessionsChanged = false + + if (BackupApi.backupFile(context, email, fileName, csv)) { + this.sessionsChanged = false + } } } @@ -67,8 +69,9 @@ class BackupOperator(var context: Context) { val transactions = this.realm.where(Transaction::class.java).findAll().sort("date") val csv = ProductCSVDescriptors.pokerAnalyticsAndroidTransactions.toCSV(transactions) val fileName = "transactions_${Date().dateTimeFileFormatted}.csv" - BackupApi.backupFile(email, fileName, csv) - this.transactionsChanged = false + if (BackupApi.backupFile(context, email, fileName, csv)) { + this.transactionsChanged = false + } } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index 338db6b2..a750c75b 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -337,6 +337,13 @@ class Preferences { return getString(Keys.BACKUP_EMAIL, context) } + fun hasBackupEmail(context: Context): Boolean { + getString(Keys.BACKUP_EMAIL, context)?.let { + return it.isNotEmpty() + } + return false + } + fun setLanguageCode(languageCode: String, context: Context) { setString(Keys.LANGUAGE_CODE, languageCode, context) } diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/ContextExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/ContextExtensions.kt new file mode 100644 index 00000000..8e7b9e61 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/ContextExtensions.kt @@ -0,0 +1,15 @@ +package net.pokeranalytics.android.util.extensions + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities + +/*** + * Returns whether the network is available or not + */ +fun Context.isNetworkAvailable(): Boolean { + val cm = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val capability = cm.getNetworkCapabilities(cm.activeNetwork) + return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false +} +