优化:复制服务端地址时,IPv6地址加[]

This commit is contained in:
pppscn 2022-09-21 09:48:02 +08:00
parent 22ad631f06
commit 8418155826

View File

@ -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
}
} }