mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 09:27:41 +08:00
优化:复制服务端地址时,IPv6地址加[]
This commit is contained in:
parent
22ad631f06
commit
8418155826
@ -1,342 +1,343 @@
|
|||||||
package com.idormy.sms.forwarder.fragment
|
package com.idormy.sms.forwarder.fragment
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.CompoundButton
|
import android.widget.CompoundButton
|
||||||
import com.hjq.permissions.OnPermissionCallback
|
import com.hjq.permissions.OnPermissionCallback
|
||||||
import com.hjq.permissions.Permission
|
import com.hjq.permissions.Permission
|
||||||
import com.hjq.permissions.XXPermissions
|
import com.hjq.permissions.XXPermissions
|
||||||
import com.idormy.sms.forwarder.App
|
import com.idormy.sms.forwarder.App
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentServerBinding
|
import com.idormy.sms.forwarder.databinding.FragmentServerBinding
|
||||||
import com.idormy.sms.forwarder.service.HttpService
|
import com.idormy.sms.forwarder.service.HttpService
|
||||||
import com.idormy.sms.forwarder.utils.HTTP_SERVER_PORT
|
import com.idormy.sms.forwarder.utils.HTTP_SERVER_PORT
|
||||||
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
import com.idormy.sms.forwarder.utils.HttpServerUtils
|
||||||
import com.idormy.sms.forwarder.utils.RandomUtils
|
import com.idormy.sms.forwarder.utils.RandomUtils
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
import com.idormy.sms.forwarder.utils.XToastUtils
|
||||||
import com.xuexiang.xaop.annotation.SingleClick
|
import com.xuexiang.xaop.annotation.SingleClick
|
||||||
import com.xuexiang.xpage.annotation.Page
|
import com.xuexiang.xpage.annotation.Page
|
||||||
import com.xuexiang.xui.widget.actionbar.TitleBar
|
import com.xuexiang.xui.widget.actionbar.TitleBar
|
||||||
import com.xuexiang.xui.widget.button.SmoothCheckBox
|
import com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
|
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
|
||||||
import com.xuexiang.xutil.app.ServiceUtils
|
import com.xuexiang.xutil.app.ServiceUtils
|
||||||
import com.xuexiang.xutil.net.NetworkUtils
|
import com.xuexiang.xutil.net.NetworkUtils
|
||||||
import com.xuexiang.xutil.system.ClipboardUtils
|
import com.xuexiang.xutil.system.ClipboardUtils
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.InetAddress
|
import java.net.InetAddress
|
||||||
|
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName")
|
@Suppress("PrivatePropertyName")
|
||||||
@Page(name = "主动控制·服务端")
|
@Page(name = "主动控制·服务端")
|
||||||
class ServerFragment : BaseFragment<FragmentServerBinding?>(), View.OnClickListener {
|
class ServerFragment : BaseFragment<FragmentServerBinding?>(), View.OnClickListener {
|
||||||
|
|
||||||
private var appContext: App? = null
|
private var appContext: App? = null
|
||||||
private var inetAddress: InetAddress? = null
|
private var inetAddress: InetAddress? = null
|
||||||
|
|
||||||
//定时更新界面
|
//定时更新界面
|
||||||
private val handler: Handler = Handler(Looper.getMainLooper())
|
private val handler: Handler = Handler(Looper.getMainLooper())
|
||||||
private val runnable: Runnable = object : Runnable {
|
private val runnable: Runnable = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
handler.postDelayed(this, 1000) //每隔1秒刷新一次
|
handler.postDelayed(this, 1000) //每隔1秒刷新一次
|
||||||
refreshButtonText()
|
refreshButtonText()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initViews() {
|
override fun initViews() {
|
||||||
appContext = requireActivity().application as App
|
appContext = requireActivity().application as App
|
||||||
}
|
}
|
||||||
|
|
||||||
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_server)
|
titleBar.setTitle(R.string.menu_server)
|
||||||
return titleBar
|
return titleBar
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun viewBindingInflate(
|
override fun viewBindingInflate(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup,
|
container: ViewGroup,
|
||||||
): FragmentServerBinding {
|
): FragmentServerBinding {
|
||||||
return FragmentServerBinding.inflate(inflater, container, false)
|
return FragmentServerBinding.inflate(inflater, container, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initListeners() {
|
override fun initListeners() {
|
||||||
binding!!.tvServerTips.setOnClickListener(this)
|
binding!!.tvServerTips.setOnClickListener(this)
|
||||||
binding!!.ivCopy.setOnClickListener(this)
|
binding!!.ivCopy.setOnClickListener(this)
|
||||||
binding!!.btnToggleServer.setOnClickListener(this)
|
binding!!.btnToggleServer.setOnClickListener(this)
|
||||||
|
|
||||||
binding!!.scbServerAutorun.isChecked = HttpServerUtils.enableServerAutorun
|
binding!!.scbServerAutorun.isChecked = HttpServerUtils.enableServerAutorun
|
||||||
binding!!.scbServerAutorun.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean ->
|
binding!!.scbServerAutorun.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableServerAutorun = isChecked
|
HttpServerUtils.enableServerAutorun = isChecked
|
||||||
}
|
}
|
||||||
//启动更新UI定时器
|
//启动更新UI定时器
|
||||||
handler.post(runnable)
|
handler.post(runnable)
|
||||||
|
|
||||||
binding!!.btnSignKey.setOnClickListener(this)
|
binding!!.btnSignKey.setOnClickListener(this)
|
||||||
binding!!.btnPathPicker.setOnClickListener(this)
|
binding!!.btnPathPicker.setOnClickListener(this)
|
||||||
binding!!.etSignKey.setText(HttpServerUtils.serverSignKey)
|
binding!!.etSignKey.setText(HttpServerUtils.serverSignKey)
|
||||||
binding!!.etSignKey.addTextChangedListener(object : TextWatcher {
|
binding!!.etSignKey.addTextChangedListener(object : TextWatcher {
|
||||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
||||||
override fun afterTextChanged(s: Editable) {
|
override fun afterTextChanged(s: Editable) {
|
||||||
HttpServerUtils.serverSignKey = binding!!.etSignKey.text.toString().trim()
|
HttpServerUtils.serverSignKey = binding!!.etSignKey.text.toString().trim()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
binding!!.etWebPath.setText(HttpServerUtils.serverWebPath)
|
binding!!.etWebPath.setText(HttpServerUtils.serverWebPath)
|
||||||
binding!!.etWebPath.addTextChangedListener(object : TextWatcher {
|
binding!!.etWebPath.addTextChangedListener(object : TextWatcher {
|
||||||
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
||||||
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
||||||
override fun afterTextChanged(s: Editable) {
|
override fun afterTextChanged(s: Editable) {
|
||||||
HttpServerUtils.serverWebPath = binding!!.etWebPath.text.toString().trim()
|
HttpServerUtils.serverWebPath = binding!!.etWebPath.text.toString().trim()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
binding!!.sbApiClone.isChecked = HttpServerUtils.enableApiClone
|
binding!!.sbApiClone.isChecked = HttpServerUtils.enableApiClone
|
||||||
binding!!.sbApiClone.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiClone.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiClone = isChecked
|
HttpServerUtils.enableApiClone = isChecked
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiSendSms.isChecked = HttpServerUtils.enableApiSmsSend
|
binding!!.sbApiSendSms.isChecked = HttpServerUtils.enableApiSmsSend
|
||||||
binding!!.sbApiSendSms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiSendSms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiSmsSend = isChecked
|
HttpServerUtils.enableApiSmsSend = isChecked
|
||||||
if (isChecked) checkSendSmsPermission()
|
if (isChecked) checkSendSmsPermission()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiQuerySms.isChecked = HttpServerUtils.enableApiSmsQuery
|
binding!!.sbApiQuerySms.isChecked = HttpServerUtils.enableApiSmsQuery
|
||||||
binding!!.sbApiQuerySms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiQuerySms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiSmsQuery = isChecked
|
HttpServerUtils.enableApiSmsQuery = isChecked
|
||||||
if (isChecked) checkReadSmsPermission()
|
if (isChecked) checkReadSmsPermission()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiQueryCall.isChecked = HttpServerUtils.enableApiCallQuery
|
binding!!.sbApiQueryCall.isChecked = HttpServerUtils.enableApiCallQuery
|
||||||
binding!!.sbApiQueryCall.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiQueryCall.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiCallQuery = isChecked
|
HttpServerUtils.enableApiCallQuery = isChecked
|
||||||
if (isChecked) checkCallPermission()
|
if (isChecked) checkCallPermission()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiQueryContacts.isChecked = HttpServerUtils.enableApiContactQuery
|
binding!!.sbApiQueryContacts.isChecked = HttpServerUtils.enableApiContactQuery
|
||||||
binding!!.sbApiQueryContacts.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiQueryContacts.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiContactQuery = isChecked
|
HttpServerUtils.enableApiContactQuery = isChecked
|
||||||
if (isChecked) checkContactsPermission()
|
if (isChecked) checkContactsPermission()
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiQueryBattery.isChecked = HttpServerUtils.enableApiBatteryQuery
|
binding!!.sbApiQueryBattery.isChecked = HttpServerUtils.enableApiBatteryQuery
|
||||||
binding!!.sbApiQueryBattery.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiQueryBattery.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiBatteryQuery = isChecked
|
HttpServerUtils.enableApiBatteryQuery = isChecked
|
||||||
}
|
}
|
||||||
|
|
||||||
binding!!.sbApiWol.isChecked = HttpServerUtils.enableApiWol
|
binding!!.sbApiWol.isChecked = HttpServerUtils.enableApiWol
|
||||||
binding!!.sbApiWol.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
binding!!.sbApiWol.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
HttpServerUtils.enableApiWol = isChecked
|
HttpServerUtils.enableApiWol = isChecked
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SingleClick
|
@SingleClick
|
||||||
override fun onClick(v: View) {
|
override fun onClick(v: View) {
|
||||||
when (v.id) {
|
when (v.id) {
|
||||||
R.id.btn_toggle_server -> {
|
R.id.btn_toggle_server -> {
|
||||||
//检查权限是否获取
|
//检查权限是否获取
|
||||||
checkSendSmsPermission()
|
checkSendSmsPermission()
|
||||||
checkReadSmsPermission()
|
checkReadSmsPermission()
|
||||||
checkCallPermission()
|
checkCallPermission()
|
||||||
checkContactsPermission()
|
checkContactsPermission()
|
||||||
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
||||||
appContext?.stopService(Intent(appContext, HttpService::class.java))
|
appContext?.stopService(Intent(appContext, HttpService::class.java))
|
||||||
} else {
|
} else {
|
||||||
appContext?.startService(Intent(appContext, HttpService::class.java))
|
appContext?.startService(Intent(appContext, HttpService::class.java))
|
||||||
}
|
}
|
||||||
refreshButtonText()
|
refreshButtonText()
|
||||||
}
|
}
|
||||||
R.id.btn_sign_key -> {
|
R.id.btn_sign_key -> {
|
||||||
val sign = RandomUtils.getRandomNumbersAndLetters(16)
|
val sign = RandomUtils.getRandomNumbersAndLetters(16)
|
||||||
ClipboardUtils.copyText(sign)
|
ClipboardUtils.copyText(sign)
|
||||||
binding!!.etSignKey.setText(sign)
|
binding!!.etSignKey.setText(sign)
|
||||||
XToastUtils.info(getString(R.string.sign_key_tips))
|
XToastUtils.info(getString(R.string.sign_key_tips))
|
||||||
}
|
}
|
||||||
R.id.tv_server_tips, R.id.iv_copy -> {
|
R.id.tv_server_tips, R.id.iv_copy -> {
|
||||||
val url = if (inetAddress != null) "http://${inetAddress?.hostAddress}:5000" else "http://127.0.0.1:5000"
|
var hostAddress: String = if (inetAddress != null) "${inetAddress?.hostAddress}" else "127.0.0.1"
|
||||||
ClipboardUtils.copyText(url)
|
hostAddress = if (hostAddress.indexOf(':', 0, false) > 0) "[${hostAddress}]" else hostAddress
|
||||||
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), url))
|
val url = "http://${hostAddress}:5000"
|
||||||
}
|
ClipboardUtils.copyText(url)
|
||||||
R.id.btn_path_picker -> {
|
XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), url))
|
||||||
val downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path
|
}
|
||||||
val dirList = listSubDir(downloadPath)
|
R.id.btn_path_picker -> {
|
||||||
if (dirList.isEmpty()) {
|
val downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path
|
||||||
XToastUtils.error(String.format(getString(R.string.download_first), downloadPath))
|
val dirList = listSubDir(downloadPath)
|
||||||
return
|
if (dirList.isEmpty()) {
|
||||||
}
|
XToastUtils.error(String.format(getString(R.string.download_first), downloadPath))
|
||||||
MaterialDialog.Builder(requireContext())
|
return
|
||||||
.title(getString(R.string.select_web_client_directory))
|
}
|
||||||
.content(String.format(getString(R.string.root_directory), downloadPath))
|
MaterialDialog.Builder(requireContext())
|
||||||
.items(dirList)
|
.title(getString(R.string.select_web_client_directory))
|
||||||
.itemsCallbackSingleChoice(0) { _: MaterialDialog?, _: View?, _: Int, text: CharSequence ->
|
.content(String.format(getString(R.string.root_directory), downloadPath))
|
||||||
val webPath = "$downloadPath/$text"
|
.items(dirList)
|
||||||
binding!!.etWebPath.setText(webPath)
|
.itemsCallbackSingleChoice(0) { _: MaterialDialog?, _: View?, _: Int, text: CharSequence ->
|
||||||
HttpServerUtils.serverWebPath = webPath
|
val webPath = "$downloadPath/$text"
|
||||||
|
binding!!.etWebPath.setText(webPath)
|
||||||
XToastUtils.info(getString(R.string.restarting_httpserver))
|
HttpServerUtils.serverWebPath = webPath
|
||||||
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
|
||||||
appContext?.stopService(Intent(appContext, HttpService::class.java))
|
XToastUtils.info(getString(R.string.restarting_httpserver))
|
||||||
appContext?.startService(Intent(appContext, HttpService::class.java))
|
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
||||||
} else {
|
appContext?.stopService(Intent(appContext, HttpService::class.java))
|
||||||
appContext?.startService(Intent(appContext, HttpService::class.java))
|
appContext?.startService(Intent(appContext, HttpService::class.java))
|
||||||
}
|
} else {
|
||||||
refreshButtonText()
|
appContext?.startService(Intent(appContext, HttpService::class.java))
|
||||||
true // allow selection
|
}
|
||||||
}
|
refreshButtonText()
|
||||||
.positiveText(R.string.select)
|
true // allow selection
|
||||||
.negativeText(R.string.cancel)
|
}
|
||||||
.show()
|
.positiveText(R.string.select)
|
||||||
}
|
.negativeText(R.string.cancel)
|
||||||
else -> {}
|
.show()
|
||||||
}
|
}
|
||||||
}
|
else -> {}
|
||||||
|
}
|
||||||
//刷新按钮
|
}
|
||||||
private fun refreshButtonText() {
|
|
||||||
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
//刷新按钮
|
||||||
binding!!.btnToggleServer.text = resources.getText(R.string.stop_server)
|
private fun refreshButtonText() {
|
||||||
binding!!.ivCopy.visibility = View.VISIBLE
|
if (ServiceUtils.isServiceRunning("com.idormy.sms.forwarder.service.HttpService")) {
|
||||||
try {
|
binding!!.btnToggleServer.text = resources.getText(R.string.stop_server)
|
||||||
inetAddress = NetworkUtils.getLocalInetAddress()
|
binding!!.ivCopy.visibility = View.VISIBLE
|
||||||
binding!!.tvServerTips.text = getString(R.string.http_server_running, inetAddress!!.hostAddress, HTTP_SERVER_PORT)
|
try {
|
||||||
|
inetAddress = NetworkUtils.getLocalInetAddress()
|
||||||
} catch (e: Exception) {
|
binding!!.tvServerTips.text = getString(R.string.http_server_running, inetAddress!!.hostAddress, HTTP_SERVER_PORT)
|
||||||
e.printStackTrace()
|
} catch (e: Exception) {
|
||||||
binding!!.tvServerTips.text = getString(R.string.http_server_running, "127.0.0.1", HTTP_SERVER_PORT)
|
e.printStackTrace()
|
||||||
}
|
binding!!.tvServerTips.text = getString(R.string.http_server_running, "127.0.0.1", HTTP_SERVER_PORT)
|
||||||
} else {
|
}
|
||||||
binding!!.btnToggleServer.text = resources.getText(R.string.start_server)
|
} else {
|
||||||
binding!!.tvServerTips.text = getString(R.string.http_server_stopped)
|
binding!!.btnToggleServer.text = resources.getText(R.string.start_server)
|
||||||
binding!!.ivCopy.visibility = View.GONE
|
binding!!.tvServerTips.text = getString(R.string.http_server_stopped)
|
||||||
}
|
binding!!.ivCopy.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//发送短信权限
|
|
||||||
private fun checkSendSmsPermission() {
|
//发送短信权限
|
||||||
XXPermissions.with(this)
|
private fun checkSendSmsPermission() {
|
||||||
// 发送短信
|
XXPermissions.with(this)
|
||||||
.permission(Permission.SEND_SMS)
|
// 发送短信
|
||||||
.request(object : OnPermissionCallback {
|
.permission(Permission.SEND_SMS)
|
||||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
.request(object : OnPermissionCallback {
|
||||||
}
|
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||||
|
}
|
||||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
|
||||||
if (never) {
|
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||||
XToastUtils.error(R.string.toast_denied_never)
|
if (never) {
|
||||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
XToastUtils.error(R.string.toast_denied_never)
|
||||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||||
} else {
|
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||||
XToastUtils.error(R.string.toast_denied)
|
} else {
|
||||||
}
|
XToastUtils.error(R.string.toast_denied)
|
||||||
HttpServerUtils.enableApiSmsSend = false
|
}
|
||||||
binding!!.sbApiSendSms.isChecked = false
|
HttpServerUtils.enableApiSmsSend = false
|
||||||
}
|
binding!!.sbApiSendSms.isChecked = false
|
||||||
})
|
}
|
||||||
}
|
})
|
||||||
|
}
|
||||||
//读取短信权限
|
|
||||||
private fun checkReadSmsPermission() {
|
//读取短信权限
|
||||||
XXPermissions.with(this)
|
private fun checkReadSmsPermission() {
|
||||||
// 接收短信
|
XXPermissions.with(this)
|
||||||
.permission(Permission.RECEIVE_SMS)
|
// 接收短信
|
||||||
// 发送短信
|
.permission(Permission.RECEIVE_SMS)
|
||||||
.permission(Permission.SEND_SMS)
|
// 发送短信
|
||||||
// 读取短信
|
.permission(Permission.SEND_SMS)
|
||||||
.permission(Permission.READ_SMS)
|
// 读取短信
|
||||||
.request(object : OnPermissionCallback {
|
.permission(Permission.READ_SMS)
|
||||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
.request(object : OnPermissionCallback {
|
||||||
}
|
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||||
|
}
|
||||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
|
||||||
if (never) {
|
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||||
XToastUtils.error(R.string.toast_denied_never)
|
if (never) {
|
||||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
XToastUtils.error(R.string.toast_denied_never)
|
||||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||||
} else {
|
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||||
XToastUtils.error(R.string.toast_denied)
|
} else {
|
||||||
}
|
XToastUtils.error(R.string.toast_denied)
|
||||||
HttpServerUtils.enableApiSmsQuery = false
|
}
|
||||||
binding!!.sbApiQuerySms.isChecked = false
|
HttpServerUtils.enableApiSmsQuery = false
|
||||||
}
|
binding!!.sbApiQuerySms.isChecked = false
|
||||||
})
|
}
|
||||||
}
|
})
|
||||||
|
}
|
||||||
//电话权限
|
|
||||||
private fun checkCallPermission() {
|
//电话权限
|
||||||
XXPermissions.with(this)
|
private fun checkCallPermission() {
|
||||||
// 读取电话状态
|
XXPermissions.with(this)
|
||||||
.permission(Permission.READ_PHONE_STATE)
|
// 读取电话状态
|
||||||
// 读取手机号码
|
.permission(Permission.READ_PHONE_STATE)
|
||||||
.permission(Permission.READ_PHONE_NUMBERS)
|
// 读取手机号码
|
||||||
// 读取通话记录
|
.permission(Permission.READ_PHONE_NUMBERS)
|
||||||
.permission(Permission.READ_CALL_LOG)
|
// 读取通话记录
|
||||||
.request(object : OnPermissionCallback {
|
.permission(Permission.READ_CALL_LOG)
|
||||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
.request(object : OnPermissionCallback {
|
||||||
}
|
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||||
|
}
|
||||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
|
||||||
if (never) {
|
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||||
XToastUtils.error(R.string.toast_denied_never)
|
if (never) {
|
||||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
XToastUtils.error(R.string.toast_denied_never)
|
||||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||||
} else {
|
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||||
XToastUtils.error(R.string.toast_denied)
|
} else {
|
||||||
}
|
XToastUtils.error(R.string.toast_denied)
|
||||||
HttpServerUtils.enableApiCallQuery = false
|
}
|
||||||
binding!!.sbApiQueryCall.isChecked = false
|
HttpServerUtils.enableApiCallQuery = false
|
||||||
}
|
binding!!.sbApiQueryCall.isChecked = false
|
||||||
})
|
}
|
||||||
}
|
})
|
||||||
|
}
|
||||||
//联系人权限
|
|
||||||
private fun checkContactsPermission() {
|
//联系人权限
|
||||||
XXPermissions.with(this)
|
private fun checkContactsPermission() {
|
||||||
.permission(*Permission.Group.CONTACTS)
|
XXPermissions.with(this)
|
||||||
.request(object : OnPermissionCallback {
|
.permission(*Permission.Group.CONTACTS)
|
||||||
override fun onGranted(permissions: List<String>, all: Boolean) {
|
.request(object : OnPermissionCallback {
|
||||||
}
|
override fun onGranted(permissions: List<String>, all: Boolean) {
|
||||||
|
}
|
||||||
override fun onDenied(permissions: List<String>, never: Boolean) {
|
|
||||||
if (never) {
|
override fun onDenied(permissions: List<String>, never: Boolean) {
|
||||||
XToastUtils.error(R.string.toast_denied_never)
|
if (never) {
|
||||||
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
XToastUtils.error(R.string.toast_denied_never)
|
||||||
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
// 如果是被永久拒绝就跳转到应用权限系统设置页面
|
||||||
} else {
|
XXPermissions.startPermissionActivity(requireContext(), permissions)
|
||||||
XToastUtils.error(R.string.toast_denied)
|
} else {
|
||||||
}
|
XToastUtils.error(R.string.toast_denied)
|
||||||
HttpServerUtils.enableApiContactQuery = false
|
}
|
||||||
binding!!.sbApiQueryContacts.isChecked = false
|
HttpServerUtils.enableApiContactQuery = false
|
||||||
}
|
binding!!.sbApiQueryContacts.isChecked = false
|
||||||
})
|
}
|
||||||
}
|
})
|
||||||
|
}
|
||||||
override fun onDestroy() {
|
|
||||||
super.onDestroy()
|
override fun onDestroy() {
|
||||||
//取消定时器
|
super.onDestroy()
|
||||||
handler.removeCallbacks(runnable)
|
//取消定时器
|
||||||
}
|
handler.removeCallbacks(runnable)
|
||||||
|
}
|
||||||
//获取Download的子目录
|
|
||||||
private fun listSubDir(downloadPath: String): List<String> {
|
//获取Download的子目录
|
||||||
val dirList = mutableListOf<String>()
|
private fun listSubDir(downloadPath: String): List<String> {
|
||||||
val downloadDir = File(downloadPath)
|
val dirList = mutableListOf<String>()
|
||||||
val files = downloadDir.listFiles() ?: return dirList
|
val downloadDir = File(downloadPath)
|
||||||
|
val files = downloadDir.listFiles() ?: return dirList
|
||||||
for (file in files) {
|
|
||||||
if (file.isDirectory && !file.name.startsWith(".") && !file.name.startsWith("leakcanary-")) {
|
for (file in files) {
|
||||||
dirList.add(file.name)
|
if (file.isDirectory && !file.name.startsWith(".") && !file.name.startsWith("leakcanary-")) {
|
||||||
}
|
dirList.add(file.name)
|
||||||
}
|
}
|
||||||
return dirList
|
}
|
||||||
}
|
return dirList
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user