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