diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index fc7a4c1..cad3eef 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -9,11 +9,10 @@ plugins {
id("kotlin-parcelize")
id("com.google.devtools.ksp")
id("kotlinx-serialization")
-
}
dependencies {
- implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
+ implementation(fileTree(mapOf("dir" to "src/main/libs", "include" to listOf("*.aar"))))
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
// compileOnly(project(":hideapi"))
@@ -99,6 +98,11 @@ dependencies {
// https://mvnrepository.com/artifact/com.google.zxing/core
implementation("com.google.zxing:core:3.5.3")
implementation("com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4")
+ // https://mvnrepository.com/artifact/com.airbnb.android/lottie
+ implementation("com.airbnb.android:lottie:5.2.0")
+// https://mvnrepository.com/artifact/com.github.bumptech.glide/glide
+ implementation("com.github.bumptech.glide:glide:4.13.2")
+
}
@@ -159,15 +163,15 @@ android {
abiFilters.add("armeabi-v7a")
}
}
- sourceSets {
- getByName("main") {
- jniLibs.srcDir("src/main/jniLibs")
- }
+ sourceSets.all {
+
+ jniLibs.srcDir("src/main/jniLibs")
+
}
}
repositories {
flatDir {
- dirs("libs")
+ dirs("src/main/libs")
}
mavenCentral()
}
diff --git a/app/libs/common.aar b/app/libs/common.aar
deleted file mode 100644
index e09efce..0000000
Binary files a/app/libs/common.aar and /dev/null differ
diff --git a/app/libs/core.aar b/app/libs/core.aar
deleted file mode 100644
index 59724a5..0000000
Binary files a/app/libs/core.aar and /dev/null differ
diff --git a/app/libs/hideapi.aar b/app/libs/hideapi.aar
deleted file mode 100644
index 5a7f3b6..0000000
Binary files a/app/libs/hideapi.aar and /dev/null differ
diff --git a/app/libs/service.aar b/app/libs/service.aar
deleted file mode 100644
index 04dadc7..0000000
Binary files a/app/libs/service.aar and /dev/null differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f8b1701..706813b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -134,6 +134,12 @@
+
+
(R.id.tv_save)
+ iv_lossper = findViewById(R.id.iv_gif)
+ tv_save.setOnClickListener {
+ lifecycleScope.launch {
+ saveImage()
+ }
+ }
+
+ Glide.with(this).load("https://www.lead2win.cc/assets/yingmao.jpg").fitCenter()
+ .into(iv_lossper!!)
+ }
+
+ private suspend fun saveImage() {
+ withContext(Dispatchers.IO) {
+ val imageUrl = this@LossPreventionActivity.contentResolver.insert(
+ MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+ ContentValues()
+ ) ?: kotlin.run {
+ Toast.makeText(this@LossPreventionActivity, "存储失败,请使用屏幕截屏功能保存", Toast.LENGTH_SHORT).show()
+ }
+ this@LossPreventionActivity.contentResolver.openOutputStream(imageUrl as Uri).use {
+ iv_lossper?.let { iv ->
+ if (iv.drawable.toBitmap().compress(Bitmap.CompressFormat.PNG, 90, it)) {
+ MainScope().launch {
+ Toast.makeText(
+ this@LossPreventionActivity,
+ "存储成功",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ } else {
+ MainScope().launch {
+ Toast.makeText(
+ this@LossPreventionActivity,
+ "存储失败,请使用屏幕截屏功能保存",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt b/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt
index 1a9c3d1..3c98e90 100644
--- a/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt
@@ -26,6 +26,7 @@ import androidx.viewpager2.widget.ViewPager2
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
+import com.airbnb.lottie.LottieAnimationView
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonObject
@@ -109,7 +110,6 @@ class NewMainActivity : BaseActivity() {
var isSubed = false
var newUuid: String? = null
var subUrl: String? = null
-
// private var profile: ProfileManager? = null
// private var clashManager: ClashManager? = null
var clashBinder: IClashManager? = null
@@ -249,13 +249,13 @@ class NewMainActivity : BaseActivity() {
Log.i("newMainActGlo isGlobal==>${isGlobal}")
newMainActGlo = isGlobal
startLog()
+ showBindAccount()
}
private fun startLog() {
launch(Dispatchers.IO) {
// startForegroundServiceCompat(LogcatService::class.intent)
-//
// val logcat = bindLogcatService()
// val ticker = ticker(500)
// var initial = true
@@ -272,8 +272,13 @@ class NewMainActivity : BaseActivity() {
val observer = object : ILogObserver {
override fun newItem(log: LogMessage) {
var msg = log.message
+ if (BuildConfig.DEBUG) {
+ Log.i("startLog msg==>${msg}")
+ }
var domain = Utils.getDomainNameFromString(msg)
-// Log.i("startLog meessage==>${domain}")
+// if (BuildConfig.DEBUG) {
+// Log.i("startLog meessage==>${domain}")
+// }
if (!TextUtils.isEmpty(domain)) {
addOrSendHost(domain!!)
}
@@ -283,10 +288,7 @@ class NewMainActivity : BaseActivity() {
clashBinder?.let {
it.setLogObserver(observer)
}
-
}
-
-
}
@@ -492,7 +494,15 @@ class NewMainActivity : BaseActivity() {
fragments.add(RechargeFragment())
containerVP.adapter = MainVPAdapter(fragments, supportFragmentManager, lifecycle)
containerVP.isUserInputEnabled = false
-
+ var aniAct=findViewById(R.id.lottie_activity)
+ aniAct.setAnimation(R.raw.activity)
+ aniAct.playAnimation()
+ aniAct.setOnClickListener {
+ startActivity(Intent(CommonUtils.getApp(), activityActivity::class.java))
+ }
+ findViewById(R.id.ll_activity).setOnClickListener {
+ startActivity(Intent(CommonUtils.getApp(), activityActivity::class.java))
+ }
setSometion()
}
@@ -544,15 +554,7 @@ class NewMainActivity : BaseActivity() {
// 临时用户显示默认密码
// findViewById(R.id.tv_default_psw).visibility = View.VISIBLE
tv_band.setOnClickListener {//绑定
- val dialog = DialogBandChoose(this@NewMainActivity)
- dialog.setOnBandClickListener(object : DialogBandChoose.OnBandClickListener {
- override fun onBandClick(isPhone: Boolean) {
- val intent = Intent(CommonUtils.getApp(), BandPhoneActivity::class.java)
- intent.putExtra("isPhone", isPhone)
- startActivity(intent)
- }
- })
- dialog.show()
+ showBingDialogChoose()
drawer.close()
}
tv_band.visibility = View.VISIBLE
@@ -646,7 +648,10 @@ class NewMainActivity : BaseActivity() {
startActivity(Intent(this, BZYWebViewKeFu::class.java))
drawer.close()
}
-
+ findViewById(R.id.tv_fds).setOnClickListener {//防丢失
+ startActivity(Intent(this, LossPreventionActivity::class.java))
+ drawer.close()
+ }
drawer = findViewById(R.id.drawer)
iv_slider.setOnClickListener {
if (containerVP.currentItem != 0) {
@@ -659,6 +664,7 @@ class NewMainActivity : BaseActivity() {
}
var checkPayResultDia: MaterialDialog? = null
+ var checkBindAccountDia: MaterialDialog? = null
public fun goRechargeWeb() {
val mmkv = MMKV.defaultMMKV()
val a = mmkv.decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")
@@ -674,22 +680,64 @@ class NewMainActivity : BaseActivity() {
}
private fun showPayResultDialog() {
+
+
checkPayResultDia = MaterialDialog(this).show {
- this.cancelable(false)
- cornerRadius(res = R.dimen.dp_10)
- customView(
- R.layout.payconfirm1_dialog_layout,
- scrollable = false,
- noVerticalPadding = true,
- horizontalPadding = false
- )
- getCustomView().findViewById(R.id.tv_pay_finish).setOnClickListener {
- mainAtyVM.checkLogin()
- }
- getCustomView().findViewById(R.id.tv_pay_cancle).setOnClickListener {
- dismiss()
- }
+ this.cancelable(false)
+ cornerRadius(res = R.dimen.dp_10)
+ customView(
+ R.layout.payconfirm1_dialog_layout,
+ scrollable = false,
+ noVerticalPadding = true,
+ horizontalPadding = false
+ )
+ getCustomView().findViewById(R.id.tv_pay_finish).setOnClickListener {
+ mainAtyVM.checkLogin()
+ showBindAccount()
}
+ getCustomView().findViewById(R.id.tv_pay_cancle).setOnClickListener {
+ dismiss()
+ showBindAccount()
+ }
+ }
+ }
+
+ private fun showBindAccount() {
+ var useraccount =
+ MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")!!;
+ if (Utils.isEmail(useraccount) || Utils.isPhoneNumber(useraccount)) {
+ return
+ }
+
+ checkBindAccountDia = MaterialDialog(this).show {
+ this.cancelable(false)
+ cornerRadius(res = R.dimen.dp_10)
+ customView(
+ R.layout.bind_account_dialog_layout,
+ scrollable = false,
+ noVerticalPadding = true,
+ horizontalPadding = false
+ )
+ getCustomView().findViewById(R.id.tv_pay_finish).setOnClickListener {
+ //跳转到绑定邮箱界面
+ showBingDialogChoose()
+ }
+ getCustomView().findViewById(R.id.tv_pay_cancle).setOnClickListener {
+ dismiss()
+ }
+ }
+ }
+
+ private fun showBingDialogChoose() {
+ val dialog = DialogBandChoose(this@NewMainActivity)
+ dialog.setOnBandClickListener(object : DialogBandChoose.OnBandClickListener {
+ override fun onBandClick(isPhone: Boolean) {
+ val intent = Intent(CommonUtils.getApp(), BandPhoneActivity::class.java)
+ intent.putExtra("isPhone", isPhone)
+ startActivity(intent)
+ }
+ })
+ dialog.show()
}
var payResultLoading: RxDialogShapeLoading? = null
@@ -712,7 +760,7 @@ class NewMainActivity : BaseActivity() {
}
}
-// fun setExpireDate() {
+ // fun setExpireDate() {
// val isExpired = MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_VPN_EXPIRED)
// val validPeriod = MMKV.defaultMMKV().decodeLong(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD)
//
@@ -738,6 +786,7 @@ class NewMainActivity : BaseActivity() {
}
return true;
}
+
fun setExpireDate() {
var isExpire = checkExpire()
var endTimeInfo = "--"
@@ -913,5 +962,4 @@ class NewMainActivity : BaseActivity() {
showPayResultDialog()
}
}
-
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt b/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt
index b562938..64c6026 100644
--- a/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt
@@ -8,6 +8,7 @@ import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.*
import androidx.lifecycle.ViewModelProvider
+import com.google.gson.JsonObject
import com.yingmao.clash.view.dialog.RxDialogShapeLoading
@@ -18,7 +19,9 @@ import com.yingmao.clash.base.BaseActivity
import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.net.http.HttpStatus
import com.yingmao.clash.net.http.entity.RegisterRsp
+import com.yingmao.clash.util.AESUtil
import com.yingmao.clash.util.CommonUtils
+import com.yingmao.clash.util.Utils
import com.yingmao.clash.view.PasswordTransformationMethodBigDot
import com.yingmao.clash.view.RxToast
import com.yingmao.clash.view.SlidingVerification
@@ -120,25 +123,43 @@ class RegisterActivity : BaseActivity(), View.OnClickListener {
}
- fun register() {
+ // fun register() {
+// val registerAtyVM = ViewModelProvider(this).get(RegisterAtyVM::class.java)
+// val params: Map = mutableMapOf(
+// "phoneNumber" to username,
+// "password" to password,
+// "checkPassword" to password,
+// "id" to BuildConfig.productId,
+//// "clientIp" to "",
+// "registerAddress" to "devTest",
+//// "from" to ""
+// )
+//
+// registerAtyVM.register(params)
+// }
+ fun doRegisterByEncryption() {
val registerAtyVM = ViewModelProvider(this).get(RegisterAtyVM::class.java)
- val params: Map = mutableMapOf(
- "phoneNumber" to username,
- "password" to password,
- "checkPassword" to password,
- "id" to BuildConfig.productId,
-// "clientIp" to "",
- "registerAddress" to "devTest",
-// "from" to ""
+ var req_json = JsonObject()
+ req_json.addProperty("phoneNumber", username)
+ req_json.addProperty("password", password)
+ req_json.addProperty("checkPassword", password)
+ req_json.addProperty("id", BuildConfig.productId)
+ req_json.addProperty("clientIp", Utils.getIPAddress())
+ req_json.addProperty("from", "5")
+ var data = AESUtil.byteArrayToHexStr(
+ AESUtil.encrypt(req_json.toString())
)
-
- registerAtyVM.register(params)
+ val params: Map = mutableMapOf(
+ "data" to data
+ )
+ registerAtyVM.registerByEncryption(params)
}
+
override fun onClick(v: View?) {
when (v?.id) {
R.id.tv_register -> {
- if (checkInput()) register()
+ if (checkInput()) doRegisterByEncryption()
}
R.id.tv_login -> {
@@ -168,7 +189,6 @@ class RegisterActivity : BaseActivity(), View.OnClickListener {
}
} else it.progress = 0
}
-
}
}
@@ -204,7 +224,7 @@ class RegisterActivity : BaseActivity(), View.OnClickListener {
getFocusAndShowSoftInput(passwordEt_check)
return false
}
- if (!password.equals(password_check)){
+ if (!password.equals(password_check)) {
passwordErrorTv.visibility = View.VISIBLE
passwordErrorTv.text = getString(R.string.please_input_password_double_err)
return false
diff --git a/app/src/main/java/com/yingmao/clash/act/RegisterAtyVM.kt b/app/src/main/java/com/yingmao/clash/act/RegisterAtyVM.kt
index 4d9d09d..31ae914 100644
--- a/app/src/main/java/com/yingmao/clash/act/RegisterAtyVM.kt
+++ b/app/src/main/java/com/yingmao/clash/act/RegisterAtyVM.kt
@@ -1,5 +1,6 @@
package com.yingmao.clash.act
+import android.util.Log
import com.yingmao.clash.base.PublicViewMode
import com.yingmao.clash.net.http.HttpApi
import com.yingmao.clash.net.http.HttpReqType
@@ -7,8 +8,17 @@ import com.yingmao.clash.net.http.NetService
class RegisterAtyVM : PublicViewMode() {
- fun register(params : Map){
- val httpApi = NetService.instances.createHttps(HttpApi::class.java)
- doAsync(HttpReqType.REGISTER) { httpApi.register(params) }
+// fun register(params : Map){
+// val httpApi = NetService.instances.createHttps(HttpApi::class.java)
+// doAsync(HttpReqType.REGISTER) { httpApi.register(params) }
+// }
+
+ fun registerByEncryption(params: Map) {
+ Log.e("data", "register ....")
+ val httpApi = NetService.instances.createHttps(HttpApi::class.java)
+
+ doAsync(HttpReqType.REGISTER) {
+ httpApi.registerByEncryption(params)
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
index 1d04309..f5dcf90 100644
--- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
@@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
+import android.text.TextUtils
import android.util.Log
import android.view.View
import android.view.WindowManager
@@ -19,6 +20,8 @@ import com.yingmao.clash.view.dialog.RxDialogSureCancel
import com.afollestad.materialdialogs.MaterialDialog
import com.google.gson.Gson
+import com.google.gson.JsonObject
+import com.google.gson.JsonParser
import com.yingmao.clash.net.http.entity.RegisterRsp
import com.orhanobut.logger.Logger
import com.tencent.mmkv.MMKV
@@ -37,6 +40,7 @@ import com.yingmao.clash.listener.AsyncCallback
import com.yingmao.clash.net.http.HttpReqType
import com.yingmao.clash.net.http.HttpStatus
import com.yingmao.clash.net.http.entity.LoginRsp
+import com.yingmao.clash.net.http.entity.RegisterRspOld
import com.yingmao.clash.net.http.entity.SubscriptionRsp
import com.yingmao.clash.service.model.Profile
import com.yingmao.clash.util.AESUtil
@@ -81,13 +85,12 @@ class SplashActivity : BaseActivity() {
// mPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE)
// if (checkPermissions(mPermissions)) {//权限请求通过
// Log.e("gg", "per sss")
-//
// } else {//权限请求未通过
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// requestPermissions(mPermissions.toTypedArray(), PERMISSION_REQUEST_CODE)
// }
// }
-
+// Log.e("gg", "Stup.key======================>" + Stup.key())
val routerSet = MMKV.defaultMMKV().decodeStringSet(BZYConstants.MMKV_KEY_ROUTER_HOST)
if (routerSet != null && routerSet.size > 0) {
isNeedRegister()
@@ -109,7 +112,6 @@ class SplashActivity : BaseActivity() {
})
}
}
-
}
private fun checkPermission(): Boolean {
@@ -128,16 +130,16 @@ class SplashActivity : BaseActivity() {
override fun onStarted() {
super.onStarted()
-
}
private fun isNeedRegister() {
- if (BuildConfig.productId != "22222" && BuildConfig.productId.isNotEmpty()) { //渠道包都自动注册登录,广州22222也是非自动注册
+ if (!BuildConfig.is_free && BuildConfig.productId.isNotEmpty()) { //渠道包都自动注册登录,广州22222也是非自动注册
rlPb.visibility = View.VISIBLE
if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) {
splashAtyVM.checkLogin()
} else {
- doRegister()
+// doRegister()
+ doRegisterByEncryption()
}
} else {//非渠道自由包
val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN)
@@ -178,7 +180,24 @@ class SplashActivity : BaseActivity() {
"from" to "5",
)
splashAtyVM.register(params)
+ }
+ fun doRegisterByEncryption() {
+
+ var req_json = JsonObject()
+ req_json.addProperty("phoneNumber", username)
+ req_json.addProperty("password", BZYConstants.defaultPassword)
+ req_json.addProperty("checkPassword", BZYConstants.defaultPassword)
+ req_json.addProperty("id", BuildConfig.productId)
+ req_json.addProperty("clientIp", Utils.getIPAddress())
+ req_json.addProperty("from", "5")
+ var data = AESUtil.byteArrayToHexStr(
+ AESUtil.encrypt(req_json.toString())
+ )
+ val params: Map = mutableMapOf(
+ "data" to data
+ )
+ splashAtyVM.registerByEncryption(params)
}
// private fun initSub() {
// var yaml = context?.getString(com.yingmao.clash.service.R.string.configuration_yaml)
@@ -277,7 +296,7 @@ class SplashActivity : BaseActivity() {
when (httpStatus.reqType) {
HttpReqType.REGISTER -> {
with(httpStatus.rsp as RegisterRsp) {
- if (code == "10000") {
+ if (code == "10000" || code == "200") {
MMKV.defaultMMKV().encode(MMKV_KEY_REMEMBER_USERNAME, username)
MMKV.defaultMMKV()
.encode(MMKV_KEY_REMEMBER_PASSWORD, BZYConstants.defaultPassword)
@@ -296,7 +315,16 @@ class SplashActivity : BaseActivity() {
RxToast.error(it)
}
- MMKV.defaultMMKV().encode(MMKV_KEY_REMEMBER_USERNAME, data)
+// if (data != null) {
+//
+// var jo =
+// Gson().fromJson(data, JsonObject::class.java)
+// var userName = jo.get("data").asString;
+// if (!TextUtils.isEmpty(userName)) {
+//
+// }
+// }
+ MMKV.defaultMMKV().encode(MMKV_KEY_REMEMBER_USERNAME, username)
val intent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(intent)
finish()
@@ -304,7 +332,8 @@ class SplashActivity : BaseActivity() {
MaterialDialog(this@SplashActivity).show {
message(text = "初始化失败")
positiveButton(R.string.retry) {
- doRegister()
+// doRegister()
+ doRegisterByEncryption()
}
negativeButton(R.string.cancel) {
it.dismiss()
@@ -376,12 +405,14 @@ class SplashActivity : BaseActivity() {
com.yingmao.clash.common.log.Log.d("httpFailure HttpReqType.REGISTER")
if (Utils.switchServer()) {//切换服务器并直接重试
- doRegister()
+// doRegister()
+ doRegisterByEncryption()
} else {
MaterialDialog(this@SplashActivity).show {
message(text = "初始化失败")
positiveButton(R.string.retry) {
- doRegister()
+// doRegister()
+ doRegisterByEncryption()
}
negativeButton(R.string.cancel) {
it.dismiss()
diff --git a/app/src/main/java/com/yingmao/clash/act/activityActivity.kt b/app/src/main/java/com/yingmao/clash/act/activityActivity.kt
new file mode 100644
index 0000000..0fe6660
--- /dev/null
+++ b/app/src/main/java/com/yingmao/clash/act/activityActivity.kt
@@ -0,0 +1,150 @@
+package com.yingmao.clash.act
+
+import android.app.Activity
+import android.app.Application
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+
+import androidx.lifecycle.ViewModelProvider
+
+import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import com.yingmao.clash.R
+import com.yingmao.clash.app.MainApplication
+import com.yingmao.clash.base.BaseActivity
+import com.yingmao.clash.net.http.HttpReqType
+import com.yingmao.clash.net.http.HttpStatus
+import com.yingmao.clash.net.http.entity.ExpensesRecordRsp
+import com.yingmao.clash.view.RxToast
+import com.yingmao.clash.view.adapter.ExpensesRecordAdapter
+
+class activityActivity : BaseActivity() {
+ private lateinit var expensesRecordVM :ExpensesRecordVM
+ private lateinit var swipeLayout : SwipeRefreshLayout
+ private lateinit var expensesRecordRv : RecyclerView
+ private lateinit var expensesRecordAdapter : ExpensesRecordAdapter
+ private val mPageInfo = PageInfo()
+
+ companion object{
+ }
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.layout_activity_activity)
+ showTitleBar("活动")
+ initView()
+// initAdapter()
+// initRefreshLayout()
+// initLoadMore()
+
+ }
+
+ private fun initView() {
+
+ }
+
+ private fun initAdapter() {
+ expensesRecordAdapter = ExpensesRecordAdapter()
+ expensesRecordAdapter.animationEnable = true
+ expensesRecordRv.adapter = expensesRecordAdapter
+ }
+
+ private fun initRefreshLayout() {
+ swipeLayout.setColorSchemeColors(Color.rgb(47, 223, 189))
+ swipeLayout.setOnRefreshListener {
+ refresh()
+ }
+ }
+
+ private fun initLoadMore() {
+ expensesRecordAdapter.loadMoreModule.setOnLoadMoreListener {
+ loadMore()
+ }
+ expensesRecordAdapter.loadMoreModule.isAutoLoadMore = true
+ expensesRecordAdapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false
+ }
+
+ override fun onStart() {
+ super.onStart()
+ // 进入页面,刷新数据
+ loadFirstPage()
+ }
+
+
+ private fun refresh() {
+ // 这里的作用是防止下拉刷新的时候还可以上拉加载
+ expensesRecordAdapter.loadMoreModule.isEnableLoadMore = false
+ // 下拉刷新,需要重置页数
+ mPageInfo.reset()
+ loadFirstPage()
+ }
+
+ private fun loadFirstPage() {
+// expensesRecordVM.getExpensesRecord(mPageInfo)
+ }
+
+ private fun loadMore() {
+ expensesRecordVM.getExpensesRecord(mPageInfo)
+ }
+
+ override fun httpLoading(httpStatus: HttpStatus.Loading) {
+ if(httpStatus.reqType == HttpReqType.EXPENSES_RECORD){
+ if(mPageInfo.isFirstPage) {
+ swipeLayout.isRefreshing = true
+ }
+ }
+ }
+
+ override fun httpSuccess(httpStatus: HttpStatus.Success) {
+ if(httpStatus.reqType == HttpReqType.EXPENSES_RECORD){
+ if(mPageInfo.isFirstPage) {
+ swipeLayout.isRefreshing = false
+ }
+ expensesRecordAdapter.loadMoreModule.isEnableLoadMore = true
+ if(httpStatus.rsp is ExpensesRecordRsp){
+ (httpStatus.rsp as ExpensesRecordRsp).let { expensesRecordRsp ->
+ if(expensesRecordRsp.code == "1000"){
+ if(expensesRecordRsp.data != null){
+ val expensesRecordList =expensesRecordRsp.data?.expensesRecords
+ if(!expensesRecordList.isNullOrEmpty()){
+ if(mPageInfo.isFirstPage) {
+ expensesRecordAdapter.data = expensesRecordList
+ }else{
+ expensesRecordAdapter.addData(expensesRecordList)
+ }
+ mPageInfo.nextPage()
+ if (expensesRecordList.size < 5) {
+ //如果不够一页,显示没有更多数据布局
+ expensesRecordAdapter.loadMoreModule.loadMoreEnd()
+// RxToast.info("没有更多数据了")
+ } else {
+ expensesRecordAdapter.loadMoreModule.loadMoreComplete()
+ }
+ }else{
+ //如果不够一页,显示没有更多数据布局
+ expensesRecordAdapter.loadMoreModule.loadMoreEnd()
+// RxToast.info("没有更多数据了")
+ }
+ }else{
+ expensesRecordAdapter.loadMoreModule.loadMoreComplete()
+ }
+
+ }else {
+ RxToast.error("${expensesRecordRsp.code}${expensesRecordRsp.message}")
+ expensesRecordAdapter.loadMoreModule.loadMoreFail()
+ }
+ }
+ }
+ }
+ }
+
+ override fun httpFailure(httpStatus: HttpStatus.Failure) {
+ if(httpStatus.reqType == HttpReqType.EXPENSES_RECORD){
+ if(mPageInfo.isFirstPage) {
+ swipeLayout.isRefreshing = true
+ }
+ RxToast.error("获取订单信息异常")
+ expensesRecordAdapter.loadMoreModule.loadMoreFail()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt
index 6959d62..8eb9b55 100644
--- a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt
+++ b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt
@@ -13,14 +13,11 @@ import androidx.core.content.getSystemService
import com.orhanobut.logger.Logger
import com.tencent.mmkv.MMKV
import com.yingmao.clash.R
+
import com.yingmao.clash.common.Global
import com.yingmao.clash.common.compat.currentProcessName
import com.yingmao.clash.common.log.Log
-import com.yingmao.clash.remote.Remote
-import com.yingmao.clash.service.ProfileWorker
-import com.yingmao.clash.service.ProfileWorker.Companion
-import com.yingmao.clash.service.util.sendServiceRecreated
import com.yingmao.clash.util.clashDir
import java.io.File
import java.io.FileOutputStream
@@ -111,6 +108,5 @@ class MainApplication : Application() {
)
nm.deleteNotificationChannel("service-nat") // NAT mode is gone for good
}
-
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/fragment/NewAccFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/NewAccFragment.kt
index aaf48dd..cb53b12 100644
--- a/app/src/main/java/com/yingmao/clash/fragment/NewAccFragment.kt
+++ b/app/src/main/java/com/yingmao/clash/fragment/NewAccFragment.kt
@@ -84,11 +84,9 @@ class NewAccFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
private lateinit var nodeNameTv: TextView
private lateinit var countryIv: ImageView
-
// var currentNode: Profile? = null
private var reConnection = false
-
override fun init(
titleBarRl: RelativeLayout,
backIv: ImageView,
@@ -124,7 +122,7 @@ class NewAccFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
BZYConstants.MMKV_KEY_TOKEN
).toString()
- com.yingmao.clash.common.log.Log.d("token==>$token")
+ Log.d("token==>$token")
}
diff --git a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
index 62752a0..fa6a73a 100644
--- a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
+++ b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
@@ -23,6 +23,7 @@ import com.tencent.mmkv.MMKV
import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
import com.yingmao.clash.net.http.entity.LoginRsp2
+import com.yingmao.clash.net.http.entity.RegisterRspOld
import com.yingmao.clash.net.http.entity.SendSmsRsp
import com.yingmao.clash.net.http.entity.VipSignRsp
import okhttp3.RequestBody
@@ -66,6 +67,13 @@ interface HttpApi {
@POST("/netbarcloud/vpn/octopusRegister.do")
suspend fun register(@QueryMap params: Map): RegisterRsp
+ //加密注册
+ @Headers(
+ "User-Agent: Octopus_Android"
+ )
+ @POST("/netbarcloud/vpn/appRegister.do")
+ suspend fun registerByEncryption(@QueryMap params: Map): RegisterRsp
+
//显示赠送时长 :
@Headers(
"User-Agent: Octopus_Android"
diff --git a/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRsp.kt b/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRsp.kt
index 06f02c3..c823533 100644
--- a/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRsp.kt
+++ b/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRsp.kt
@@ -1,6 +1,7 @@
package com.yingmao.clash.net.http.entity
+import com.google.gson.JsonObject
import com.google.gson.annotations.SerializedName
data class RegisterRsp(
@@ -12,7 +13,7 @@ data class RegisterRsp(
val code: String? = null,
@field:SerializedName("data")
- val data: String = "",
+ val data: Any? = null,
@field:SerializedName("message")
val message: String? = null,
diff --git a/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRspOld.kt b/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRspOld.kt
new file mode 100644
index 0000000..0abe8bb
--- /dev/null
+++ b/app/src/main/java/com/yingmao/clash/net/http/entity/RegisterRspOld.kt
@@ -0,0 +1,23 @@
+package com.yingmao.clash.net.http.entity
+
+
+import com.google.gson.JsonObject
+import com.google.gson.annotations.SerializedName
+
+data class RegisterRspOld(
+
+ @field:SerializedName("validityPeriod")
+ val validityPeriod: String? = null,
+
+ @field:SerializedName("code")
+ val code: String? = null,
+
+ @field:SerializedName("data")
+ val data: String? = null,
+
+ @field:SerializedName("message")
+ val message: String? = null,
+
+ @field:SerializedName("userid")
+ val userid: String? = null
+) : BaseRsp
diff --git a/app/src/main/java/com/yingmao/clash/util/Utils.kt b/app/src/main/java/com/yingmao/clash/util/Utils.kt
index 47f1ca9..583179e 100644
--- a/app/src/main/java/com/yingmao/clash/util/Utils.kt
+++ b/app/src/main/java/com/yingmao/clash/util/Utils.kt
@@ -64,22 +64,9 @@ object Utils {
// return imsi;
// }
- fun getMac(): String {
- var mac = ""
- MainApplication.getApp()?.let {
- var wm = it.getSystemService(Context.WIFI_SERVICE) as WifiManager
- if (ActivityCompat.checkSelfPermission(
- it, Manifest.permission.ACCESS_FINE_LOCATION
- ) == PackageManager.PERMISSION_GRANTED
- ) {
- mac = wm.connectionInfo.macAddress
- if (!TextUtils.isEmpty(mac)) {
- mac = AESUtil.byteArrayToHexStr(AESUtil.encrypt(mac))
- }
- }
- }
- return mac
- }
+
+
+
fun getMacAddress(): String? {
try {
@@ -115,11 +102,18 @@ object Utils {
}
fun isEmail(email: String): Boolean {
+ if (TextUtils.isEmpty(email)){
+ return false;
+ }
val pattern = Regex("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]+")
return pattern.matches(email)
}
+
fun isPhoneNumber(phone: String): Boolean {
+ if (TextUtils.isEmpty(phone)){
+ return false;
+ }
return phone.startsWith("1") && phone.length == 11
}
diff --git a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
index b7c654d..336e839 100644
--- a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
+++ b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
@@ -94,7 +94,14 @@ class SplashAtyVM : PublicViewMode() {
httpApi.register(params)
}
}
+ fun registerByEncryption(params: Map) {
+ Log.e("data", "register ....")
+ val httpApi = NetService.instances.createHttps(HttpApi::class.java)
+ doAsync(HttpReqType.REGISTER) {
+ httpApi.registerByEncryption(params)
+ }
+ }
fun login(username: String, password: String) {
val params: Map =
diff --git a/app/src/main/jninLibs/arm64-v8a/libclash.h b/app/src/main/jniLibs/arm64-v8a/libclash.h
similarity index 100%
rename from app/src/main/jninLibs/arm64-v8a/libclash.h
rename to app/src/main/jniLibs/arm64-v8a/libclash.h
diff --git a/app/src/main/jninLibs/arm64-v8a/libclash.so b/app/src/main/jniLibs/arm64-v8a/libclash.so
similarity index 100%
rename from app/src/main/jninLibs/arm64-v8a/libclash.so
rename to app/src/main/jniLibs/arm64-v8a/libclash.so
diff --git a/app/src/main/jniLibs/arm64-v8a/libinitSDK.so b/app/src/main/jniLibs/arm64-v8a/libinitSDK.so
new file mode 100644
index 0000000..711e295
Binary files /dev/null and b/app/src/main/jniLibs/arm64-v8a/libinitSDK.so differ
diff --git a/app/src/main/jninLibs/armeabi-v7a/libclash.h b/app/src/main/jniLibs/armeabi-v7a/libclash.h
similarity index 100%
rename from app/src/main/jninLibs/armeabi-v7a/libclash.h
rename to app/src/main/jniLibs/armeabi-v7a/libclash.h
diff --git a/app/src/main/jninLibs/armeabi-v7a/libclash.so b/app/src/main/jniLibs/armeabi-v7a/libclash.so
similarity index 100%
rename from app/src/main/jninLibs/armeabi-v7a/libclash.so
rename to app/src/main/jniLibs/armeabi-v7a/libclash.so
diff --git a/app/src/main/jniLibs/armeabi-v7a/libinitSDK.so b/app/src/main/jniLibs/armeabi-v7a/libinitSDK.so
new file mode 100644
index 0000000..e3862da
Binary files /dev/null and b/app/src/main/jniLibs/armeabi-v7a/libinitSDK.so differ
diff --git a/app/src/main/res/drawable-xhdpi/loss_pre.png b/app/src/main/res/drawable-xhdpi/loss_pre.png
new file mode 100644
index 0000000..8468205
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/loss_pre.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/loss_pre.png b/app/src/main/res/drawable-xxxhdpi/loss_pre.png
new file mode 100644
index 0000000..c817a83
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/loss_pre.png differ
diff --git a/app/src/main/res/drawable/finish_btn_bg_selector.xml b/app/src/main/res/drawable/finish_btn_bg_selector.xml
new file mode 100644
index 0000000..4275044
--- /dev/null
+++ b/app/src/main/res/drawable/finish_btn_bg_selector.xml
@@ -0,0 +1,19 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_expenses_record.xml b/app/src/main/res/layout/activity_expenses_record.xml
index 1f48c52..08e4118 100644
--- a/app/src/main/res/layout/activity_expenses_record.xml
+++ b/app/src/main/res/layout/activity_expenses_record.xml
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/main_bg"
+ android:background="@drawable/bg_signin"
android:paddingTop="18dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
diff --git a/app/src/main/res/layout/bind_account_dialog_layout.xml b/app/src/main/res/layout/bind_account_dialog_layout.xml
new file mode 100644
index 0000000..4f9227a
--- /dev/null
+++ b/app/src/main/res/layout/bind_account_dialog_layout.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_accelerate.xml b/app/src/main/res/layout/fragment_accelerate.xml
index f929073..61d2cac 100644
--- a/app/src/main/res/layout/fragment_accelerate.xml
+++ b/app/src/main/res/layout/fragment_accelerate.xml
@@ -67,17 +67,21 @@
android:textColor="@color/white"
android:textSize="17sp">
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_activity_losspre.xml b/app/src/main/res/layout/layout_activity_losspre.xml
new file mode 100644
index 0000000..d602904
--- /dev/null
+++ b/app/src/main/res/layout/layout_activity_losspre.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/new_main_activity.xml b/app/src/main/res/layout/new_main_activity.xml
index d9dbaa3..7ce63cf 100644
--- a/app/src/main/res/layout/new_main_activity.xml
+++ b/app/src/main/res/layout/new_main_activity.xml
@@ -29,16 +29,29 @@
android:layout_marginTop="30dp"
android:src="@drawable/ic_s_menu" />
-
-
+ android:gravity="center"
+ android:orientation="vertical">
+
+
+
@@ -49,7 +62,7 @@
-
+
@@ -272,7 +285,24 @@
android:layout_marginBottom="10dp"
android:background="@color/white_50" />
+
+
+ android:layout_height="wrap_content"
+ android:layout_marginTop="15dp">