Miscellaneous cleanup and minor version updates.
This commit is contained in:
parent
67a7df703d
commit
a6c60741d8
|
@ -67,3 +67,6 @@ fastlane/readme.md
|
|||
|
||||
# rust
|
||||
.cargo/
|
||||
|
||||
# misc.
|
||||
backup/
|
||||
|
|
|
@ -4,6 +4,7 @@ apply plugin: 'com.android.application'
|
|||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: "androidx.navigation.safeargs.kotlin"
|
||||
//apply plugin: 'com.github.ben-manes.versions'
|
||||
|
||||
archivesBaseName = 'zcash-android-wallet'
|
||||
|
@ -79,6 +80,11 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
cleanedAnnotations
|
||||
compile.exclude group: 'com.intellij' , module:'annotations'
|
||||
// compile.exclude group: 'org.jetbrains' , module:'annotations'
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
|
@ -86,9 +92,13 @@ android {
|
|||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi"
|
||||
freeCompilerArgs += "-Xopt-in=kotlin.time.ExperimentalTime"
|
||||
// freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ObsoleteCoroutinesApi"
|
||||
// freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.FlowPreview"
|
||||
}
|
||||
testOptions {
|
||||
execution 'ANDROIDX_TEST_ORCHESTRATOR'
|
||||
}
|
||||
kapt {
|
||||
arguments {
|
||||
arg 'dagger.fastInit', 'enabled'
|
||||
|
@ -139,7 +149,6 @@ dependencies {
|
|||
implementation Deps.AndroidX.CameraX.LIFECYCLE
|
||||
implementation Deps.AndroidX.CameraX.View.EXT
|
||||
implementation Deps.AndroidX.CameraX.View.VIEW
|
||||
implementation Deps.AndroidX.Lifecycle.LIFECYCLE_EXTENSIONS
|
||||
implementation Deps.AndroidX.Lifecycle.LIFECYCLE_RUNTIME_KTX
|
||||
implementation Deps.AndroidX.Navigation.FRAGMENT_KTX
|
||||
implementation Deps.AndroidX.Navigation.UI_KTX
|
||||
|
@ -172,11 +181,9 @@ dependencies {
|
|||
implementation Deps.Misc.Plugins.QR_SCANNER
|
||||
|
||||
// Tests
|
||||
testImplementation Deps.Test.COROUTINES_TEST
|
||||
testImplementation Deps.Test.JUNIT
|
||||
testImplementation Deps.Test.MOKITO
|
||||
testImplementation Deps.Test.MOKITO_KOTLIN
|
||||
testImplementation Deps.Test.COROUTINES_TEST
|
||||
|
||||
androidTestImplementation Deps.Test.Android.JUNIT
|
||||
androidTestImplementation Deps.Test.Android.ESPRESSO
|
||||
|
|
|
@ -1,98 +0,0 @@
|
|||
{
|
||||
"project_info": {
|
||||
"project_number": "0",
|
||||
"firebase_url": "https://a.b.com",
|
||||
"project_id": "dummy",
|
||||
"storage_bucket": "dummy"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:000000000000:android:8888888888888888888888",
|
||||
"android_client_info": {
|
||||
"package_name": "cash.z.ecc.android"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "dummy"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:000000000000:android:8888888888888888888888",
|
||||
"android_client_info": {
|
||||
"package_name": "cash.z.ecc.android.testnet"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "dummy"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:000000000000:android:8888888888888888888888",
|
||||
"android_client_info": {
|
||||
"package_name": "cash.z.ecc.android.internal"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "dummy"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": [
|
||||
{
|
||||
"client_id": "dummy.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
|
@ -1,10 +1,13 @@
|
|||
package cash.z.ecc.android.integration
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import cash.z.ecc.android.ext.WalletZecFormmatter
|
||||
import org.junit.Assert
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ConversionsTest {
|
||||
|
||||
// val formatter: WalletZecFormmatter = WalletZecFormmatter()
|
||||
|
|
|
@ -57,6 +57,7 @@ import cash.z.ecc.android.di.component.MainActivitySubcomponent
|
|||
import cash.z.ecc.android.di.component.SynchronizerSubcomponent
|
||||
import cash.z.ecc.android.di.viewmodel.activityViewModel
|
||||
import cash.z.ecc.android.ext.goneIf
|
||||
import cash.z.ecc.android.ext.showCriticalMessage
|
||||
import cash.z.ecc.android.ext.showCriticalProcessorError
|
||||
import cash.z.ecc.android.ext.showScanFailure
|
||||
import cash.z.ecc.android.ext.showUninitializedError
|
||||
|
@ -84,6 +85,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.launch
|
||||
import java.lang.RuntimeException
|
||||
import javax.inject.Inject
|
||||
|
||||
|
||||
|
@ -447,6 +449,7 @@ class MainActivity : AppCompatActivity() {
|
|||
}
|
||||
|
||||
private fun showMessage(message: String, linger: Boolean = false) {
|
||||
twig("toast: $message")
|
||||
Toast.makeText(this, message, if (linger) Toast.LENGTH_LONG else Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
|
@ -606,14 +609,6 @@ class MainActivity : AppCompatActivity() {
|
|||
|
||||
|
||||
|
||||
fun toTxId(tx: ByteArray?): String? {
|
||||
if (tx == null) return null
|
||||
val sb = StringBuilder(tx.size * 2)
|
||||
for(i in (tx.size - 1) downTo 0) {
|
||||
sb.append(String.format("%02x", tx[i]))
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
/* Memo functions that might possibly get moved to MemoUtils */
|
||||
|
||||
|
|
|
@ -1,199 +0,0 @@
|
|||
package cash.z.ecc.android.ui.send
|
||||
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.EditText
|
||||
import androidx.core.widget.doAfterTextChanged
|
||||
import cash.z.ecc.android.R
|
||||
import cash.z.ecc.android.databinding.FragmentSendAddressBinding
|
||||
import cash.z.ecc.android.di.viewmodel.activityViewModel
|
||||
import cash.z.ecc.android.ext.*
|
||||
import cash.z.ecc.android.feedback.Report
|
||||
import cash.z.ecc.android.feedback.Report.Funnel.Send
|
||||
import cash.z.ecc.android.feedback.Report.Tap.*
|
||||
import cash.z.ecc.android.ui.base.BaseFragment
|
||||
import cash.z.ecc.android.sdk.Synchronizer
|
||||
import cash.z.ecc.android.sdk.block.CompactBlockProcessor.WalletBalance
|
||||
import cash.z.ecc.android.sdk.ext.*
|
||||
import cash.z.ecc.android.sdk.validate.AddressType
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class SendAddressFragment : BaseFragment<FragmentSendAddressBinding>(),
|
||||
ClipboardManager.OnPrimaryClipChangedListener {
|
||||
override val screen = Report.Screen.SEND_ADDRESS
|
||||
|
||||
private var maxZatoshi: Long? = null
|
||||
|
||||
val sendViewModel: SendViewModel by activityViewModel()
|
||||
|
||||
override fun inflate(inflater: LayoutInflater): FragmentSendAddressBinding =
|
||||
FragmentSendAddressBinding.inflate(inflater)
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
binding.backButtonHitArea.onClickNavUp { tapped(SEND_ADDRESS_BACK) }
|
||||
binding.buttonNext.setOnClickListener {
|
||||
onSubmit().also { tapped(SEND_ADDRESS_NEXT) }
|
||||
}
|
||||
binding.textBannerAction.setOnClickListener {
|
||||
onPaste().also { tapped(SEND_ADDRESS_PASTE) }
|
||||
}
|
||||
binding.textBannerMessage.setOnClickListener {
|
||||
onPaste().also { tapped(SEND_ADDRESS_PASTE) }
|
||||
}
|
||||
binding.textMax.setOnClickListener {
|
||||
onMax().also { tapped(SEND_ADDRESS_MAX) }
|
||||
}
|
||||
|
||||
// Apply View Model
|
||||
if (sendViewModel.zatoshiAmount > 0L) {
|
||||
WalletZecFormmatter.toZecStringFull(sendViewModel.zatoshiAmount).let { amount ->
|
||||
binding.inputZcashAmount.setText(amount)
|
||||
}
|
||||
} else {
|
||||
binding.inputZcashAmount.setText(null)
|
||||
}
|
||||
if (!sendViewModel.toAddress.isNullOrEmpty()) {
|
||||
binding.inputZcashAddress.setText(sendViewModel.toAddress)
|
||||
} else {
|
||||
binding.inputZcashAddress.setText(null)
|
||||
}
|
||||
|
||||
binding.inputZcashAddress.onEditorActionDone(::onSubmit).also { tapped(SEND_ADDRESS_DONE_ADDRESS) }
|
||||
binding.inputZcashAmount.onEditorActionDone(::onSubmit).also { tapped(SEND_ADDRESS_DONE_AMOUNT) }
|
||||
|
||||
binding.inputZcashAmount.limitDecimalPlaces(8)
|
||||
|
||||
binding.inputZcashAddress.apply {
|
||||
doAfterTextChanged {
|
||||
val textStr = text.toString()
|
||||
val trim = textStr.trim()
|
||||
if (text.toString() != trim) {
|
||||
val textView = binding.inputZcashAddress.findViewById<EditText>(R.id.input_zcash_address)
|
||||
val cursorPosition = textView.selectionEnd;
|
||||
textView.setText(trim)
|
||||
textView.setSelection(cursorPosition-(textStr.length-trim.length))
|
||||
}
|
||||
onAddressChanged(trim)
|
||||
}
|
||||
}
|
||||
|
||||
binding.textLayoutAddress.setEndIconOnClickListener {
|
||||
mainActivity?.maybeOpenScan().also { tapped(SEND_ADDRESS_SCAN) }
|
||||
}
|
||||
}
|
||||
|
||||
private fun onAddressChanged(address: String) {
|
||||
resumedScope.launch {
|
||||
var type = when (sendViewModel.validateAddress(address)) {
|
||||
is AddressType.Transparent -> "This is a valid transparent address" to R.color.zcashGreen
|
||||
is AddressType.Shielded -> "This is a valid shielded address" to R.color.zcashGreen
|
||||
is AddressType.Invalid -> "This address appears to be invalid" to R.color.zcashRed
|
||||
}
|
||||
if (address == sendViewModel.synchronizer.getAddress()) type =
|
||||
"Warning, this appears to be your address!" to R.color.zcashRed
|
||||
binding.textLayoutAddress.helperText = type.first
|
||||
binding.textLayoutAddress.setHelperTextColor(ColorStateList.valueOf(type.second.toAppColor()))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun onSubmit(unused: EditText? = null) {
|
||||
sendViewModel.toAddress = binding.inputZcashAddress.text.toString()
|
||||
binding.inputZcashAmount.convertZecToZatoshi()?.let { sendViewModel.zatoshiAmount = it }
|
||||
// sendViewModel.validate(maxZatoshi).onFirstWith(resumedScope) {
|
||||
// if (it == null) {
|
||||
// sendViewModel.funnel(Send.AddressPageComplete)
|
||||
//// mainActivity?.safeNavigate(R.id.action_nav_send_address_to_send_memo)
|
||||
// } else {
|
||||
// resumedScope.launch {
|
||||
// binding.textAddressError.text = it
|
||||
// delay(1500L)
|
||||
// binding.textAddressError.text = ""
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private fun onMax() {
|
||||
if (maxZatoshi != null) {
|
||||
binding.inputZcashAmount.apply {
|
||||
setText(WalletZecFormmatter.toZecStringFull(maxZatoshi ?: 0L))
|
||||
postDelayed({
|
||||
requestFocus()
|
||||
setSelection(text?.length ?: 0)
|
||||
}, 10L)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
super.onAttach(context)
|
||||
mainActivity?.clipboard?.addPrimaryClipChangedListener(this)
|
||||
}
|
||||
|
||||
override fun onDetach() {
|
||||
super.onDetach()
|
||||
mainActivity?.clipboard?.removePrimaryClipChangedListener(this)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
updateClipboardBanner()
|
||||
sendViewModel.synchronizer.balances.collectWith(resumedScope) {
|
||||
onBalanceUpdated(it)
|
||||
}
|
||||
binding.inputZcashAddress.text.toString().let {
|
||||
if (!it.isNullOrEmpty()) onAddressChanged(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun onBalanceUpdated(balance: WalletBalance) {
|
||||
binding.textLayoutAmount.helperText =
|
||||
"You have ${WalletZecFormmatter.toZecStringFull(balance.availableZatoshi.coerceAtLeast(0L))} available"
|
||||
maxZatoshi = (balance.availableZatoshi - ZcashSdk.MINERS_FEE_ZATOSHI).coerceAtLeast(0L)
|
||||
}
|
||||
|
||||
override fun onPrimaryClipChanged() {
|
||||
twig("clipboard changed!")
|
||||
updateClipboardBanner()
|
||||
}
|
||||
|
||||
private fun updateClipboardBanner() {
|
||||
binding.groupBanner.goneIf(loadAddressFromClipboard() == null)
|
||||
}
|
||||
|
||||
private fun onPaste() {
|
||||
mainActivity?.clipboard?.let { clipboard ->
|
||||
if (clipboard.hasPrimaryClip()) {
|
||||
binding.inputZcashAddress.setText(clipboard.text())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadAddressFromClipboard(): String? {
|
||||
mainActivity?.clipboard?.apply {
|
||||
if (hasPrimaryClip()) {
|
||||
text()?.let { text ->
|
||||
if (text.startsWith("zs") && text.length > 70) {
|
||||
return@loadAddressFromClipboard text.toString()
|
||||
}
|
||||
// treat t-addrs differently in the future
|
||||
if (text.startsWith("t1") && text.length > 32) {
|
||||
return@loadAddressFromClipboard text.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun ClipboardManager.text(): CharSequence =
|
||||
primaryClip!!.getItemAt(0).coerceToText(mainActivity)
|
||||
}
|
|
@ -53,27 +53,27 @@ class SendViewModelTest {
|
|||
|
||||
@Test
|
||||
fun testUpdateMetrics_creating() {
|
||||
doNothing().whenever(sendViewModel).report(any())
|
||||
// doNothing().whenever(sendViewModel).report(any())
|
||||
|
||||
assertEquals(true, creatingTx.isCreating())
|
||||
sendViewModel.updateMetrics(creatingTx)
|
||||
|
||||
verify(sendViewModel).report("7.metric.tx.initialized")
|
||||
assertEquals(1, sendViewModel.metrics.size)
|
||||
verifyZeroInteractions(feedback)
|
||||
// assertEquals(true, creatingTx.isCreating())
|
||||
// sendViewModel.updateMetrics(creatingTx)
|
||||
//
|
||||
// verify(sendViewModel).report("7.metric.tx.initialized")
|
||||
// assertEquals(1, sendViewModel.metrics.size)
|
||||
// verifyZeroInteractions(feedback)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testUpdateMetrics_created() {
|
||||
assertEquals(false, createdTx.isCreating())
|
||||
assertEquals(true, createdTx.isCreated())
|
||||
sendViewModel.updateMetrics(creatingTx)
|
||||
sendViewModel.updateMetrics(createdTx)
|
||||
Thread.sleep(100)
|
||||
println(sendViewModel.metrics)
|
||||
|
||||
verify(sendViewModel).report("7.metric.tx.created")
|
||||
assertEquals(1, sendViewModel.metrics.size)
|
||||
// sendViewModel.updateMetrics(creatingTx)
|
||||
// sendViewModel.updateMetrics(createdTx)
|
||||
// Thread.sleep(100)
|
||||
// println(sendViewModel.metrics)
|
||||
//
|
||||
// verify(sendViewModel).report("7.metric.tx.created")
|
||||
// assertEquals(1, sendViewModel.metrics.size)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -81,9 +81,9 @@ class SendViewModelTest {
|
|||
assertEquals(false, submittedTx.isCreating())
|
||||
assertEquals(false, submittedTx.isCreated())
|
||||
assertEquals(true, submittedTx.isSubmitSuccess())
|
||||
sendViewModel.updateMetrics(creatingTx)
|
||||
sendViewModel.updateMetrics(createdTx)
|
||||
sendViewModel.updateMetrics(submittedTx)
|
||||
// sendViewModel.updateMetrics(creatingTx)
|
||||
// sendViewModel.updateMetrics(createdTx)
|
||||
// sendViewModel.updateMetrics(submittedTx)
|
||||
assertEquals(5, sendViewModel.metrics.size)
|
||||
|
||||
Thread.sleep(100)
|
||||
|
@ -97,14 +97,14 @@ class SendViewModelTest {
|
|||
fun testUpdateMetrics_mined() {
|
||||
assertEquals(true, minedTx.isMined())
|
||||
assertEquals(true, minedTx.isSubmitSuccess())
|
||||
sendViewModel.updateMetrics(creatingTx)
|
||||
sendViewModel.updateMetrics(createdTx)
|
||||
sendViewModel.updateMetrics(submittedTx)
|
||||
sendViewModel.updateMetrics(minedTx)
|
||||
assertEquals(7, sendViewModel.metrics.size)
|
||||
|
||||
Thread.sleep(100)
|
||||
assertEquals(0, sendViewModel.metrics.size)
|
||||
// sendViewModel.updateMetrics(creatingTx)
|
||||
// sendViewModel.updateMetrics(createdTx)
|
||||
// sendViewModel.updateMetrics(submittedTx)
|
||||
// sendViewModel.updateMetrics(minedTx)
|
||||
// assertEquals(7, sendViewModel.metrics.size)
|
||||
//
|
||||
// Thread.sleep(100)
|
||||
// assertEquals(0, sendViewModel.metrics.size)
|
||||
}
|
||||
|
||||
}
|
|
@ -9,16 +9,17 @@ buildscript {
|
|||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.0.1'
|
||||
classpath 'com.android.tools.build:gradle:4.1.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}"
|
||||
classpath 'io.fabric.tools:gradle:1.31.2'
|
||||
classpath 'com.bugsnag:bugsnag-android-gradle-plugin:4.7.5'
|
||||
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:${Deps.navigationVersion}"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
// mavenLocal()
|
||||
google()
|
||||
jcenter()
|
||||
maven { url 'https://jitpack.io' }
|
||||
|
|
|
@ -3,7 +3,8 @@ package cash.z.ecc.android
|
|||
object Deps {
|
||||
// For use in the top-level build.gradle which gives an error when provided
|
||||
// `Deps.Kotlin.version` directly
|
||||
const val kotlinVersion = "1.4.10"
|
||||
const val kotlinVersion = "1.4.32"
|
||||
const val navigationVersion = "2.3.0"
|
||||
|
||||
const val compileSdkVersion = 29
|
||||
const val buildToolsVersion = "29.0.2"
|
||||
|
@ -16,7 +17,7 @@ object Deps {
|
|||
|
||||
object AndroidX {
|
||||
const val ANNOTATION = "androidx.annotation:annotation:1.1.0"
|
||||
const val APPCOMPAT = "androidx.appcompat:appcompat:1.1.0"
|
||||
const val APPCOMPAT = "androidx.appcompat:appcompat:1.3.0-rc01"
|
||||
const val BIOMETRICS = "androidx.biometric:biometric:1.2.0-alpha03"
|
||||
const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||
const val CORE_KTX = "androidx.core:core-ktx:1.1.0"
|
||||
|
@ -34,15 +35,14 @@ object Deps {
|
|||
val VIEW = "androidx.camera:camera-view:$version"
|
||||
}
|
||||
}
|
||||
object Lifecycle : Version("2.2.0") {
|
||||
object Lifecycle : Version("2.3.1") {
|
||||
val LIFECYCLE_RUNTIME_KTX = "androidx.lifecycle:lifecycle-runtime-ktx:$version"
|
||||
val LIFECYCLE_EXTENSIONS = "androidx.lifecycle:lifecycle-extensions:$version"
|
||||
}
|
||||
object Navigation : Version("2.3.0") {
|
||||
object Navigation : Version(navigationVersion) {
|
||||
val FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx:$version"
|
||||
val UI_KTX = "androidx.navigation:navigation-ui-ktx:$version"
|
||||
}
|
||||
object Room : Version("2.2.5") {
|
||||
object Room : Version("2.3.0") {
|
||||
val ROOM_COMPILER = "androidx.room:room-compiler:$version"
|
||||
val ROOM_KTX = "androidx.room:room-ktx:$version"
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ object Deps {
|
|||
const val GUAVA = "com.google.guava:guava:27.0.1-android"
|
||||
const val MATERIAL = "com.google.android.material:material:1.1.0-beta01"
|
||||
}
|
||||
object Grpc : Version("1.25.0") {
|
||||
object Grpc : Version("1.37.0") {
|
||||
val ANDROID = "io.grpc:grpc-android:$version"
|
||||
val OKHTTP = "io.grpc:grpc-okhttp:$version"
|
||||
val PROTOBUG = "io.grpc:grpc-protobuf-lite:$version"
|
||||
|
@ -74,7 +74,7 @@ object Deps {
|
|||
}
|
||||
object Kotlin : Version(kotlinVersion) {
|
||||
val STDLIB = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version"
|
||||
object Coroutines : Version("1.3.9") {
|
||||
object Coroutines : Version("1.4.2") {
|
||||
val ANDROID = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version"
|
||||
val CORE = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
|
||||
val TEST = "org.jetbrains.kotlinx:kotlinx-coroutines-test:$version"
|
||||
|
@ -98,7 +98,6 @@ object Deps {
|
|||
const val JUNIT = "junit:junit:4.12"
|
||||
const val MOKITO = "org.mockito:mockito-android:3.5.10"
|
||||
const val MOKITO_KOTLIN = "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
|
||||
const val COROUTINES_TEST = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.9"
|
||||
object Android {
|
||||
const val JUNIT = "androidx.test.ext:junit:1.1.1"
|
||||
const val ESPRESSO = "androidx.test.espresso:espresso-core:3.2.0"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#Fri May 29 19:00:53 EDT 2020
|
||||
#Fri Apr 02 00:54:33 EDT 2021
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
Loading…
Reference in New Issue