mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 09:27:41 +08:00
新增:纯客户端模式(启动APP时直接进入主动控制·客户端)
This commit is contained in:
parent
b210243a46
commit
af898c7a3f
@ -100,7 +100,7 @@
|
|||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:windowSoftInputMode="adjustPan|stateHidden" />
|
android:windowSoftInputMode="adjustPan|stateHidden" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".activity.LoginActivity"
|
android:name=".activity.ClientActivity"
|
||||||
android:configChanges="screenSize|keyboardHidden|orientation|keyboard"
|
android:configChanges="screenSize|keyboardHidden|orientation|keyboard"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:launchMode="singleInstance"
|
android:launchMode="singleInstance"
|
||||||
|
@ -93,6 +93,12 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
try {
|
try {
|
||||||
|
context = applicationContext
|
||||||
|
initLibs()
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//动态加载FrpcLib
|
//动态加载FrpcLib
|
||||||
val libPath = filesDir.absolutePath + "/libs"
|
val libPath = filesDir.absolutePath + "/libs"
|
||||||
val soFile = File(libPath)
|
val soFile = File(libPath)
|
||||||
@ -102,9 +108,6 @@ class App : Application(), CactusCallback, Configuration.Provider by Core {
|
|||||||
Log.e("APP", throwable.message!!)
|
Log.e("APP", throwable.message!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
context = applicationContext
|
|
||||||
initLibs()
|
|
||||||
|
|
||||||
//启动前台服务
|
//启动前台服务
|
||||||
val intent = Intent(this, ForegroundService::class.java)
|
val intent = Intent(this, ForegroundService::class.java)
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.idormy.sms.forwarder.activity
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.viewbinding.ViewBinding
|
||||||
|
import com.idormy.sms.forwarder.core.BaseActivity
|
||||||
|
import com.idormy.sms.forwarder.fragment.ClientFragment
|
||||||
|
|
||||||
|
class ClientActivity : BaseActivity<ViewBinding?>() {
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
openPage(ClientFragment::class.java)
|
||||||
|
}
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
package com.idormy.sms.forwarder.activity
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.KeyEvent
|
|
||||||
import androidx.viewbinding.ViewBinding
|
|
||||||
import com.idormy.sms.forwarder.core.BaseActivity
|
|
||||||
import com.idormy.sms.forwarder.fragment.LoginFragment
|
|
||||||
import com.xuexiang.xui.utils.KeyboardUtils
|
|
||||||
import com.xuexiang.xui.utils.StatusBarUtils
|
|
||||||
import com.xuexiang.xutil.display.Colors
|
|
||||||
|
|
||||||
class LoginActivity : BaseActivity<ViewBinding?>() {
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
openPage(LoginFragment::class.java, intent.extras)
|
|
||||||
}
|
|
||||||
|
|
||||||
override val isSupportSlideBack: Boolean
|
|
||||||
get() = false
|
|
||||||
|
|
||||||
override fun initStatusBarStyle() {
|
|
||||||
StatusBarUtils.initStatusBarStyle(this, false, Colors.WHITE)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
|
|
||||||
return KeyboardUtils.onDisableBackKeyDown(keyCode) && super.onKeyDown(keyCode, event)
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,6 +6,7 @@ import android.view.KeyEvent
|
|||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.utils.CommonUtils.Companion.showPrivacyDialog
|
import com.idormy.sms.forwarder.utils.CommonUtils.Companion.showPrivacyDialog
|
||||||
import com.idormy.sms.forwarder.utils.MMKVUtils
|
import com.idormy.sms.forwarder.utils.MMKVUtils
|
||||||
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.isAgreePrivacy
|
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.isAgreePrivacy
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.isFirstOpen
|
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.isFirstOpen
|
||||||
import com.xuexiang.xui.utils.KeyboardUtils
|
import com.xuexiang.xui.utils.KeyboardUtils
|
||||||
@ -44,29 +45,22 @@ class SplashActivity : BaseSplashActivity(), CancelAdapt {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isAgreePrivacy) {
|
if (isAgreePrivacy) {
|
||||||
loginOrGoMainPage()
|
whereToJump()
|
||||||
} else {
|
} else {
|
||||||
showPrivacyDialog(this) { dialog: MaterialDialog, _: DialogAction? ->
|
showPrivacyDialog(this) { dialog: MaterialDialog, _: DialogAction? ->
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
isAgreePrivacy = true
|
isAgreePrivacy = true
|
||||||
loginOrGoMainPage()
|
whereToJump()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loginOrGoMainPage() {
|
private fun whereToJump() {
|
||||||
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SettingUtils.enableExcludeFromRecents) {
|
if (SettingUtils.enablePureClientMode) {
|
||||||
val intent = Intent(App.context, if (hasToken()) MainActivity::class.java else LoginActivity::class.java)
|
ActivityUtils.startActivity(ClientActivity::class.java)
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
|
|
||||||
App.context.startActivity(intent)
|
|
||||||
} else {
|
} else {
|
||||||
if (hasToken()) {
|
ActivityUtils.startActivity(MainActivity::class.java)
|
||||||
ActivityUtils.startActivity(MainActivity::class.java)
|
}
|
||||||
} else {
|
|
||||||
ActivityUtils.startActivity(LoginActivity::class.java)
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
ActivityUtils.startActivity(MainActivity::class.java)
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ import com.xuexiang.xui.utils.DensityUtils
|
|||||||
import com.xuexiang.xui.utils.ResUtils
|
import com.xuexiang.xui.utils.ResUtils
|
||||||
import com.xuexiang.xui.utils.WidgetUtils
|
import com.xuexiang.xui.utils.WidgetUtils
|
||||||
import com.xuexiang.xui.widget.actionbar.TitleBar
|
import com.xuexiang.xui.widget.actionbar.TitleBar
|
||||||
|
import com.xuexiang.xutil.XUtil
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName", "PropertyName")
|
@Suppress("PrivatePropertyName", "PropertyName")
|
||||||
@Page(name = "主动控制·客户端")
|
@Page(name = "主动控制·客户端")
|
||||||
@ -69,7 +70,20 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(),
|
|||||||
|
|
||||||
override fun initTitle(): TitleBar? {
|
override fun initTitle(): TitleBar? {
|
||||||
val titleBar = super.initTitle()!!.setImmersive(false)
|
val titleBar = super.initTitle()!!.setImmersive(false)
|
||||||
titleBar.setTitle(R.string.menu_client)
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) {
|
||||||
|
titleBar.setTitle(R.string.app_name).setSubTitle(getString(R.string.menu_client)).disableLeftView()
|
||||||
|
titleBar.addAction(object : TitleBar.ImageAction(R.drawable.ic_logout) {
|
||||||
|
@SingleClick
|
||||||
|
override fun performAction(view: View) {
|
||||||
|
XToastUtils.success(getString(R.string.exit_pure_client_mode))
|
||||||
|
SettingUtils.enablePureClientMode = false
|
||||||
|
XUtil.exitApp()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
titleBar.setTitle(R.string.menu_client)
|
||||||
|
}
|
||||||
return titleBar
|
return titleBar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
package com.idormy.sms.forwarder.fragment
|
|
||||||
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.CompoundButton
|
|
||||||
import com.idormy.sms.forwarder.R
|
|
||||||
import com.idormy.sms.forwarder.activity.MainActivity
|
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentLoginBinding
|
|
||||||
import com.idormy.sms.forwarder.utils.CommonUtils.Companion.gotoProtocol
|
|
||||||
import com.idormy.sms.forwarder.utils.CommonUtils.Companion.showPrivacyDialog
|
|
||||||
import com.idormy.sms.forwarder.utils.RandomUtils.Companion.getRandomNumbersAndLetters
|
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils
|
|
||||||
import com.idormy.sms.forwarder.utils.SettingUtils.Companion.isAgreePrivacy
|
|
||||||
import com.idormy.sms.forwarder.utils.TokenUtils.Companion.handleLoginSuccess
|
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
|
||||||
import com.idormy.sms.forwarder.utils.sdkinit.UMengInit
|
|
||||||
import com.xuexiang.xaop.annotation.SingleClick
|
|
||||||
import com.xuexiang.xpage.annotation.Page
|
|
||||||
import com.xuexiang.xpage.enums.CoreAnim
|
|
||||||
import com.xuexiang.xui.utils.CountDownButtonHelper
|
|
||||||
import com.xuexiang.xui.utils.ResUtils
|
|
||||||
import com.xuexiang.xui.utils.ThemeUtils
|
|
||||||
import com.xuexiang.xui.utils.ViewUtils
|
|
||||||
import com.xuexiang.xui.widget.actionbar.TitleBar
|
|
||||||
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
|
|
||||||
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
|
|
||||||
import com.xuexiang.xutil.app.ActivityUtils
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录页面
|
|
||||||
*
|
|
||||||
* @author xuexiang
|
|
||||||
* @since 2019-11-17 22:15
|
|
||||||
*/
|
|
||||||
@Page(anim = CoreAnim.none)
|
|
||||||
class LoginFragment : BaseFragment<FragmentLoginBinding?>(), View.OnClickListener {
|
|
||||||
|
|
||||||
private var mJumpView: View? = null
|
|
||||||
private var mCountDownHelper: CountDownButtonHelper? = null
|
|
||||||
override fun viewBindingInflate(
|
|
||||||
inflater: LayoutInflater,
|
|
||||||
container: ViewGroup,
|
|
||||||
): FragmentLoginBinding {
|
|
||||||
return FragmentLoginBinding.inflate(inflater, container, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun initTitle(): TitleBar? {
|
|
||||||
val titleBar = super.initTitle()
|
|
||||||
titleBar?.run {
|
|
||||||
setImmersive(true)
|
|
||||||
setBackgroundColor(Color.TRANSPARENT)
|
|
||||||
setTitle("")
|
|
||||||
setLeftImageDrawable(ResUtils.getVectorDrawable(context, R.drawable.ic_login_close))
|
|
||||||
setActionTextColor(ThemeUtils.resolveColor(context, R.attr.colorAccent))
|
|
||||||
mJumpView = addAction(object : TitleBar.TextAction(R.string.title_jump_login) {
|
|
||||||
override fun performAction(view: View) {
|
|
||||||
onLoginSuccess()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return titleBar
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun initViews() {
|
|
||||||
mCountDownHelper = CountDownButtonHelper(binding!!.btnGetVerifyCode, 60)
|
|
||||||
//隐私政策弹窗
|
|
||||||
if (!isAgreePrivacy) {
|
|
||||||
showPrivacyDialog(requireContext()) { dialog: MaterialDialog, _: DialogAction? ->
|
|
||||||
dialog.dismiss()
|
|
||||||
handleSubmitPrivacy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val isAgreePrivacy = isAgreePrivacy
|
|
||||||
binding!!.cbProtocol.isChecked = isAgreePrivacy
|
|
||||||
refreshButton(isAgreePrivacy)
|
|
||||||
binding!!.cbProtocol.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
|
||||||
SettingUtils.isAgreePrivacy = isChecked
|
|
||||||
refreshButton(isChecked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun initListeners() {
|
|
||||||
binding!!.btnGetVerifyCode.setOnClickListener(this)
|
|
||||||
binding!!.btnLogin.setOnClickListener(this)
|
|
||||||
binding!!.tvOtherLogin.setOnClickListener(this)
|
|
||||||
binding!!.tvForgetPassword.setOnClickListener(this)
|
|
||||||
binding!!.tvUserProtocol.setOnClickListener(this)
|
|
||||||
binding!!.tvPrivacyProtocol.setOnClickListener(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun refreshButton(isChecked: Boolean) {
|
|
||||||
ViewUtils.setEnabled(binding!!.btnLogin, isChecked)
|
|
||||||
ViewUtils.setEnabled(mJumpView, isChecked)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun handleSubmitPrivacy() {
|
|
||||||
isAgreePrivacy = true
|
|
||||||
UMengInit.init()
|
|
||||||
// 应用市场不让默认勾选
|
|
||||||
// ViewUtils.setChecked(cbProtocol, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SingleClick
|
|
||||||
override fun onClick(v: View) {
|
|
||||||
val id = v.id
|
|
||||||
if (id == R.id.btn_get_verify_code) {
|
|
||||||
if (binding!!.etPhoneNumber.validate()) {
|
|
||||||
getVerifyCode(binding!!.etPhoneNumber.editValue)
|
|
||||||
}
|
|
||||||
} else if (id == R.id.btn_login) {
|
|
||||||
if (binding!!.etPhoneNumber.validate()) {
|
|
||||||
if (binding!!.etVerifyCode.validate()) {
|
|
||||||
loginByVerifyCode(
|
|
||||||
binding!!.etPhoneNumber.editValue,
|
|
||||||
binding!!.etVerifyCode.editValue
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (id == R.id.tv_other_login) {
|
|
||||||
XToastUtils.info("其他登录方式")
|
|
||||||
} else if (id == R.id.tv_forget_password) {
|
|
||||||
XToastUtils.info("忘记密码")
|
|
||||||
} else if (id == R.id.tv_user_protocol) {
|
|
||||||
gotoProtocol(this, isPrivacy = false, isImmersive = true)
|
|
||||||
} else if (id == R.id.tv_privacy_protocol) {
|
|
||||||
gotoProtocol(this, isPrivacy = true, isImmersive = true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取验证码
|
|
||||||
*/
|
|
||||||
private fun getVerifyCode(phoneNumber: String) {
|
|
||||||
// TODO: 2020/8/29 这里只是界面演示而已
|
|
||||||
XToastUtils.warning("只是演示,验证码请随便输 phoneNumber=$phoneNumber")
|
|
||||||
mCountDownHelper!!.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据验证码登录
|
|
||||||
*
|
|
||||||
* @param phoneNumber 手机号
|
|
||||||
* @param verifyCode 验证码
|
|
||||||
*/
|
|
||||||
private fun loginByVerifyCode(phoneNumber: String, verifyCode: String) {
|
|
||||||
// TODO: 2020/8/29 这里只是界面演示而已
|
|
||||||
Log.d("loginByVerifyCode", "phoneNumber=$phoneNumber, verifyCode=$verifyCode")
|
|
||||||
onLoginSuccess()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录成功的处理
|
|
||||||
*/
|
|
||||||
private fun onLoginSuccess() {
|
|
||||||
val token = getRandomNumbersAndLetters(16)
|
|
||||||
if (handleLoginSuccess(token)) {
|
|
||||||
popToBack()
|
|
||||||
ActivityUtils.startActivity(MainActivity::class.java)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroyView() {
|
|
||||||
if (mCountDownHelper != null) mCountDownHelper!!.recycle()
|
|
||||||
super.onDestroyView()
|
|
||||||
}
|
|
||||||
}
|
|
@ -42,11 +42,13 @@ import com.xuexiang.xui.widget.picker.XRangeSlider
|
|||||||
import com.xuexiang.xui.widget.picker.XRangeSlider.OnRangeSliderListener
|
import com.xuexiang.xui.widget.picker.XRangeSlider.OnRangeSliderListener
|
||||||
import com.xuexiang.xui.widget.picker.XSeekBar
|
import com.xuexiang.xui.widget.picker.XSeekBar
|
||||||
import com.xuexiang.xui.widget.picker.widget.builder.TimePickerBuilder
|
import com.xuexiang.xui.widget.picker.widget.builder.TimePickerBuilder
|
||||||
|
import com.xuexiang.xutil.XUtil
|
||||||
import com.xuexiang.xutil.XUtil.getPackageManager
|
import com.xuexiang.xutil.XUtil.getPackageManager
|
||||||
import com.xuexiang.xutil.app.AppUtils.getAppPackageName
|
import com.xuexiang.xutil.app.AppUtils.getAppPackageName
|
||||||
import com.xuexiang.xutil.data.DateUtils
|
import com.xuexiang.xutil.data.DateUtils
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
@Suppress("PropertyName", "SpellCheckingInspection")
|
@Suppress("PropertyName", "SpellCheckingInspection")
|
||||||
@Page(name = "通用设置")
|
@Page(name = "通用设置")
|
||||||
class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickListener {
|
class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickListener {
|
||||||
@ -121,6 +123,9 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
|||||||
|
|
||||||
//帮助提示
|
//帮助提示
|
||||||
switchHelpTip(binding!!.sbHelpTip)
|
switchHelpTip(binding!!.sbHelpTip)
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
switchDirectlyToClient(binding!!.sbDirectlyToClient)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initListeners() {
|
override fun initListeners() {
|
||||||
@ -693,6 +698,24 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
private fun switchDirectlyToClient(@SuppressLint("UseSwitchCompatOrMaterialCode") switchDirectlyToClient: SwitchButton) {
|
||||||
|
switchDirectlyToClient.isChecked = SettingUtils.enablePureClientMode
|
||||||
|
switchDirectlyToClient.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
|
SettingUtils.enablePureClientMode = isChecked
|
||||||
|
if (isChecked) {
|
||||||
|
MaterialDialog.Builder(requireContext())
|
||||||
|
.content(getString(R.string.enabling_pure_client_mode))
|
||||||
|
.positiveText(R.string.lab_yes)
|
||||||
|
.onPositive { _: MaterialDialog?, _: DialogAction? ->
|
||||||
|
XUtil.exitApp()
|
||||||
|
}
|
||||||
|
.negativeText(R.string.lab_no)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//获取当前手机品牌
|
//获取当前手机品牌
|
||||||
private fun getAutoStartTips(): String {
|
private fun getAutoStartTips(): String {
|
||||||
return when (Build.BRAND.lowercase(Locale.ROOT)) {
|
return when (Build.BRAND.lowercase(Locale.ROOT)) {
|
||||||
|
@ -7,6 +7,7 @@ import android.os.Build
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.idormy.sms.forwarder.activity.SplashActivity
|
import com.idormy.sms.forwarder.activity.SplashActivity
|
||||||
import com.idormy.sms.forwarder.service.ForegroundService
|
import com.idormy.sms.forwarder.service.ForegroundService
|
||||||
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
|
|
||||||
@Suppress("PropertyName")
|
@Suppress("PropertyName")
|
||||||
class BootReceiver : BroadcastReceiver() {
|
class BootReceiver : BroadcastReceiver() {
|
||||||
@ -22,6 +23,9 @@ class BootReceiver : BroadcastReceiver() {
|
|||||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
context.startActivity(i)
|
context.startActivity(i)
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//前台服务
|
//前台服务
|
||||||
val frontServiceIntent = Intent(context, ForegroundService::class.java)
|
val frontServiceIntent = Intent(context, ForegroundService::class.java)
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
@ -30,6 +30,9 @@ class PhoneStateReceiver : BroadcastReceiver() {
|
|||||||
|
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
try {
|
try {
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//总开关
|
//总开关
|
||||||
if (!SettingUtils.enablePhone) return
|
if (!SettingUtils.enablePhone) return
|
||||||
|
|
||||||
|
@ -28,6 +28,9 @@ class SmsReceiver : BroadcastReceiver() {
|
|||||||
|
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
try {
|
try {
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//总开关
|
//总开关
|
||||||
if (!SettingUtils.enableSms) return
|
if (!SettingUtils.enableSms) return
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@ class BatteryService : Service() {
|
|||||||
super.onCreate()
|
super.onCreate()
|
||||||
Log.i(TAG, "onCreate--------------")
|
Log.i(TAG, "onCreate--------------")
|
||||||
|
|
||||||
//是否同意隐私协议
|
//纯客户端模式
|
||||||
//if (!MyApplication.allowPrivacyPolicy) return
|
//if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
val batteryFilter = IntentFilter()
|
val batteryFilter = IntentFilter()
|
||||||
batteryFilter.addAction(Intent.ACTION_BATTERY_CHANGED)
|
batteryFilter.addAction(Intent.ACTION_BATTERY_CHANGED)
|
||||||
@ -41,15 +41,16 @@ class BatteryService : Service() {
|
|||||||
|
|
||||||
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
|
||||||
Log.i(TAG, "onStartCommand--------------")
|
Log.i(TAG, "onStartCommand--------------")
|
||||||
return START_STICKY //
|
return START_STICKY
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
Log.i(TAG, "onDestroy--------------")
|
Log.i(TAG, "onDestroy--------------")
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
|
|
||||||
//是否同意隐私协议
|
//纯客户端模式
|
||||||
//if (!MyApplication.allowPrivacyPolicy) return
|
//if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
unregisterReceiver(batteryReceiver)
|
unregisterReceiver(batteryReceiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,10 @@ class ForegroundService : Service() {
|
|||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
||||||
startForeground(FRONT_NOTIFY_ID, createForegroundNotification())
|
startForeground(FRONT_NOTIFY_ID, createForegroundNotification())
|
||||||
isRunning = true
|
isRunning = true
|
||||||
@ -108,6 +112,12 @@ class ForegroundService : Service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) {
|
||||||
|
super.onDestroy()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
stopForeground(true)
|
stopForeground(true)
|
||||||
compositeDisposable.dispose()
|
compositeDisposable.dispose()
|
||||||
isRunning = false
|
isRunning = false
|
||||||
|
@ -6,6 +6,7 @@ import android.os.IBinder
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.idormy.sms.forwarder.utils.HTTP_SERVER_PORT
|
import com.idormy.sms.forwarder.utils.HTTP_SERVER_PORT
|
||||||
import com.idormy.sms.forwarder.utils.HTTP_SERVER_TIME_OUT
|
import com.idormy.sms.forwarder.utils.HTTP_SERVER_TIME_OUT
|
||||||
|
import com.idormy.sms.forwarder.utils.SettingUtils
|
||||||
import com.yanzhenjie.andserver.AndServer
|
import com.yanzhenjie.andserver.AndServer
|
||||||
import com.yanzhenjie.andserver.Server
|
import com.yanzhenjie.andserver.Server
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@ -28,6 +29,10 @@ class HttpService : Service(), Server.ServerListener {
|
|||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
Log.i(TAG, "onCreate: ")
|
Log.i(TAG, "onCreate: ")
|
||||||
server.startup()
|
server.startup()
|
||||||
}
|
}
|
||||||
@ -39,6 +44,10 @@ class HttpService : Service(), Server.ServerListener {
|
|||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
|
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
Log.i(TAG, "onDestroy: ")
|
Log.i(TAG, "onDestroy: ")
|
||||||
server.shutdown()
|
server.shutdown()
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,9 @@ class NotifyService : NotificationListenerService()/*, LifecycleOwner*/ {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onListenerDisconnected() {
|
override fun onListenerDisconnected() {
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//总开关
|
//总开关
|
||||||
if (!SettingUtils.enableAppNotify) return
|
if (!SettingUtils.enableAppNotify) return
|
||||||
|
|
||||||
@ -51,6 +54,9 @@ class NotifyService : NotificationListenerService()/*, LifecycleOwner*/ {
|
|||||||
|
|
||||||
override fun onNotificationPosted(sbn: StatusBarNotification?) {
|
override fun onNotificationPosted(sbn: StatusBarNotification?) {
|
||||||
try {
|
try {
|
||||||
|
//纯客户端模式
|
||||||
|
if (SettingUtils.enablePureClientMode) return
|
||||||
|
|
||||||
//总开关
|
//总开关
|
||||||
if (!SettingUtils.enableAppNotify) return
|
if (!SettingUtils.enableAppNotify) return
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ const val SP_ENABLE_SMS_TEMPLATE = "enable_sms_template"
|
|||||||
const val SP_SMS_TEMPLATE = "sms_template"
|
const val SP_SMS_TEMPLATE = "sms_template"
|
||||||
|
|
||||||
const val SP_ENABLE_HELP_TIP = "enable_help_tip"
|
const val SP_ENABLE_HELP_TIP = "enable_help_tip"
|
||||||
|
const val SP_PURE_CLIENT_MODE = "enable_pure_client_mode"
|
||||||
|
|
||||||
const val CACTUS_TIMER = "cactus_timer"
|
const val CACTUS_TIMER = "cactus_timer"
|
||||||
const val CACTUS_LAST_TIMER = "cactus_last_timer"
|
const val CACTUS_LAST_TIMER = "cactus_last_timer"
|
||||||
|
@ -268,6 +268,14 @@ class SettingUtils private constructor() {
|
|||||||
set(enableHelpTip) {
|
set(enableHelpTip) {
|
||||||
MMKVUtils.put(SP_ENABLE_HELP_TIP, enableHelpTip)
|
MMKVUtils.put(SP_ENABLE_HELP_TIP, enableHelpTip)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//是否纯客户端模式
|
||||||
|
@JvmStatic
|
||||||
|
var enablePureClientMode: Boolean
|
||||||
|
get() = MMKVUtils.getBoolean(SP_PURE_CLIENT_MODE, false)
|
||||||
|
set(enablePureClientMode) {
|
||||||
|
MMKVUtils.put(SP_PURE_CLIENT_MODE, enablePureClientMode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
package com.idormy.sms.forwarder.utils
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.idormy.sms.forwarder.R
|
|
||||||
import com.umeng.analytics.MobclickAgent
|
|
||||||
import com.xuexiang.xui.utils.ResUtils
|
|
||||||
import com.xuexiang.xutil.app.ActivityUtils
|
|
||||||
import com.xuexiang.xutil.common.StringUtils
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Token管理工具
|
|
||||||
*
|
|
||||||
* @author xuexiang
|
|
||||||
* @since 2019-11-17 22:37
|
|
||||||
*/
|
|
||||||
@Suppress("unused")
|
|
||||||
class TokenUtils private constructor() {
|
|
||||||
companion object {
|
|
||||||
private var sToken: String? = null
|
|
||||||
private const val KEY_TOKEN = "KEY_TOKEN"
|
|
||||||
private const val KEY_PROFILE_CHANNEL = "github"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化Token信息
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
|
||||||
fun init(context: Context) {
|
|
||||||
MMKVUtils.init(context)
|
|
||||||
sToken = MMKVUtils.getString(KEY_TOKEN, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun clearToken() {
|
|
||||||
sToken = null
|
|
||||||
MMKVUtils.remove(KEY_TOKEN)
|
|
||||||
}
|
|
||||||
|
|
||||||
var token: String?
|
|
||||||
get() = sToken
|
|
||||||
set(token) {
|
|
||||||
sToken = token
|
|
||||||
MMKVUtils.put(KEY_TOKEN, token)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun hasToken(): Boolean {
|
|
||||||
return MMKVUtils.containsKey(KEY_TOKEN)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理登录成功的事件
|
|
||||||
*
|
|
||||||
* @param token 账户信息
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
|
||||||
fun handleLoginSuccess(token: String?): Boolean {
|
|
||||||
return if (!StringUtils.isEmpty(token)) {
|
|
||||||
XToastUtils.success(ResUtils.getString(R.string.login_succeeded))
|
|
||||||
MobclickAgent.onProfileSignIn(KEY_PROFILE_CHANNEL, token)
|
|
||||||
Companion.token = token
|
|
||||||
true
|
|
||||||
} else {
|
|
||||||
XToastUtils.error(ResUtils.getString(R.string.login_failed))
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 处理登出的事件
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
|
||||||
fun handleLogoutSuccess() {
|
|
||||||
MobclickAgent.onProfileSignOff()
|
|
||||||
//登出时,清除账号信息
|
|
||||||
clearToken()
|
|
||||||
XToastUtils.success(ResUtils.getString(R.string.logout_succeeded))
|
|
||||||
SettingUtils.isAgreePrivacy = false
|
|
||||||
//跳转到登录页
|
|
||||||
ActivityUtils.startActivity(com.idormy.sms.forwarder.activity.LoginActivity::class.java)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
throw UnsupportedOperationException("u can't instantiate me...")
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,7 +2,6 @@ package com.idormy.sms.forwarder.utils.sdkinit
|
|||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import com.idormy.sms.forwarder.core.BaseActivity
|
import com.idormy.sms.forwarder.core.BaseActivity
|
||||||
import com.idormy.sms.forwarder.utils.TokenUtils
|
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
import com.idormy.sms.forwarder.utils.XToastUtils
|
||||||
import com.xuexiang.xaop.XAOP
|
import com.xuexiang.xaop.XAOP
|
||||||
import com.xuexiang.xhttp2.XHttpSDK
|
import com.xuexiang.xhttp2.XHttpSDK
|
||||||
@ -49,7 +48,6 @@ class XBasicLibInit private constructor() {
|
|||||||
private fun initXUtil(application: Application) {
|
private fun initXUtil(application: Application) {
|
||||||
XUtil.init(application)
|
XUtil.init(application)
|
||||||
XUtil.debug(com.idormy.sms.forwarder.App.isDebug)
|
XUtil.debug(com.idormy.sms.forwarder.App.isDebug)
|
||||||
TokenUtils.init(application)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,7 +17,6 @@ import com.xuexiang.xhttp2.XHttp
|
|||||||
import com.xuexiang.xhttp2.cache.model.CacheMode
|
import com.xuexiang.xhttp2.cache.model.CacheMode
|
||||||
import com.xuexiang.xhttp2.callback.SimpleCallBack
|
import com.xuexiang.xhttp2.callback.SimpleCallBack
|
||||||
import com.xuexiang.xhttp2.exception.ApiException
|
import com.xuexiang.xhttp2.exception.ApiException
|
||||||
import com.xuexiang.xui.utils.ResUtils
|
|
||||||
import com.xuexiang.xui.utils.ResUtils.getString
|
import com.xuexiang.xui.utils.ResUtils.getString
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
|
@Suppress("PrivatePropertyName", "UNUSED_PARAMETER")
|
||||||
@ -122,10 +121,10 @@ class WeworkAgentUtils private constructor() {
|
|||||||
val resp = Gson().fromJson(response, DingtalkResult::class.java)
|
val resp = Gson().fromJson(response, DingtalkResult::class.java)
|
||||||
if (resp.errcode == 0L) {
|
if (resp.errcode == 0L) {
|
||||||
SendUtils.updateLogs(logId, 2, response)
|
SendUtils.updateLogs(logId, 2, response)
|
||||||
XToastUtils.success(ResUtils.getString(R.string.request_succeeded))
|
XToastUtils.success(getString(R.string.request_succeeded))
|
||||||
} else {
|
} else {
|
||||||
SendUtils.updateLogs(logId, 0, response)
|
SendUtils.updateLogs(logId, 0, response)
|
||||||
XToastUtils.error(ResUtils.getString(R.string.request_failed) + response)
|
XToastUtils.error(getString(R.string.request_failed) + response)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
app/src/main/res/drawable/ic_logout.xml
Normal file
5
app/src/main/res/drawable/ic_logout.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#FFFFFF" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M17,7l-1.41,1.41L18.17,11H8v2h10.17l-2.58,2.58L17,17l5,-5zM4,5h8V3H4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8v-2H4V5z"/>
|
||||||
|
</vector>
|
@ -1,191 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:layout_width="120dp"
|
|
||||||
android:layout_height="120dp"
|
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
app:srcCompat="@mipmap/ic_launcher" />
|
|
||||||
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/TextStyle.Title"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_marginTop="10dp"
|
|
||||||
android:text="登 录"
|
|
||||||
android:textSize="30sp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="24dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:layout_marginEnd="24dp"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="start|center_vertical"
|
|
||||||
android:tint="?attr/colorAccent"
|
|
||||||
app:srcCompat="@drawable/ic_phone" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
|
|
||||||
android:id="@+id/et_phone_number"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="36dp"
|
|
||||||
android:hint="@string/tip_please_input_phone_number"
|
|
||||||
android:inputType="number"
|
|
||||||
app:met_clearButton="true"
|
|
||||||
app:met_errorMessage="@string/tip_phone_number_error"
|
|
||||||
app:met_floatingLabel="normal"
|
|
||||||
app:met_floatingLabelText="@string/title_phone_number"
|
|
||||||
app:met_regexp="@string/regex_phone_number" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/fl_verify_code"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="12dp">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="start|center_vertical"
|
|
||||||
android:tint="?attr/colorAccent"
|
|
||||||
app:srcCompat="@drawable/ic_password" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
|
|
||||||
android:id="@+id/et_verify_code"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="36dp"
|
|
||||||
android:hint="@string/hint_please_input_verify_code"
|
|
||||||
android:inputType="number"
|
|
||||||
app:met_clearButton="false"
|
|
||||||
app:met_errorMessage="@string/tip_verify_code_error"
|
|
||||||
app:met_floatingLabel="normal"
|
|
||||||
app:met_floatingLabelText="@string/lab_verify_code"
|
|
||||||
app:met_maxCharacters="4"
|
|
||||||
app:met_regexp="@string/regex_verify_code" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.button.roundbutton.RoundButton
|
|
||||||
android:id="@+id/btn_get_verify_code"
|
|
||||||
style="@style/RoundButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingTop="3dp"
|
|
||||||
android:paddingEnd="10dp"
|
|
||||||
android:paddingBottom="3dp"
|
|
||||||
android:text="@string/action_get_verify_code"
|
|
||||||
android:textColor="@color/selector_round_button_main_theme_color"
|
|
||||||
android:textSize="13sp"
|
|
||||||
app:rb_borderColor="@color/selector_round_button_main_theme_color"
|
|
||||||
app:rb_borderWidth="1.5dp"
|
|
||||||
app:rb_radius="15dp" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.alpha.XUIAlphaTextView
|
|
||||||
android:id="@+id/tv_other_login"
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingTop="5dp"
|
|
||||||
android:paddingEnd="10dp"
|
|
||||||
android:paddingBottom="5dp"
|
|
||||||
android:text="@string/other_login_methods"
|
|
||||||
android:textColor="@color/xui_config_color_primary_text" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.alpha.XUIAlphaTextView
|
|
||||||
android:id="@+id/tv_forget_password"
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingTop="5dp"
|
|
||||||
android:paddingEnd="10dp"
|
|
||||||
android:paddingBottom="5dp"
|
|
||||||
android:text="@string/lab_forget_password"
|
|
||||||
android:textColor="@color/xui_config_color_primary_text" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
|
|
||||||
android:id="@+id/btn_login"
|
|
||||||
style="@style/SuperButton.Primary.Login"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:text="@string/title_login_register" />
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:layout_marginBottom="20dp"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<CheckBox
|
|
||||||
android:id="@+id/cb_protocol"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:scaleX="0.7"
|
|
||||||
android:scaleY="0.7" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:text="@string/agree_protocol"
|
|
||||||
android:textColor="@color/xui_config_color_primary_text" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.alpha.XUIAlphaTextView
|
|
||||||
android:id="@+id/tv_user_protocol"
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:text="@string/title_user_protocol"
|
|
||||||
android:textColor="?attr/colorAccent" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:text="@string/lab_and"
|
|
||||||
android:textColor="@color/xui_config_color_primary_text" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.alpha.XUIAlphaTextView
|
|
||||||
android:id="@+id/tv_privacy_protocol"
|
|
||||||
style="@style/TextStyle.Explain"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:text="@string/title_privacy_protocol"
|
|
||||||
android:textColor="?attr/colorAccent" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1141,6 +1141,40 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
style="@style/settingBarStyle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/pure_client_mode"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="RelativeOverlap" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/pure_client_mode_tips"
|
||||||
|
android:textSize="9sp"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.switchbutton.SwitchButton
|
||||||
|
android:id="@+id/sb_directly_to_client"
|
||||||
|
style="@style/SwitchButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
@ -852,4 +852,8 @@
|
|||||||
<string name="service_address">Service Address</string>
|
<string name="service_address">Service Address</string>
|
||||||
<string name="service_address_hint">E.g: http://127.0.0.1:5000</string>
|
<string name="service_address_hint">E.g: http://127.0.0.1:5000</string>
|
||||||
<string name="features_list">Features List</string>
|
<string name="features_list">Features List</string>
|
||||||
|
<string name="pure_client_mode">Directly To Client</string>
|
||||||
|
<string name="pure_client_mode_tips">When starting the APP, it will directly enter the active control client</string>
|
||||||
|
<string name="exit_pure_client_mode">Exit pure client mode</string>
|
||||||
|
<string name="enabling_pure_client_mode">Do you want to quit the app immediately and start it manually to take effect in pure client mode?</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -853,4 +853,8 @@
|
|||||||
<string name="service_address">服务地址</string>
|
<string name="service_address">服务地址</string>
|
||||||
<string name="service_address_hint">例如:http://127.0.0.1:5000</string>
|
<string name="service_address_hint">例如:http://127.0.0.1:5000</string>
|
||||||
<string name="features_list">功能列表</string>
|
<string name="features_list">功能列表</string>
|
||||||
|
<string name="pure_client_mode">纯客户端模式</string>
|
||||||
|
<string name="pure_client_mode_tips">启动APP时直接进入主动控制·客户端</string>
|
||||||
|
<string name="exit_pure_client_mode">退出纯客户端模式</string>
|
||||||
|
<string name="enabling_pure_client_mode">是否立即退出App后手动启动,以生效纯客户端模式?</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user