From 0166382b686d4500f56e4457088453988f419d1d Mon Sep 17 00:00:00 2001 From: Severiano Jaramillo Date: Mon, 5 Apr 2021 21:54:23 -0700 Subject: [PATCH] Migrate to the AndroidX Shared Preferences. - The version of the Shared Preferences bundled with the Android OS has been deprecated, similar to what has happened with other platform libraries. This is so that the libraries can be updated, regardless of the device's OS version. --- app/build.gradle | 4 +- .../activities/ConnectedActivity.kt | 15 ++++--- .../activities/MainActivity.kt | 3 +- .../fragments/BaseAccountFragment.kt | 12 +++--- .../fragments/BaseSecurityLockDialog.kt | 19 ++++---- .../fragments/EReceiptFragment.kt | 13 +++--- .../fragments/HomeFragment.kt | 5 ++- .../fragments/LicenseFragment.kt | 11 ++--- .../fragments/MerchantsFragment.kt | 4 +- .../fragments/PINSecurityLockDialog.kt | 12 +++--- .../fragments/PatternSecurityLockDialog.kt | 13 +++--- .../fragments/ReceiveTransactionFragment.kt | 8 ++-- .../fragments/SendTransactionFragment.kt | 18 ++++---- .../fragments/SettingsFragment.kt | 29 ++++++------- .../fragments/TransactionsFragment.kt | 5 ++- .../processors/TransfersLoader.kt | 6 +-- .../repositories/MerchantRepository.kt | 10 +++-- .../repositories/TellerRepository.kt | 8 ++-- .../repositories/TransferRepository.kt | 43 +++++++++++-------- .../bitsybitshareswallet/utils/CryptoUtils.kt | 11 +++-- 20 files changed, 134 insertions(+), 115 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 14cce69..233f067 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,8 +62,9 @@ android { } dependencies { - def lifecycle_version = "2.3.1" def arch_version = "2.1.0" + def lifecycle_version = "2.3.1" + def preference_version = "1.1.1" def room_version = "2.2.6" def rx_bindings_version = '3.0.0' def version_coroutine = '1.4.1' @@ -75,6 +76,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation "androidx.preference:preference-ktx:$preference_version" // Google implementation 'com.google.zxing:core:3.4.0' implementation 'com.google.code.gson:gson:2.8.6' diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt index 371a5bb..395e16f 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/ConnectedActivity.kt @@ -4,12 +4,13 @@ import android.content.pm.PackageManager import android.os.AsyncTask import android.os.Bundle import android.os.Handler -import android.preference.PreferenceManager import android.util.Log import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.edit import androidx.core.content.pm.PackageInfoCompat +import androidx.preference.PreferenceManager import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.database.entities.Balance import cy.agorise.bitsybitshareswallet.database.entities.Transfer @@ -171,10 +172,9 @@ abstract class ConnectedActivity : AppCompatActivity() { if (versionCode > 11 && !hasPurgedEquivalentValues) { thread { connectedActivityViewModel.purgeEquivalentValues() - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putBoolean(Constants.KEY_HAS_PURGED_EQUIVALENT_VALUES, true) - .apply() + PreferenceManager.getDefaultSharedPreferences(this).edit { + putBoolean(Constants.KEY_HAS_PURGED_EQUIVALENT_VALUES, true) + } } } } @@ -388,8 +388,9 @@ abstract class ConnectedActivity : AppCompatActivity() { dateFormat.timeZone = TimeZone.getTimeZone("GMT") try { - val date = dateFormat.parse(blockHeader.timestamp) - transferViewModel.setBlockTime(blockNumber, date.time / 1000) + dateFormat.parse(blockHeader.timestamp)?.let { date -> + transferViewModel.setBlockTime(blockNumber, date.time / 1000) + } } catch (e: ParseException) { Log.e(TAG, "ParseException. Msg: " + e.message) } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt index 9e43b8c..67a6bfc 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt @@ -2,7 +2,6 @@ package cy.agorise.bitsybitshareswallet.activities import android.os.Bundle import android.os.Handler -import android.preference.PreferenceManager import android.util.Log import android.view.MenuItem import androidx.navigation.findNavController @@ -11,6 +10,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.onNavDestinationSelected import androidx.navigation.ui.setupActionBarWithNavController +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.databinding.ActivityMainBinding import cy.agorise.bitsybitshareswallet.utils.Constants @@ -36,6 +36,7 @@ class MainActivity : ConnectedActivity() { ) { setTheme(R.style.Theme_Bitsy_Dark) } + binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseAccountFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseAccountFragment.kt index 4658729..5fda85e 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseAccountFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseAccountFragment.kt @@ -1,7 +1,8 @@ package cy.agorise.bitsybitshareswallet.fragments -import android.preference.PreferenceManager +import androidx.core.content.edit import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.activities.ConnectedActivity import cy.agorise.bitsybitshareswallet.database.entities.Authority @@ -36,10 +37,11 @@ abstract class BaseAccountFragment : ConnectedFragment() { val hashedPIN = CryptoUtils.createSHA256Hash(salt + pin) // Stores the user selected PIN, hashed - PreferenceManager.getDefaultSharedPreferences(requireContext()).edit() - .putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPIN) - .putString(Constants.KEY_PIN_PATTERN_SALT, salt) - .putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 1).apply() // 1 -> PIN + PreferenceManager.getDefaultSharedPreferences(requireContext()).edit { + putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPIN) + putString(Constants.KEY_PIN_PATTERN_SALT, salt) + putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 1) // 1 -> PIN + } // Stores the accounts this key refers to val id = accountProperties.id diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseSecurityLockDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseSecurityLockDialog.kt index c272618..83510fe 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseSecurityLockDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BaseSecurityLockDialog.kt @@ -2,11 +2,12 @@ package cy.agorise.bitsybitshareswallet.fragments import android.os.Bundle import android.os.CountDownTimer -import android.preference.PreferenceManager import android.view.View import android.view.ViewGroup +import androidx.core.content.edit import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.utils.Constants import io.reactivex.disposables.CompositeDisposable @@ -118,10 +119,10 @@ abstract class BaseSecurityLockDialog : DialogFragment() { incorrectSecurityLockTime = now - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putInt(Constants.KEY_INCORRECT_SECURITY_LOCK_ATTEMPTS, ++incorrectSecurityLockAttempts) - .putLong(Constants.KEY_INCORRECT_SECURITY_LOCK_TIME, now) - .apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putInt(Constants.KEY_INCORRECT_SECURITY_LOCK_ATTEMPTS, ++incorrectSecurityLockAttempts) + putLong(Constants.KEY_INCORRECT_SECURITY_LOCK_TIME, now) + } } /** @@ -132,10 +133,10 @@ abstract class BaseSecurityLockDialog : DialogFragment() { incorrectSecurityLockTime = 0 incorrectSecurityLockAttempts = 0 - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putInt(Constants.KEY_INCORRECT_SECURITY_LOCK_ATTEMPTS, incorrectSecurityLockAttempts) - .putLong(Constants.KEY_INCORRECT_SECURITY_LOCK_TIME, incorrectSecurityLockTime) - .apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putInt(Constants.KEY_INCORRECT_SECURITY_LOCK_ATTEMPTS, incorrectSecurityLockAttempts) + putLong(Constants.KEY_INCORRECT_SECURITY_LOCK_TIME, incorrectSecurityLockTime) + } } protected fun startContDownTimer() { diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/EReceiptFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/EReceiptFragment.kt index e4cacbb..58fcd72 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/EReceiptFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/EReceiptFragment.kt @@ -5,15 +5,15 @@ import android.content.Intent import android.content.pm.PackageManager import android.graphics.drawable.Animatable import android.os.Bundle -import android.preference.PreferenceManager -import android.text.Html import android.text.method.LinkMovementMethod import android.view.* import androidx.core.content.ContextCompat import androidx.core.os.ConfigurationCompat +import androidx.core.text.HtmlCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.navArgs +import androidx.preference.PreferenceManager import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.database.joins.TransferDetail @@ -130,12 +130,11 @@ class EReceiptFragment : Fragment() { /** Formats the transfer TextView to show a link to explore the given transfer * in a BitShares explorer */ private fun formatTransferTextView(transferId: String) { - val tx = Html.fromHtml( - getString( - R.string.template__tx, - "$transferId" - ) + val html = getString( + R.string.template__tx, + "$transferId" ) + val tx = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY) binding.tvTransferID.text = tx binding.tvTransferID.movementMethod = LinkMovementMethod.getInstance() } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/HomeFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/HomeFragment.kt index 327b8d6..60cc32b 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/HomeFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/HomeFragment.kt @@ -1,7 +1,6 @@ package cy.agorise.bitsybitshareswallet.fragments import android.os.Bundle -import android.preference.PreferenceManager import android.view.* import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar @@ -13,6 +12,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.viewModels import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.databinding.FragmentHomeBinding @@ -135,7 +135,8 @@ class HomeFragment : Fragment() { /** * Pager adapter to create the placeholder fragments */ - private inner class PagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { + private inner class PagerAdapter(fm: FragmentManager) : + FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { // getItem is called to instantiate the fragment for the given page. diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt index 91236e7..6ce1f6e 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/LicenseFragment.kt @@ -1,13 +1,14 @@ package cy.agorise.bitsybitshareswallet.fragments import android.os.Bundle -import android.preference.PreferenceManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar +import androidx.core.content.edit import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import com.google.firebase.crashlytics.FirebaseCrashlytics import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.databinding.FragmentLicenseBinding @@ -67,10 +68,10 @@ class LicenseFragment : Fragment() { * sends the user to import/create account. */ private fun agree() { - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putInt(Constants.KEY_LAST_AGREED_LICENSE_VERSION, Constants.CURRENT_LICENSE_VERSION) - .apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putInt(Constants.KEY_LAST_AGREED_LICENSE_VERSION, Constants.CURRENT_LICENSE_VERSION) + } findNavController().navigate(R.id.import_brainkey_action) } -} \ No newline at end of file +} diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt index 5c89b4a..ec9f406 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/MerchantsFragment.kt @@ -6,7 +6,6 @@ import android.content.pm.PackageManager import android.database.Cursor import android.database.MatrixCursor import android.os.Bundle -import android.preference.PreferenceManager import android.util.Log import android.view.* import android.widget.PopupWindow @@ -19,6 +18,7 @@ import androidx.core.content.ContextCompat import androidx.cursoradapter.widget.SimpleCursorAdapter import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView import com.google.android.gms.maps.CameraUpdateFactory @@ -549,7 +549,7 @@ class MerchantsFragment : Fragment(), OnMapReadyCallback, SearchView.OnSuggestio try { mMap?.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100)) } catch (e: Exception) { - Log.d(TAG, e.message) + Log.d(TAG, e.message ?: "") } } return true diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt index 2131380..eaaa293 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PINSecurityLockDialog.kt @@ -1,12 +1,13 @@ package cy.agorise.bitsybitshareswallet.fragments import android.os.Bundle -import android.preference.PreferenceManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.view.inputmethod.EditorInfo +import androidx.core.content.edit +import androidx.preference.PreferenceManager import com.google.firebase.crashlytics.FirebaseCrashlytics import com.jakewharton.rxbinding3.widget.textChanges import cy.agorise.bitsybitshareswallet.R @@ -100,10 +101,11 @@ class PINSecurityLockDialog : BaseSecurityLockDialog() { val hashedPIN = CryptoUtils.createSHA256Hash(salt + pinConfirm) // Stores the newly selected PIN, hashed - PreferenceManager.getDefaultSharedPreferences(v.context).edit() - .putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPIN) - .putString(Constants.KEY_PIN_PATTERN_SALT, salt) - .putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 1).apply() // 1 -> PIN + PreferenceManager.getDefaultSharedPreferences(v.context).edit { + putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPIN) + putString(Constants.KEY_PIN_PATTERN_SALT, salt) + putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 1) // 1 -> PIN + } dismiss() mCallback?.onPINPatternChanged() diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt index 9fdb4e2..c278198 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/PatternSecurityLockDialog.kt @@ -1,10 +1,11 @@ package cy.agorise.bitsybitshareswallet.fragments import android.os.Bundle -import android.preference.PreferenceManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.edit +import androidx.preference.PreferenceManager import com.andrognito.patternlockview.PatternLockView import com.andrognito.patternlockview.listener.PatternLockViewListener import com.google.firebase.crashlytics.FirebaseCrashlytics @@ -131,11 +132,11 @@ class PatternSecurityLockDialog : BaseSecurityLockDialog() { val hashedPattern = CryptoUtils.createSHA256Hash(salt + patternConfirm) // Stores the newly selected Pattern, encrypted - PreferenceManager.getDefaultSharedPreferences(it).edit() - .putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPattern) - .putString(Constants.KEY_PIN_PATTERN_SALT, salt) - .putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 2) - .apply() // 2 -> Pattern + PreferenceManager.getDefaultSharedPreferences(it).edit { + putString(Constants.KEY_HASHED_PIN_PATTERN, hashedPattern) + putString(Constants.KEY_PIN_PATTERN_SALT, salt) + putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 2) // 2 -> Pattern + } dismiss() mCallback?.onPINPatternChanged() diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt index 7008e5b..8878238 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/ReceiveTransactionFragment.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.content.pm.PackageManager import android.graphics.drawable.Animatable import android.os.Bundle -import android.preference.PreferenceManager import android.util.Log import android.view.* import android.widget.AdapterView @@ -12,6 +11,7 @@ import androidx.appcompat.widget.Toolbar import androidx.collection.LongSparseArray import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels +import androidx.preference.PreferenceManager import com.google.common.primitives.UnsignedLong import com.google.firebase.crashlytics.FirebaseCrashlytics import com.jakewharton.rxbinding3.widget.textChanges @@ -136,9 +136,7 @@ class ReceiveTransactionFragment : ConnectedFragment() { ) ) - mAssets.sortWith( - Comparator { a, b -> a.toString().compareTo(b.toString(), true) } - ) + mAssets.sortWith { a, b -> a.toString().compareTo(b.toString(), true) } // Add an option at the end so the user can search for an asset other than the ones saved in the db val asset = cy.agorise.bitsybitshareswallet.database.entities.Asset( @@ -208,7 +206,7 @@ class ReceiveTransactionFragment : ConnectedFragment() { binding.actvAsset.textChanges() .skipInitialValue() .debounce(500, TimeUnit.MILLISECONDS) - .map { it.toString().trim().toUpperCase() } + .map { it.toString().trim().toUpperCase(Locale.getDefault()) } .observeOn(AndroidSchedulers.mainThread()) .subscribe({ if (!selectedInAutoCompleteTextView) { diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt index cca7fbe..e03afca 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SendTransactionFragment.kt @@ -3,7 +3,6 @@ package cy.agorise.bitsybitshareswallet.fragments import android.content.pm.PackageManager import android.os.Bundle import android.os.Handler -import android.preference.PreferenceManager import android.provider.Settings import android.util.Log import android.view.* @@ -15,6 +14,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView import com.google.android.material.snackbar.Snackbar @@ -52,7 +52,6 @@ import java.text.DecimalFormatSymbols import java.util.ArrayList import java.util.Locale import java.util.concurrent.TimeUnit -import kotlin.Comparator class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHandler, BaseSecurityLockDialog.OnPINPatternEnteredListener { @@ -186,9 +185,7 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand balanceDetailViewModel.getAll().observe(viewLifecycleOwner, { balancesDetails -> mBalancesDetails.clear() mBalancesDetails.addAll(balancesDetails) - mBalancesDetails.sortWith( - Comparator { a, b -> a.toString().compareTo(b.toString(), true) } - ) + mBalancesDetails.sortWith { a, b -> a.toString().compareTo(b.toString(), true) } mBalancesDetailsAdapter = BalancesDetailsAdapter( requireContext(), android.R.layout.simple_spinner_item, @@ -461,9 +458,11 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand // Try to select the invoice's Asset in the Assets spinner for (i in 0 until (mBalancesDetailsAdapter?.count ?: 0)) { - if (mBalancesDetailsAdapter?.getItem(i)?.symbol == invoice.currency.toUpperCase() || + if (mBalancesDetailsAdapter?.getItem(i)?.symbol == invoice.currency + .toUpperCase(Locale.getDefault()) || (invoice.currency.startsWith("bit", true) && - invoice.currency.replaceFirst("bit", "").toUpperCase() == + invoice.currency.replaceFirst("bit", "") + .toUpperCase(Locale.getDefault()) == mBalancesDetailsAdapter?.getItem(i)?.symbol) ) { binding.spAsset.setSelection(i) @@ -477,7 +476,10 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand if (balanceDetail == null) { Snackbar.make( binding.rootView, - getString(R.string.error__you_dont_own_asset, invoice.currency.toUpperCase()), + getString( + R.string.error__you_dont_own_asset, + invoice.currency.toUpperCase(Locale.getDefault()) + ), Snackbar.LENGTH_INDEFINITE ).setAction(android.R.string.ok) { }.show() return diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt index b963a76..5882cb2 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/SettingsFragment.kt @@ -3,15 +3,16 @@ package cy.agorise.bitsybitshareswallet.fragments import android.content.Context import android.os.Bundle import android.os.Handler -import android.preference.PreferenceManager import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.Toolbar import androidx.collection.LongSparseArray +import androidx.core.content.edit import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.viewModels +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.callbacks.onDismiss @@ -485,9 +486,9 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter when (index) { 0 -> { /* None */ - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 0) - .apply() // 0 -> None + PreferenceManager.getDefaultSharedPreferences(context).edit { + putInt(Constants.KEY_SECURITY_LOCK_SELECTED, 0) // 0 -> None + } // Call this function to update the UI onPINPatternChanged() @@ -564,8 +565,9 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter .cancelable(false) .positiveButton(R.string.button__copied) { val now = System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(it.context).edit() - .putLong(Constants.KEY_LAST_ACCOUNT_BACKUP, now).apply() + PreferenceManager.getDefaultSharedPreferences(it.context).edit { + putLong(Constants.KEY_LAST_ACCOUNT_BACKUP, now) + } binding.tvBackupWarning.visibility = View.GONE } @@ -623,14 +625,12 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter // Clears the database. viewModel.clearDatabase(context) - // Clears the shared preferences. - val pref = PreferenceManager.getDefaultSharedPreferences(context) - pref.edit().clear().apply() - - // Marks the license as agreed, so that it is not shown to the user again. - pref.edit().putInt( - Constants.KEY_LAST_AGREED_LICENSE_VERSION, Constants.CURRENT_LICENSE_VERSION - ).apply() + val pref = PreferenceManager.getDefaultSharedPreferences(context).edit { + // Clears the shared preferences. + clear() + // Marks the license as agreed, so that it is not shown to the user again. + putInt(Constants.KEY_LAST_AGREED_LICENSE_VERSION, Constants.CURRENT_LICENSE_VERSION) + } // Restarts the activity, which will restart the whole application since it uses a // single activity architecture. @@ -639,4 +639,3 @@ class SettingsFragment : ConnectedFragment(), BaseSecurityLockDialog.OnPINPatter activity?.startActivity(intent) } } - diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt index 9004951..c117d65 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/TransactionsFragment.kt @@ -5,13 +5,13 @@ import android.content.pm.PackageManager import android.graphics.Point import android.os.Bundle import android.os.Environment -import android.preference.PreferenceManager import android.view.* import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.viewModels +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.list.listItemsMultiChoice @@ -26,6 +26,7 @@ import cy.agorise.bitsybitshareswallet.viewmodels.TransactionsViewModel import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import java.io.File +import java.util.* import java.util.concurrent.TimeUnit /** @@ -110,7 +111,7 @@ class TransactionsFragment : Fragment(), FilterOptionsDialog.OnFilterOptionsSele searchView.queryTextChangeEvents() .skipInitialValue() .debounce(500, TimeUnit.MILLISECONDS) - .map { it.queryText.toString().toLowerCase() } + .map { it.queryText.toString().toLowerCase(Locale.getDefault()) } .observeOn(AndroidSchedulers.mainThread()) .subscribe { viewModel.setFilterQuery(it) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt index d6ef5ee..a56e432 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt @@ -1,8 +1,8 @@ package cy.agorise.bitsybitshareswallet.processors import android.content.Context -import android.preference.PreferenceManager import android.util.Log +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.database.entities.Transfer import cy.agorise.bitsybitshareswallet.models.HistoricalOperationEntry import cy.agorise.bitsybitshareswallet.repositories.AuthorityRepository @@ -75,8 +75,8 @@ class TransfersLoader(private var mContext: Context?) { transferRepository = TransferRepository(mContext!!) authorityRepository = AuthorityRepository(mContext!!) - val pref = PreferenceManager.getDefaultSharedPreferences(mContext) - val userId = pref.getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: "" + val userId = PreferenceManager.getDefaultSharedPreferences(mContext) + .getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: "" if (userId != "") { mCurrentAccount = UserAccount(userId) mDisposables.add( diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/MerchantRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/MerchantRepository.kt index eaab376..80e5721 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/MerchantRepository.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/MerchantRepository.kt @@ -2,9 +2,10 @@ package cy.agorise.bitsybitshareswallet.repositories import android.content.Context import android.os.AsyncTask -import android.preference.PreferenceManager import android.util.Log +import androidx.core.content.edit import androidx.lifecycle.LiveData +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.database.BitsyDatabase import cy.agorise.bitsybitshareswallet.database.daos.MerchantDao import cy.agorise.bitsybitshareswallet.database.entities.Merchant @@ -41,7 +42,7 @@ class MerchantRepository internal constructor(val context: Context) : retrofit2. .addConverterFactory(GsonConverterFactory.create()) .build() - bitsyWebservice = retrofit.create(BitsyWebservice::class.java) + bitsyWebservice = retrofit.create(BitsyWebservice::class.java) } /** Returns a LiveData object directly from the database while the response from the WebService is obtained. */ @@ -79,8 +80,9 @@ class MerchantRepository internal constructor(val context: Context) : retrofit2. updateMerchants(merchantsList) val now = System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putLong(Constants.KEY_MERCHANTS_LAST_UPDATE, now).apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putLong(Constants.KEY_MERCHANTS_LAST_UPDATE, now) + } } } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TellerRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TellerRepository.kt index 9e757a2..6bb5b53 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TellerRepository.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TellerRepository.kt @@ -2,9 +2,10 @@ package cy.agorise.bitsybitshareswallet.repositories import android.content.Context import android.os.AsyncTask -import android.preference.PreferenceManager import android.util.Log +import androidx.core.content.edit import androidx.lifecycle.LiveData +import androidx.preference.PreferenceManager import cy.agorise.bitsybitshareswallet.database.BitsyDatabase import cy.agorise.bitsybitshareswallet.database.daos.TellerDao import cy.agorise.bitsybitshareswallet.database.entities.Teller @@ -79,8 +80,9 @@ class TellerRepository internal constructor(val context: Context) : retrofit2.Ca updateTellers(tellersList) val now = System.currentTimeMillis() - PreferenceManager.getDefaultSharedPreferences(context).edit() - .putLong(Constants.KEY_TELLERS_LAST_UPDATE, now).apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putLong(Constants.KEY_TELLERS_LAST_UPDATE, now).apply() + } } } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt index 3b220d2..2b71235 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt @@ -1,9 +1,7 @@ package cy.agorise.bitsybitshareswallet.repositories import android.content.Context -import android.content.SharedPreferences import android.os.AsyncTask -import android.preference.PreferenceManager import android.util.Log import androidx.lifecycle.LiveData import cy.agorise.bitsybitshareswallet.database.BitsyDatabase @@ -27,20 +25,18 @@ class TransferRepository internal constructor(context: Context) { private val mTransferDao: TransferDao private val mEquivalentValuesDao: EquivalentValueDao private val compositeDisposable = CompositeDisposable() - private val mPreferences: SharedPreferences init { val db = BitsyDatabase.getDatabase(context) mTransferDao = db!!.transferDao() mEquivalentValuesDao = db.equivalentValueDao() - mPreferences = PreferenceManager.getDefaultSharedPreferences(context) } fun insertAll(transfers: List) { insertAllAsyncTask(mTransferDao).execute(transfers) } - fun update(transfer: Transfer){ + fun update(transfer: Transfer) { mTransferDao.insert(transfer) } @@ -82,11 +78,17 @@ class TransferRepository internal constructor(context: Context) { compositeDisposable.add(mTransferDao.getTransfersWithMissingValueIn(symbol) .map { transfer -> obtainFiatValue(transfer, symbol) } .subscribe({ - if(it.value >= 0) mEquivalentValuesDao.insert(it) - },{ - Log.e(TAG,"Error while trying to create a new equivalent value. Msg: ${it.message}") - for(element in it.stackTrace){ - Log.e(TAG,"${element.className}#${element.methodName}:${element.lineNumber}") + if (it.value >= 0) mEquivalentValuesDao.insert(it) + }, { + Log.e( + TAG, + "Error while trying to create a new equivalent value. Msg: ${it.message}" + ) + for (element in it.stackTrace) { + Log.e( + TAG, + "${element.className}#${element.methodName}:${element.lineNumber}" + ) } }) ) @@ -107,20 +109,23 @@ class TransferRepository internal constructor(context: Context) { val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.ROOT) val date = Date(transfer.timestamp * 1000) val response = sg.getService(CoingeckoService::class.java) - ?.getHistoricalValueSync("bitshares", dateFormat.format(date), false) - ?.execute() + ?.getHistoricalValueSync("bitshares", dateFormat.format(date), false) + ?.execute() var equivalentFiatValue = -1L - if(response?.isSuccessful == true){ - val price: Double = response.body()?.market_data?.current_price?.get(symbol.toLowerCase()) ?: -1.0 - if(price > 0){ + if (response?.isSuccessful == true) { + val price: Double = response.body()?.market_data?.current_price + ?.get(symbol.toLowerCase(Locale.getDefault())) ?: -1.0 + if (price > 0) { // The equivalent value is obtained by: // 1- Dividing the base value by 100000 (BTS native precision) // 2- Multiplying that BTS value by the unit price in the chosen fiat // 3- Multiplying the resulting value by 100 in order to express it in cents - equivalentFiatValue = Math.round(transfer.btsValue?.toFloat()?.div(1e5)?.times(price)?.times(100) ?: -1.0) + equivalentFiatValue = Math.round( + transfer.btsValue?.toFloat()?.div(1e5)?.times(price)?.times(100) ?: -1.0 + ) } - }else{ - Log.w(TAG,"Request was not successful. code: ${response?.code()}") + } else { + Log.w(TAG, "Request was not successful. code: ${response?.code()}") } return EquivalentValue(transfer.id, equivalentFiatValue, symbol) } @@ -160,7 +165,7 @@ class TransferRepository internal constructor(context: Context) { * be cleared. */ fun onCleared() { - if(!compositeDisposable.isDisposed) + if (!compositeDisposable.isDisposed) compositeDisposable.clear() } } \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/CryptoUtils.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/CryptoUtils.kt index 152947b..b32835f 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/CryptoUtils.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/utils/CryptoUtils.kt @@ -1,8 +1,9 @@ package cy.agorise.bitsybitshareswallet.utils import android.content.Context -import android.preference.PreferenceManager import android.util.Base64 +import androidx.core.content.edit +import androidx.preference.PreferenceManager import com.moldedbits.r2d2.R2d2 import java.security.MessageDigest @@ -32,11 +33,9 @@ object CryptoUtils { fun put(context: Context, key: String, value: String) { val r2d2 = R2d2(context) val encrypted = r2d2.encryptData(value) - PreferenceManager - .getDefaultSharedPreferences(context) - .edit() - .putString(key, encrypted) - .apply() + PreferenceManager.getDefaultSharedPreferences(context).edit { + putString(key, encrypted) + } } /**