Adds red dot when no email is set

realmasync
Laurent 2 years ago
parent e89b597de6
commit 6441c04bae
  1. 21
      app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt
  2. 1
      app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableAdapter.kt
  3. 15
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt
  4. 7
      app/src/main/java/net/pokeranalytics/android/ui/fragment/SubscriptionFragment.kt
  5. 12
      app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt
  6. 30
      app/src/main/java/net/pokeranalytics/android/ui/view/RowViewType.kt
  7. 3
      app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt
  8. 15
      app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt
  9. 7
      app/src/main/java/net/pokeranalytics/android/util/Preferences.kt
  10. 15
      app/src/main/java/net/pokeranalytics/android/util/extensions/ContextExtensions.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<Void>
}
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
}
}
}

@ -68,5 +68,4 @@ class RowRepresentableAdapter(
this.dataSource = dataSource
}
}

@ -70,11 +70,12 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep
return fragment
}
val rowRepresentation: List<RowRepresentable> by lazy {
val rows = ArrayList<RowRepresentable>()
rows.addAll(SettingsRow.getRows())
rows
}
// fun rowRepresentation(context: Context): List<RowRepresentable> {
// val rows = ArrayList<RowRepresentable>()
// 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<RowRepresentable> {
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()
}
}
}

@ -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
}

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

@ -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<AppCompatTextView>(R.id.title)?.let {
it.text = row.localizedTitle(itemView.context)
}
itemView.findViewById<AppCompatTextView>(R.id.value)?.let {
it.text = adapter.dataSource.charSequenceForRow(row, itemView.context)
}
itemView.findViewById<AppCompatImageView>(R.id.badge)?.let {
it.isVisible = adapter.dataSource.boolForRow(row)
}
itemView.findViewById<AppCompatTextView>(R.id.title)?.let {
it.text = row.localizedTitle(itemView.context)
}
itemView.findViewById<AppCompatTextView>(R.id.value)?.let {
it.text = adapter.dataSource.charSequenceForRow(row, itemView.context)
}
itemView.findViewById<AppCompatImageView>(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<AppCompatImageView>(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)
}
}
}

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

@ -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
}
}
}

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

@ -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
}
Loading…
Cancel
Save