From 78cac0cd90ae444e49f3f805b300fb21ac0e1015 Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 1/6] Replace divider with standard library
Also, cleanup some unused classes
---
V2rayNG/app/build.gradle | 3 --
.../com/v2ray/ang/ui/PerAppProxyActivity.kt | 8 ++---
V2rayNG/app/src/main/res/raw/licenses.xml | 32 +------------------
3 files changed, 5 insertions(+), 38 deletions(-)
diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle
index 3c906e29..a0cb7c43 100644
--- a/V2rayNG/app/build.gradle
+++ b/V2rayNG/app/build.gradle
@@ -89,12 +89,9 @@ dependencies {
implementation 'io.reactivex:rxjava:1.3.4'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
- implementation 'com.dinuscxj:recycleritemdecoration:1.0.0'
- implementation 'io.reactivex:rxkotlin:0.60.0'
implementation 'me.dm7.barcodescanner:core:1.9.8'
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar'
- implementation 'com.beust:klaxon:3.0.1'
implementation(name: 'libv2ray', ext: 'aar')
//implementation(name: 'tun2socks', ext: 'aar')
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
index 3ba3120c..d154d4d3 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
@@ -4,6 +4,8 @@ import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.content.Context
import android.os.Bundle
+import android.support.v7.widget.DividerItemDecoration
+import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.util.Log
@@ -12,7 +14,6 @@ import android.view.MenuItem
import android.view.View
import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
-import com.dinuscxj.itemdecoration.LinearDividerItemDecoration
import com.v2ray.ang.R
import com.v2ray.ang.extension.defaultDPreference
import com.v2ray.ang.util.AppManagerUtil
@@ -47,8 +48,7 @@ class PerAppProxyActivity : BaseActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
- val dividerItemDecoration = LinearDividerItemDecoration(
- this, LinearDividerItemDecoration.LINEAR_DIVIDER_VERTICAL)
+ val dividerItemDecoration = DividerItemDecoration(this, LinearLayoutManager.VERTICAL)
recycler_view.addItemDecoration(dividerItemDecoration)
val blacklist = defaultDPreference.getPrefStringSet(PREF_PER_APP_PROXY_SET, null)
@@ -276,4 +276,4 @@ class PerAppProxyActivity : BaseActivity() {
}
return true
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/res/raw/licenses.xml b/V2rayNG/app/src/main/res/raw/licenses.xml
index 2df2478e..e7949142 100644
--- a/V2rayNG/app/src/main/res/raw/licenses.xml
+++ b/V2rayNG/app/src/main/res/raw/licenses.xml
@@ -17,12 +17,6 @@
Copyright(C) 2008-2011 The Android Open Source Project
Apache Software License 2.0
-
- Apache Commons Validator
- http://commons.apache.org/proper/commons-collections/
- Copyright(C) 2001-2014 The Apache Software Foundation
- Apache Software License 2.0
-
anko
https://github.com/Kotlin/anko
@@ -52,33 +46,9 @@
Copyright 2015 Square, Inc.
Apache Software License 2.0
-
- ReactiveNetwork
- https://github.com/pwittchen/ReactiveNetwork
- Copyright 2016 Piotr Wittchen
- Apache Software License 2.0
-
-
- RecyclerItemDecoration
- https://github.com/dinuscxj/RecyclerItemDecoration
- Copyright 2015-2019 dinus
- Apache Software License 2.0
-
-
- RxKotlin
- https://github.com/ReactiveX/RxKotlin
- Copyright 2012 Netflix, Inc.
- Apache Software License 2.0
-
RxPermissions
https://github.com/tbruyelle/RxPermissions
Apache Software License 2.0
-
- RecyclerItemDecoration
- https://github.com/dinuscxj/RecyclerItemDecoration
- Copyright 2015-2019 dinus
- Apache Software License 2.0
-
-
\ No newline at end of file
+
From c2a704a6ea56a384219292973387ddd136ff709a Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 2/6] Deprecate some anko function
- Replace toast with inline function
- Use standard startActivityForResult
---
V2rayNG/app/build.gradle | 3 ---
.../main/kotlin/com/v2ray/ang/extension/_Ext.kt | 12 ++++++++++++
.../kotlin/com/v2ray/ang/ui/LogcatActivity.kt | 2 +-
.../main/kotlin/com/v2ray/ang/ui/MainActivity.kt | 4 ++--
.../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 2 +-
.../com/v2ray/ang/ui/PerAppProxyActivity.kt | 2 +-
.../com/v2ray/ang/ui/RoutingSettingsFragment.kt | 15 ++++-----------
.../kotlin/com/v2ray/ang/ui/ScScannerActivity.kt | 8 ++++----
.../kotlin/com/v2ray/ang/ui/ScannerActivity.kt | 12 +-----------
.../kotlin/com/v2ray/ang/ui/Server2Activity.kt | 4 ++--
.../kotlin/com/v2ray/ang/ui/Server3Activity.kt | 4 ++--
.../kotlin/com/v2ray/ang/ui/Server4Activity.kt | 4 ++--
.../kotlin/com/v2ray/ang/ui/ServerActivity.kt | 4 ++--
.../kotlin/com/v2ray/ang/ui/SettingsActivity.kt | 2 +-
.../kotlin/com/v2ray/ang/ui/SubEditActivity.kt | 4 ++--
.../src/main/kotlin/com/v2ray/ang/util/Utils.kt | 3 +--
16 files changed, 38 insertions(+), 47 deletions(-)
diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle
index a0cb7c43..1352b28a 100644
--- a/V2rayNG/app/build.gradle
+++ b/V2rayNG/app/build.gradle
@@ -82,9 +82,6 @@ dependencies {
// DSL
implementation "org.jetbrains.anko:anko-sdk15:$ankoVersion"
- implementation "org.jetbrains.anko:anko-support-v4:$ankoVersion"
- implementation "org.jetbrains.anko:anko-appcompat-v7:$ankoVersion"
- implementation "org.jetbrains.anko:anko-design:$ankoVersion"
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.reactivex:rxjava:1.3.4'
implementation 'io.reactivex:rxandroid:1.2.1'
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
index a1cc220c..5e74b662 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
@@ -2,6 +2,7 @@ package com.v2ray.ang.extension
import android.content.Context
import android.os.Build
+import android.widget.Toast
import com.v2ray.ang.AngApplication
import me.dozen.dpreference.DPreference
import org.json.JSONObject
@@ -17,6 +18,17 @@ val Context.v2RayApplication: AngApplication
val Context.defaultDPreference: DPreference
get() = v2RayApplication.defaultDPreference
+inline fun Context.toast(message: Int): Toast = Toast
+ .makeText(this, message, Toast.LENGTH_SHORT)
+ .apply {
+ show()
+ }
+
+inline fun Context.toast(message: CharSequence): Toast = Toast
+ .makeText(this, message, Toast.LENGTH_SHORT)
+ .apply {
+ show()
+ }
fun JSONObject.putOpt(pair: Pair) = putOpt(pair.first, pair.second)!!
fun JSONObject.putOpt(pairs: Map) = pairs.forEach { putOpt(it.key to it.value) }
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
index d56395b8..e4f5205c 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
@@ -8,10 +8,10 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import com.v2ray.ang.R
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_logcat.*
import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.toast
import org.jetbrains.anko.uiThread
import java.io.IOException
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
index f4c1148c..04ae2f7b 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
@@ -30,7 +30,7 @@ import android.util.Log
import com.v2ray.ang.BuildConfig
import com.v2ray.ang.dto.EConfigType
import com.v2ray.ang.extension.defaultDPreference
-//import com.v2ray.ang.InappBuyActivity
+import com.v2ray.ang.extension.toast
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
@@ -306,7 +306,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
.request(Manifest.permission.CAMERA)
.subscribe {
if (it)
- startActivityForResult(requestCode)
+ startActivityForResult(Intent(this, ScannerActivity::class.java), requestCode)
else
toast(R.string.toast_permission_denied)
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
index cb675384..a84ef8ea 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
@@ -9,7 +9,7 @@ import com.v2ray.ang.AppConfig
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
import com.v2ray.ang.dto.EConfigType
-import com.v2ray.ang.extension.defaultDPreference
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.helper.ItemTouchHelperAdapter
import com.v2ray.ang.helper.ItemTouchHelperViewHolder
import com.v2ray.ang.util.AngConfigManager
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
index d154d4d3..837b26df 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
@@ -26,10 +26,10 @@ import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import com.v2ray.ang.AppConfig
import com.v2ray.ang.dto.AppInfo
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.v2RayApplication
import com.v2ray.ang.util.Utils
import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.toast
import org.jetbrains.anko.uiThread
import java.net.URL
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
index 492829ed..67d88aa5 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
@@ -1,30 +1,23 @@
package com.v2ray.ang.ui
-
import android.Manifest
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
-import android.text.TextUtils
-import android.util.Log
import android.view.*
import com.v2ray.ang.R
import com.v2ray.ang.extension.defaultDPreference
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.fragment_routing_settings.*
-import org.jetbrains.anko.toast
import android.view.MenuInflater
import com.tbruyelle.rxpermissions.RxPermissions
import com.v2ray.ang.AppConfig
+import com.v2ray.ang.extension.toast
import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.startActivityForResult
-import org.jetbrains.anko.support.v4.startActivityForResult
-import org.jetbrains.anko.support.v4.toast
import org.jetbrains.anko.uiThread
import java.net.URL
-
class RoutingSettingsFragment : Fragment() {
companion object {
private const val routing_arg = "routing_arg"
@@ -96,7 +89,7 @@ class RoutingSettingsFragment : Fragment() {
.request(Manifest.permission.CAMERA)
.subscribe {
if (it)
- startActivityForResult(requestCode)
+ startActivityForResult(Intent(activity, ScannerActivity::class.java), requestCode)
else
activity?.toast(R.string.toast_permission_denied)
}
@@ -118,12 +111,12 @@ class RoutingSettingsFragment : Fragment() {
}
}
- toast(R.string.msg_downloading_content)
+ activity?.toast(R.string.msg_downloading_content)
doAsync {
val content = URL(url).readText()
uiThread {
et_routing_content.text = Utils.getEditable(content!!)
- toast(R.string.toast_success)
+ activity?.toast(R.string.toast_success)
}
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt
index b3cd04bb..23297e76 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt
@@ -6,7 +6,7 @@ import com.tbruyelle.rxpermissions.RxPermissions
import com.v2ray.ang.R
import com.v2ray.ang.util.AngConfigManager
import android.os.Bundle
-import org.jetbrains.anko.*
+import com.v2ray.ang.extension.toast
class ScScannerActivity : BaseActivity() {
companion object {
@@ -24,7 +24,7 @@ class ScScannerActivity : BaseActivity() {
.request(Manifest.permission.CAMERA)
.subscribe {
if (it)
- startActivityForResult(requestCode)
+ startActivityForResult(Intent(this, ScannerActivity::class.java), requestCode)
else
toast(R.string.toast_permission_denied)
}
@@ -43,10 +43,10 @@ class ScScannerActivity : BaseActivity() {
} else {
toast(R.string.toast_failure)
}
- startActivity()
+ startActivity(Intent(this, MainActivity::class.java))
}
}
finish()
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
index eff431da..6f1dafd1 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
@@ -7,23 +7,13 @@ import com.google.zxing.Result
import me.dm7.barcodescanner.zxing.ZXingScannerView
import android.content.Intent
import android.graphics.BitmapFactory
-import android.icu.util.TimeUnit
import android.view.Menu
import android.view.MenuItem
import com.google.zxing.BarcodeFormat
import com.tbruyelle.rxpermissions.RxPermissions
import com.v2ray.ang.R
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.QRCodeDecoder
-import org.jetbrains.anko.toast
-import rx.Observable
-import android.os.SystemClock
-import kotlinx.android.synthetic.main.activity_main.*
-import rx.Observer
-import rx.android.schedulers.AndroidSchedulers
-import javax.xml.datatype.DatatypeConstants.SECONDS
-
-
-
class ScannerActivity : BaseActivity(), ZXingScannerView.ResultHandler {
companion object {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
index bdfba4c2..02ee56ae 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
@@ -10,13 +10,13 @@ import com.v2ray.ang.AppConfig
import com.v2ray.ang.R
import com.v2ray.ang.extension.defaultDPreference
import com.v2ray.ang.dto.AngConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server2.*
import org.jetbrains.anko.*
import java.lang.Exception
-
class Server2Activity : BaseActivity() {
companion object {
private const val REQUEST_SCAN = 1
@@ -158,4 +158,4 @@ class Server2Activity : BaseActivity() {
}
else -> super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
index 92ee6e2f..248feb1e 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
@@ -6,12 +6,12 @@ import android.view.Menu
import android.view.MenuItem
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server3.*
import org.jetbrains.anko.*
-
class Server3Activity : BaseActivity() {
companion object {
private const val REQUEST_SCAN = 1
@@ -172,4 +172,4 @@ class Server3Activity : BaseActivity() {
}
else -> super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
index 97fb4d63..b4b9d007 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
@@ -6,12 +6,12 @@ import android.view.Menu
import android.view.MenuItem
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server4.*
import org.jetbrains.anko.*
-
class Server4Activity : BaseActivity() {
companion object {
private const val REQUEST_SCAN = 1
@@ -156,4 +156,4 @@ class Server4Activity : BaseActivity() {
}
else -> super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
index d2a14035..ae753cd3 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
@@ -6,12 +6,12 @@ import android.view.Menu
import android.view.MenuItem
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server.*
import org.jetbrains.anko.*
-
class ServerActivity : BaseActivity() {
companion object {
private const val REQUEST_SCAN = 1
@@ -215,4 +215,4 @@ class ServerActivity : BaseActivity() {
}
else -> super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
index b46eff3f..476d85b2 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
@@ -5,10 +5,10 @@ import android.support.v7.preference.*
import android.view.View
import com.v2ray.ang.R
import com.v2ray.ang.AppConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.Utils
import org.jetbrains.anko.defaultSharedPreferences
import org.jetbrains.anko.startActivity
-import org.jetbrains.anko.toast
class SettingsActivity : BaseActivity() {
companion object {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
index d8cb7d2e..dfb6a716 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
@@ -6,12 +6,12 @@ import android.view.Menu
import android.view.MenuItem
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_sub_edit.*
import org.jetbrains.anko.*
-
class SubEditActivity : BaseActivity() {
var del_config: MenuItem? = null
@@ -135,4 +135,4 @@ class SubEditActivity : BaseActivity() {
}
else -> super.onOptionsItemSelected(item)
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt
index efcdde4d..8189b31b 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt
@@ -24,18 +24,17 @@ import com.v2ray.ang.AppConfig
import com.v2ray.ang.R
import com.v2ray.ang.dto.EConfigType
import com.v2ray.ang.extension.responseLength
+import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.v2RayApplication
import com.v2ray.ang.service.V2RayServiceManager
import com.v2ray.ang.ui.SettingsActivity
import kotlinx.coroutines.isActive
import me.dozen.dpreference.DPreference
-import org.jetbrains.anko.toast
import java.io.IOException
import java.net.*
import libv2ray.Libv2ray
import kotlin.coroutines.coroutineContext
-
object Utils {
val tcpTestingSockets = ArrayList()
From 2956fa20308515df1a051954641a36659e8696da Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 3/6] Replace doasync with Kotlin coroutine
Using a custom coroutine scope, we don't need to keep track of the
running job. We can simply call cancel children for the scope.
---
.../com/v2ray/ang/service/V2RayVpnService.kt | 6 ++-
.../kotlin/com/v2ray/ang/ui/LogcatActivity.kt | 10 ++---
.../kotlin/com/v2ray/ang/ui/MainActivity.kt | 39 +++++++++++--------
.../com/v2ray/ang/ui/PerAppProxyActivity.kt | 16 +++++---
.../v2ray/ang/ui/RoutingSettingsFragment.kt | 18 ++++++---
5 files changed, 54 insertions(+), 35 deletions(-)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
index 823776a1..5b213a67 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
@@ -16,7 +16,9 @@ import com.v2ray.ang.extension.defaultDPreference
import com.v2ray.ang.ui.PerAppProxyActivity
import com.v2ray.ang.ui.SettingsActivity
import com.v2ray.ang.util.Utils
-import org.jetbrains.anko.doAsync
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import java.io.File
import java.lang.ref.SoftReference
@@ -170,7 +172,7 @@ class V2RayVpnService : VpnService(), ServiceControl {
val fd = mInterface.fileDescriptor
val path = File(Utils.packagePath(applicationContext), "sock_path").absolutePath
- doAsync {
+ GlobalScope.launch(Dispatchers.IO) {
var tries = 0
while (true) try {
Thread.sleep(50L shl tries)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
index e4f5205c..620ab3a1 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
@@ -11,9 +11,9 @@ import com.v2ray.ang.R
import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_logcat.*
-import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.uiThread
-
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import java.io.IOException
import java.util.LinkedHashSet
@@ -34,7 +34,7 @@ class LogcatActivity : BaseActivity() {
try {
pb_waiting.visibility = View.VISIBLE
- doAsync {
+ GlobalScope.launch(Dispatchers.Default) {
if (shouldFlushLog) {
val lst = LinkedHashSet()
lst.add("logcat")
@@ -54,7 +54,7 @@ class LogcatActivity : BaseActivity() {
// InputStreamReader(process.inputStream))
// val allText = bufferedReader.use(BufferedReader::readText)
val allText = process.inputStream.bufferedReader().use { it.readText() }
- uiThread {
+ launch(Dispatchers.Main) {
tv_logcat.text = allText
tv_logcat.movementMethod = ScrollingMovementMethod()
pb_waiting.visibility = View.GONE
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
index 04ae2f7b..8fc201d4 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
@@ -63,7 +63,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
private val adapter by lazy { MainRecyclerAdapter(this) }
private var mItemTouchHelper: ItemTouchHelper? = null
- private val testingJobs = ArrayList()
+ private val tcpingTestScope by lazy { CoroutineScope(Dispatchers.IO) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -90,9 +90,9 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
val socksPort = 10808//Utils.parseInt(defaultDPreference.getPrefString(SettingsActivity.PREF_SOCKS_PORT, "10808"))
tv_test_state.text = getString(R.string.connection_test_testing)
- doAsync {
+ GlobalScope.launch(Dispatchers.IO) {
val result = Utils.testConnection(this@MainActivity, socksPort)
- uiThread {
+ launch(Dispatchers.Main) {
tv_test_state.text = Utils.getEditable(result)
}
}
@@ -249,10 +249,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
}
R.id.ping_all -> {
- testingJobs.forEach {
- it.cancel()
- }
- testingJobs.clear()
+ tcpingTestScope.coroutineContext[Job]?.cancelChildren()
Utils.closeAllTcpSockets()
for (k in 0 until configs.vmess.count()) {
configs.vmess[k].testResult = ""
@@ -267,16 +264,14 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
serverAddress = serverOutbound.getServerAddress() ?: continue
serverPort = serverOutbound.getServerPort() ?: continue
}
- testingJobs.add(GlobalScope.launch(Dispatchers.IO) {
+ tcpingTestScope.launch {
configs.vmess.getOrNull(k)?.let { // check null in case array is modified during testing
it.testResult = Utils.tcping(serverAddress, serverPort)
- val myJob = coroutineContext[Job]
launch(Dispatchers.Main) {
- testingJobs.remove(myJob)
adapter.updateSelectedItem(k)
}
}
- })
+ }
}
true
}
@@ -392,9 +387,14 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
toast(R.string.toast_invalid_url)
return false
}
- doAsync {
- val configText = URL(url).readText()
- uiThread {
+ GlobalScope.launch(Dispatchers.IO) {
+ val configText = try {
+ URL(url).readText()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ launch(Dispatchers.Main) {
importCustomizeConfig(configText)
}
}
@@ -426,9 +426,14 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
continue
}
Log.d("Main", url)
- doAsync {
- val configText = URL(url).readText()
- uiThread {
+ GlobalScope.launch(Dispatchers.IO) {
+ val configText = try {
+ URL(url).readText()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ launch(Dispatchers.Main) {
importBatchConfig(Utils.decode(configText), id)
}
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
index 837b26df..2b5ddd41 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
@@ -29,8 +29,9 @@ import com.v2ray.ang.dto.AppInfo
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.v2RayApplication
import com.v2ray.ang.util.Utils
-import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.uiThread
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import java.net.URL
class PerAppProxyActivity : BaseActivity() {
@@ -220,9 +221,14 @@ class PerAppProxyActivity : BaseActivity() {
private fun selectProxyApp() {
toast(R.string.msg_downloading_content)
val url = AppConfig.androidpackagenamelistUrl
- doAsync {
- val content = URL(url).readText()
- uiThread {
+ GlobalScope.launch(Dispatchers.IO) {
+ val content = try {
+ URL(url).readText()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ launch(Dispatchers.Main) {
Log.d("selectProxyApp", content)
selectProxyApp(content)
toast(R.string.toast_success)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
index 67d88aa5..97917148 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
@@ -14,8 +14,9 @@ import android.view.MenuInflater
import com.tbruyelle.rxpermissions.RxPermissions
import com.v2ray.ang.AppConfig
import com.v2ray.ang.extension.toast
-import org.jetbrains.anko.doAsync
-import org.jetbrains.anko.uiThread
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import java.net.URL
class RoutingSettingsFragment : Fragment() {
@@ -112,10 +113,15 @@ class RoutingSettingsFragment : Fragment() {
}
activity?.toast(R.string.msg_downloading_content)
- doAsync {
- val content = URL(url).readText()
- uiThread {
- et_routing_content.text = Utils.getEditable(content!!)
+ GlobalScope.launch(Dispatchers.IO) {
+ val content = try {
+ URL(url).readText()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ launch(Dispatchers.Main) {
+ et_routing_content.text = Utils.getEditable(content)
activity?.toast(R.string.toast_success)
}
}
From 10f705a8b26cb4793955050ec3c5744e7be2ab09 Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 4/6] Use standard startActivity
---
.../com/v2ray/ang/ui/BaseDrawerActivity.kt | 6 +-----
.../main/kotlin/com/v2ray/ang/ui/MainActivity.kt | 16 ++++++++++------
.../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 11 +++++++----
.../kotlin/com/v2ray/ang/ui/SettingsActivity.kt | 6 +++---
.../com/v2ray/ang/ui/SubSettingActivity.kt | 8 +++++---
.../v2ray/ang/ui/SubSettingRecyclerAdapter.kt | 5 ++++-
6 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseDrawerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseDrawerActivity.kt
index 6227f9ac..231575bb 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseDrawerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseDrawerActivity.kt
@@ -13,11 +13,7 @@ import android.support.v7.widget.Toolbar
import android.util.Log
import android.view.MenuItem
import android.view.View
-//import com.v2ray.ang.InappBuyActivity
-
import com.v2ray.ang.R
-import org.jetbrains.anko.startActivity
-
abstract class BaseDrawerActivity : BaseActivity() {
companion object {
@@ -58,7 +54,7 @@ abstract class BaseDrawerActivity : BaseActivity() {
R.id.sub_setting -> activityClass = SubSettingActivity::class.java
R.id.settings -> activityClass = SettingsActivity::class.java
R.id.logcat -> {
- startActivity()
+ startActivity(Intent(this@BaseDrawerActivity, LogcatActivity::class.java))
return
}
R.id.donate -> {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
index 8fc201d4..aed907a4 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
@@ -188,6 +188,9 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
return true
}
+ private fun getOptionIntent() = Intent().putExtra("position", -1)
+ .putExtra("isRunning", isRunning)
+
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.import_qrcode -> {
importQRcode(REQUEST_SCAN)
@@ -198,17 +201,17 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
true
}
R.id.import_manually_vmess -> {
- startActivity("position" to -1, "isRunning" to isRunning)
+ startActivity(getOptionIntent().setClass(this, ServerActivity::class.java))
adapter.updateConfigList()
true
}
R.id.import_manually_ss -> {
- startActivity("position" to -1, "isRunning" to isRunning)
+ startActivity(getOptionIntent().setClass(this, Server3Activity::class.java))
adapter.updateConfigList()
true
}
R.id.import_manually_socks -> {
- startActivity("position" to -1, "isRunning" to isRunning)
+ startActivity(getOptionIntent().setClass(this, Server4Activity::class.java))
adapter.updateConfigList()
true
}
@@ -579,10 +582,11 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
when (item.itemId) {
//R.id.server_profile -> activityClass = MainActivity::class.java
R.id.sub_setting -> {
- startActivity()
+ startActivity(Intent(this, SubSettingActivity::class.java))
}
R.id.settings -> {
- startActivity("isRunning" to isRunning)
+ startActivity(Intent(this, SettingsActivity::class.java)
+ .putExtra("isRunning", isRunning))
}
R.id.feedback -> {
Utils.openUri(this, AppConfig.v2rayNGIssues)
@@ -594,7 +598,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
// startActivity()
}
R.id.logcat -> {
- startActivity()
+ startActivity(Intent(this, LogcatActivity::class.java))
}
}
drawer_layout.closeDrawer(GravityCompat.START)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
index a84ef8ea..4eddafb5 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
@@ -1,5 +1,6 @@
package com.v2ray.ang.ui
+import android.content.Intent
import android.graphics.Color
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
@@ -121,14 +122,16 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter("position" to position, "isRunning" to !changeable)
+ mActivity.startActivity(intent.setClass(mActivity, ServerActivity::class.java))
} else if (configType == EConfigType.CUSTOM) {
- mActivity.startActivity("position" to position, "isRunning" to !changeable)
+ mActivity.startActivity(intent.setClass(mActivity, Server2Activity::class.java))
} else if (configType == EConfigType.SHADOWSOCKS) {
- mActivity.startActivity("position" to position, "isRunning" to !changeable)
+ mActivity.startActivity(intent.setClass(mActivity, Server3Activity::class.java))
} else if (configType == EConfigType.SOCKS) {
- mActivity.startActivity("position" to position, "isRunning" to !changeable)
+ mActivity.startActivity(intent.setClass(mActivity, Server4Activity::class.java))
}
}
holder.layout_remove.setOnClickListener {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
index 476d85b2..936495eb 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
@@ -1,5 +1,6 @@
package com.v2ray.ang.ui
+import android.content.Intent
import android.os.Bundle
import android.support.v7.preference.*
import android.view.View
@@ -8,7 +9,6 @@ import com.v2ray.ang.AppConfig
import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.Utils
import org.jetbrains.anko.defaultSharedPreferences
-import org.jetbrains.anko.startActivity
class SettingsActivity : BaseActivity() {
companion object {
@@ -89,7 +89,7 @@ class SettingsActivity : BaseActivity() {
if (isRunning()) {
Utils.stopVService(requireContext())
}
- activity?.startActivity()
+ startActivity(Intent(activity, PerAppProxyActivity::class.java))
perAppProxy.isChecked = true
true
}
@@ -126,7 +126,7 @@ class SettingsActivity : BaseActivity() {
routingCustom.setOnPreferenceClickListener {
if (isRunning())
Utils.stopVService(requireContext())
- activity?.startActivity()
+ startActivity(Intent(activity, RoutingSettingsActivity::class.java))
false
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
index 709ef38b..e8a6b449 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
@@ -1,12 +1,12 @@
package com.v2ray.ang.ui
+import android.content.Intent
import android.support.v7.widget.LinearLayoutManager
import android.view.Menu
import android.view.MenuItem
import com.v2ray.ang.R
import kotlinx.android.synthetic.main.activity_sub_setting.*
import android.os.Bundle
-import org.jetbrains.anko.startActivity
class SubSettingActivity : BaseActivity() {
@@ -40,7 +40,9 @@ class SubSettingActivity : BaseActivity() {
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.add_config -> {
- startActivity("position" to -1)
+ startActivity(Intent(this, SubEditActivity::class.java)
+ .putExtra("position", -1)
+ )
adapter.updateConfigList()
true
}
@@ -48,4 +50,4 @@ class SubSettingActivity : BaseActivity() {
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
index f8cd8824..364147ea 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
@@ -1,5 +1,6 @@
package com.v2ray.ang.ui
+import android.content.Intent
import android.graphics.Color
import android.support.v7.widget.RecyclerView
import android.view.View
@@ -31,7 +32,9 @@ class SubSettingRecyclerAdapter(val activity: SubSettingActivity) : RecyclerView
holder.itemView.backgroundColor = Color.TRANSPARENT
holder.layout_edit.setOnClickListener {
- mActivity.startActivity("position" to position)
+ mActivity.startActivity(Intent(mActivity, SubEditActivity::class.java)
+ .putExtra("position", position)
+ )
}
} else {
}
From 896889778fdb4814db46acd5b26313dacf942a4b Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 5/6] Replace Anko with support lib AlertDialog
replace some property setter
---
.../kotlin/com/v2ray/ang/ui/MainActivity.kt | 5 ++---
.../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 16 +++++---------
.../com/v2ray/ang/ui/PerAppProxyAdapter.kt | 10 ++++-----
.../com/v2ray/ang/ui/Server2Activity.kt | 21 +++++++++----------
.../com/v2ray/ang/ui/Server3Activity.kt | 21 +++++++++----------
.../com/v2ray/ang/ui/Server4Activity.kt | 21 +++++++++----------
.../kotlin/com/v2ray/ang/ui/ServerActivity.kt | 21 +++++++++----------
.../com/v2ray/ang/ui/SubEditActivity.kt | 21 +++++++++----------
.../v2ray/ang/ui/SubSettingRecyclerAdapter.kt | 2 +-
9 files changed, 62 insertions(+), 76 deletions(-)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
index aed907a4..5b3260dc 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
@@ -18,7 +18,6 @@ import android.view.KeyEvent
import com.v2ray.ang.AppConfig
import com.v2ray.ang.util.MessageUtil
import com.v2ray.ang.util.V2rayConfigUtil
-import org.jetbrains.anko.*
import java.lang.ref.SoftReference
import java.net.URL
import android.content.IntentFilter
@@ -52,10 +51,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
field = value
adapter.changeable = !value
if (value) {
- fab.imageResource = R.drawable.ic_v
+ fab.setImageResource(R.drawable.ic_v)
tv_test_state.text = getString(R.string.connection_connected)
} else {
- fab.imageResource = R.drawable.ic_v_idle
+ fab.setImageResource(R.drawable.ic_v_idle)
tv_test_state.text = getString(R.string.connection_not_connected)
}
hideCircle()
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
index 4eddafb5..bd9d7492 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
@@ -2,6 +2,7 @@ package com.v2ray.ang.ui
import android.content.Intent
import android.graphics.Color
+import android.support.v7.app.AlertDialog
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
import android.view.View
@@ -61,7 +62,7 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter
+ AlertDialog.Builder(mActivity).setItems(shareOptions.toTypedArray()) { _, i ->
try {
when (i) {
0 -> {
@@ -95,14 +96,7 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter {
@@ -118,7 +112,7 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter, blacklist: MutableSet?) :
@@ -68,17 +66,17 @@ class PerAppProxyAdapter(val activity: BaseActivity, val apps: List, bl
fun bind(appInfo: AppInfo) {
this.appInfo = appInfo
- icon.image = appInfo.appIcon
+ icon.setImageDrawable(appInfo.appIcon)
// name.text = appInfo.appName
checkBox.isChecked = inBlacklist
package_name.text = appInfo.packageName
if (appInfo.isSystemApp) {
name.text = String.format("** %1s", appInfo.appName)
- name.textColor = Color.RED
+ name.setTextColor(Color.RED)
} else {
name.text = appInfo.appName
- name.textColor = Color.DKGRAY
+ name.setTextColor(Color.DKGRAY)
}
itemView.setOnClickListener(this)
@@ -94,4 +92,4 @@ class PerAppProxyAdapter(val activity: BaseActivity, val apps: List, bl
}
}
}
-}
\ No newline at end of file
+}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
index 02ee56ae..a021c1ec 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server2Activity.kt
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
import android.os.Bundle
+import android.support.v7.app.AlertDialog
import android.text.Editable
import android.text.TextUtils
import android.view.Menu
@@ -14,7 +15,6 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server2.*
-import org.jetbrains.anko.*
import java.lang.Exception
class Server2Activity : BaseActivity() {
@@ -112,17 +112,16 @@ class Server2Activity : BaseActivity() {
*/
fun deleteServer(): Boolean {
if (edit_index >= 0) {
- alert(R.string.del_config_comfirm) {
- positiveButton(android.R.string.ok) {
- if (AngConfigManager.removeServer(edit_index) == 0) {
- toast(R.string.toast_success)
- finish()
- } else {
- toast(R.string.toast_failure)
+ AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ if (AngConfigManager.removeServer(edit_index) == 0) {
+ toast(R.string.toast_success)
+ finish()
+ } else {
+ toast(R.string.toast_failure)
+ }
}
- }
- show()
- }
+ .show()
} else {
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
index 248feb1e..89b98424 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server3Activity.kt
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
import android.os.Bundle
+import android.support.v7.app.AlertDialog
import android.text.TextUtils
import android.view.Menu
import android.view.MenuItem
@@ -10,7 +11,6 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server3.*
-import org.jetbrains.anko.*
class Server3Activity : BaseActivity() {
companion object {
@@ -126,17 +126,16 @@ class Server3Activity : BaseActivity() {
*/
fun deleteServer(): Boolean {
if (edit_index >= 0) {
- alert(R.string.del_config_comfirm) {
- positiveButton(android.R.string.ok) {
- if (AngConfigManager.removeServer(edit_index) == 0) {
- toast(R.string.toast_success)
- finish()
- } else {
- toast(R.string.toast_failure)
+ AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ if (AngConfigManager.removeServer(edit_index) == 0) {
+ toast(R.string.toast_success)
+ finish()
+ } else {
+ toast(R.string.toast_failure)
+ }
}
- }
- show()
- }
+ .show()
} else {
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
index b4b9d007..d6355470 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/Server4Activity.kt
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
import android.os.Bundle
+import android.support.v7.app.AlertDialog
import android.text.TextUtils
import android.view.Menu
import android.view.MenuItem
@@ -10,7 +11,6 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server4.*
-import org.jetbrains.anko.*
class Server4Activity : BaseActivity() {
companion object {
@@ -110,17 +110,16 @@ class Server4Activity : BaseActivity() {
*/
fun deleteServer(): Boolean {
if (edit_index >= 0) {
- alert(R.string.del_config_comfirm) {
- positiveButton(android.R.string.ok) {
- if (AngConfigManager.removeServer(edit_index) == 0) {
- toast(R.string.toast_success)
- finish()
- } else {
- toast(R.string.toast_failure)
+ AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ if (AngConfigManager.removeServer(edit_index) == 0) {
+ toast(R.string.toast_success)
+ finish()
+ } else {
+ toast(R.string.toast_failure)
+ }
}
- }
- show()
- }
+ .show()
} else {
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
index ae753cd3..7f95cbde 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
import android.os.Bundle
+import android.support.v7.app.AlertDialog
import android.text.TextUtils
import android.view.Menu
import android.view.MenuItem
@@ -10,7 +11,6 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_server.*
-import org.jetbrains.anko.*
class ServerActivity : BaseActivity() {
companion object {
@@ -169,17 +169,16 @@ class ServerActivity : BaseActivity() {
*/
fun deleteServer(): Boolean {
if (edit_index >= 0) {
- alert(R.string.del_config_comfirm) {
- positiveButton(android.R.string.ok) {
- if (AngConfigManager.removeServer(edit_index) == 0) {
- toast(R.string.toast_success)
- finish()
- } else {
- toast(R.string.toast_failure)
+ AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ if (AngConfigManager.removeServer(edit_index) == 0) {
+ toast(R.string.toast_success)
+ finish()
+ } else {
+ toast(R.string.toast_failure)
+ }
}
- }
- show()
- }
+ .show()
} else {
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
index dfb6a716..1d60a327 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
@@ -1,6 +1,7 @@
package com.v2ray.ang.ui
import android.os.Bundle
+import android.support.v7.app.AlertDialog
import android.text.TextUtils
import android.view.Menu
import android.view.MenuItem
@@ -10,7 +11,6 @@ import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.AngConfigManager
import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.activity_sub_edit.*
-import org.jetbrains.anko.*
class SubEditActivity : BaseActivity() {
@@ -95,17 +95,16 @@ class SubEditActivity : BaseActivity() {
*/
fun deleteServer(): Boolean {
if (edit_index >= 0) {
- alert(R.string.del_config_comfirm) {
- positiveButton(android.R.string.ok) {
- if (AngConfigManager.removeSubItem(edit_index) == 0) {
- toast(R.string.toast_success)
- finish()
- } else {
- toast(R.string.toast_failure)
+ AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ if (AngConfigManager.removeSubItem(edit_index) == 0) {
+ toast(R.string.toast_success)
+ finish()
+ } else {
+ toast(R.string.toast_failure)
+ }
}
- }
- show()
- }
+ .show()
} else {
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
index 364147ea..307f3a46 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
@@ -29,7 +29,7 @@ class SubSettingRecyclerAdapter(val activity: SubSettingActivity) : RecyclerView
holder.name.text = remarks
holder.url.text = url
- holder.itemView.backgroundColor = Color.TRANSPARENT
+ holder.itemView.setBackgroundColor(Color.TRANSPARENT)
holder.layout_edit.setOnClickListener {
mActivity.startActivity(Intent(mActivity, SubEditActivity::class.java)
From 89be5f077bbb56077ea0f2713fa42611a047a6da Mon Sep 17 00:00:00 2001
From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com>
Date: Sat, 3 Oct 2020 11:19:46 -0400
Subject: [PATCH 6/6] Say goodbye to Anko
replace with support lib PreferenceManager
replace LayoutInflater
---
V2rayNG/app/build.gradle | 1 -
.../src/main/kotlin/com/v2ray/ang/AngApplication.kt | 4 ++--
.../kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt | 6 +++---
.../kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt | 4 ++--
.../main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt | 12 ++++++------
.../com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt | 4 ++--
V2rayNG/app/src/main/res/raw/licenses.xml | 5 -----
V2rayNG/gradle.properties | 1 -
8 files changed, 15 insertions(+), 22 deletions(-)
diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle
index 1352b28a..47b65128 100644
--- a/V2rayNG/app/build.gradle
+++ b/V2rayNG/app/build.gradle
@@ -81,7 +81,6 @@ dependencies {
implementation 'com.android.support.constraint:constraint-layout:2.0.1'
// DSL
- implementation "org.jetbrains.anko:anko-sdk15:$ankoVersion"
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.reactivex:rxjava:1.3.4'
implementation 'io.reactivex:rxandroid:1.2.1'
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt
index 73f816d5..649e0594 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt
@@ -1,10 +1,9 @@
package com.v2ray.ang
-//import com.squareup.leakcanary.LeakCanary
import android.support.multidex.MultiDexApplication
+import android.support.v7.preference.PreferenceManager
import com.v2ray.ang.util.AngConfigManager
import me.dozen.dpreference.DPreference
-import org.jetbrains.anko.defaultSharedPreferences
class AngApplication : MultiDexApplication() {
companion object {
@@ -22,6 +21,7 @@ class AngApplication : MultiDexApplication() {
// LeakCanary.install(this)
+ val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
firstRun = defaultSharedPreferences.getInt(PREF_LAST_VERSION, 0) != BuildConfig.VERSION_CODE
if (firstRun)
defaultSharedPreferences.edit().putInt(PREF_LAST_VERSION, BuildConfig.VERSION_CODE).apply()
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
index bd9d7492..fbce435f 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
@@ -5,6 +5,7 @@ import android.graphics.Color
import android.support.v7.app.AlertDialog
import android.support.v7.widget.RecyclerView
import android.text.TextUtils
+import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.v2ray.ang.AppConfig
@@ -19,7 +20,6 @@ import com.v2ray.ang.util.Utils
import com.v2ray.ang.util.V2rayConfigUtil
import kotlinx.android.synthetic.main.item_qrcode.view.*
import kotlinx.android.synthetic.main.item_recycler_main.view.*
-import org.jetbrains.anko.*
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
@@ -180,10 +180,10 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter
- return MainViewHolder(parent.context.layoutInflater
+ return MainViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.item_recycler_main, parent, false))
else ->
- return FooterViewHolder(parent.context.layoutInflater
+ return FooterViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.item_recycler_footer, parent, false))
}
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt
index 2b7f9ce4..cc2d6088 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt
@@ -2,12 +2,12 @@ package com.v2ray.ang.ui
import android.graphics.Color
import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.v2ray.ang.R
import com.v2ray.ang.dto.AppInfo
import kotlinx.android.synthetic.main.item_recycler_bypass_list.view.*
-import org.jetbrains.anko.layoutInflater
import java.util.*
class PerAppProxyAdapter(val activity: BaseActivity, val apps: List, blacklist: MutableSet?) :
@@ -43,7 +43,7 @@ class PerAppProxyAdapter(val activity: BaseActivity, val apps: List, bl
// VIEW_TYPE_ITEM -> AppViewHolder(ctx.layoutInflater
// .inflate(R.layout.item_recycler_bypass_list, parent, false))
- else -> AppViewHolder(ctx.layoutInflater
+ else -> AppViewHolder(LayoutInflater.from(ctx)
.inflate(R.layout.item_recycler_bypass_list, parent, false))
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
index 936495eb..0843e0a4 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
@@ -8,7 +8,6 @@ import com.v2ray.ang.R
import com.v2ray.ang.AppConfig
import com.v2ray.ang.extension.toast
import com.v2ray.ang.util.Utils
-import org.jetbrains.anko.defaultSharedPreferences
class SettingsActivity : BaseActivity() {
companion object {
@@ -206,9 +205,10 @@ class SettingsActivity : BaseActivity() {
override fun onStart() {
super.onStart()
- updatePerAppProxy(activity?.defaultSharedPreferences?.getString(AppConfig.PREF_MODE, "VPN"))
- remoteDns.summary = activity?.defaultSharedPreferences?.getString(PREF_REMOTE_DNS, "")
- domesticDns.summary = activity?.defaultSharedPreferences?.getString(PREF_DOMESTIC_DNS, "")
+ val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
+ updatePerAppProxy(defaultSharedPreferences.getString(AppConfig.PREF_MODE, "VPN"))
+ remoteDns.summary = defaultSharedPreferences.getString(PREF_REMOTE_DNS, "")
+ domesticDns.summary = defaultSharedPreferences.getString(PREF_DOMESTIC_DNS, "")
if (remoteDns.summary == "") {
remoteDns.summary = AppConfig.DNS_AGENT
@@ -223,10 +223,10 @@ class SettingsActivity : BaseActivity() {
}
private fun updatePerAppProxy(mode: String?) {
- val preference = activity?.defaultSharedPreferences ?: return
if (mode == "VPN") {
perAppProxy.isEnabled = true
- perAppProxy.isChecked = preference.getBoolean(PREF_PER_APP_PROXY, false)
+ perAppProxy.isChecked = PreferenceManager.getDefaultSharedPreferences(activity)
+ .getBoolean(PREF_PER_APP_PROXY, false)
} else {
perAppProxy.isEnabled = false
perAppProxy.isChecked = false
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
index 307f3a46..50c89d5b 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
@@ -3,13 +3,13 @@ package com.v2ray.ang.ui
import android.content.Intent
import android.graphics.Color
import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.v2ray.ang.R
import com.v2ray.ang.dto.AngConfig
import com.v2ray.ang.util.AngConfigManager
import kotlinx.android.synthetic.main.item_recycler_sub_setting.view.*
-import org.jetbrains.anko.*
class SubSettingRecyclerAdapter(val activity: SubSettingActivity) : RecyclerView.Adapter() {
@@ -41,7 +41,7 @@ class SubSettingRecyclerAdapter(val activity: SubSettingActivity) : RecyclerView
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
- return MainViewHolder(parent.context.layoutInflater
+ return MainViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.item_recycler_sub_setting, parent, false))
}
diff --git a/V2rayNG/app/src/main/res/raw/licenses.xml b/V2rayNG/app/src/main/res/raw/licenses.xml
index e7949142..06723342 100644
--- a/V2rayNG/app/src/main/res/raw/licenses.xml
+++ b/V2rayNG/app/src/main/res/raw/licenses.xml
@@ -17,11 +17,6 @@
Copyright(C) 2008-2011 The Android Open Source Project
Apache Software License 2.0
-
- anko
- https://github.com/Kotlin/anko
- Apache Software License 2.0
-
Google Gson
https://github.com/google/gson
diff --git a/V2rayNG/gradle.properties b/V2rayNG/gradle.properties
index ee67f2c2..cd501cb8 100644
--- a/V2rayNG/gradle.properties
+++ b/V2rayNG/gradle.properties
@@ -13,7 +13,6 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
#Fri Jun 02 14:08:42 CST 2017
-ankoVersion=0.10.8
kotlinVersion=1.4.0
supportLibVersion=28.0.0
buildToolsVer=29.0.3