Commit c314a02e authored by wanglei's avatar wanglei

...

parent b3d0d4a3
package com.base.scanqr.bean package com.base.scanqr.bean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.QRCodeUtils.getPairKeyValue import com.base.scanqr.utils.QRCodeUtils.getPairKeyValue
...@@ -22,6 +23,29 @@ data class WifiUIBean( ...@@ -22,6 +23,29 @@ data class WifiUIBean(
return false return false
} }
fun createWifiQRString(bean: WifiUIBean): String {
val content = StringBuilder()
content.append("WIFI:")
content.append("T:")
if (bean.securityId == 0) {
content.append("WPA/WPA2").append(";")
}
if (bean.securityId == 1) {
content.append("WEP").append(";")
}
if (bean.securityId == 2) {
content.append(";")
}
content.append("S:")
content.append(bean.ssid).append(";")
content.append("P:")
content.append(bean.password).append(";")
content.append("H:")
content.append(bean.hidden).append(";")
return content.toString()
}
fun createWifiBean(qrCodeValue: String): WifiUIBean { fun createWifiBean(qrCodeValue: String): WifiUIBean {
val startTag = "WIFI:" val startTag = "WIFI:"
val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length) val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length)
......
...@@ -9,7 +9,7 @@ class AdConfigBean( ...@@ -9,7 +9,7 @@ class AdConfigBean(
var openAdLoading: Int = 15, var openAdLoading: Int = 15,
var functionBackShowAd: Boolean = true, var functionBackShowAd: Boolean = true,
var functionInShowAd: Boolean = true, var functionInShowAd: Boolean = true,
var createFgInterval: Int = 1, var tabFgInterval: Int = 15,
) { ) {
companion object { companion object {
/** /**
......
package com.base.scanqr.ui.contact package com.base.scanqr.ui.contact
import android.Manifest
import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -11,6 +10,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -11,6 +10,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ContractUIBean import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.databinding.ActivityContractCodeBinding import com.base.scanqr.databinding.ActivityContractCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -28,8 +28,12 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC ...@@ -28,8 +28,12 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC
private var contractUIBean = ContractUIBean() private var contractUIBean = ContractUIBean()
private var tempImage: String = "" private var tempImagePath: String = ""
private var contractQrString = "" private var qrString = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -54,9 +58,9 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC ...@@ -54,9 +58,9 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC
binding.tvAddress.text = contractUIBean.adr binding.tvAddress.text = contractUIBean.adr
} }
Thread { Thread {
contractQrString = ContractUIBean.createContractQrString(contractUIBean) qrString = ContractUIBean.createContractQrString(contractUIBean)
LogEx.logDebug(TAG, "contractQrString=$contractQrString") LogEx.logDebug(TAG, "contractQrString=$qrString")
val bitmap = generateQRCode(contractQrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -64,7 +68,7 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC ...@@ -64,7 +68,7 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (contractUIBean.needCreate) { if (contractUIBean.needCreate) {
...@@ -96,7 +100,7 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC ...@@ -96,7 +100,7 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -106,27 +110,14 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC ...@@ -106,27 +110,14 @@ class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityC
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, contractQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
package com.base.scanqr.ui.email package com.base.scanqr.ui.email
import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -11,6 +11,7 @@ import com.base.scanqr.bean.EmailUIBean ...@@ -11,6 +11,7 @@ import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EmailUIBean.Companion.createEmailQrString import com.base.scanqr.bean.EmailUIBean.Companion.createEmailQrString
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import com.base.scanqr.databinding.ActivityEmailCodeBinding import com.base.scanqr.databinding.ActivityEmailCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -27,8 +28,12 @@ import java.io.File ...@@ -27,8 +28,12 @@ import java.io.File
class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCodeBinding::inflate) { class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCodeBinding::inflate) {
private var email = EmailUIBean() private var email = EmailUIBean()
private var tempImage: String = "" private var tempImagePath: String = ""
private var emailQrString: String = "" private var qrString: String = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -51,8 +56,8 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -51,8 +56,8 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
binding.tvMessage.text = email.message binding.tvMessage.text = email.message
Thread { Thread {
emailQrString = createEmailQrString(email) qrString = createEmailQrString(email)
val bitmap = generateQRCode(emailQrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -60,7 +65,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -60,7 +65,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (email.needCreate) { if (email.needCreate) {
...@@ -95,7 +100,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -95,7 +100,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -105,27 +110,14 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -105,27 +110,14 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, emailQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
...@@ -136,6 +128,5 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -136,6 +128,5 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
toast("No application was found to handle the email request", true) toast("No application was found to handle the email request", true)
} }
} }
} }
} }
\ No newline at end of file
package com.base.scanqr.ui.event package com.base.scanqr.ui.event
import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Environment import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -12,6 +12,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -12,6 +12,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.EventUIBean import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.databinding.ActivityEventCodeBinding import com.base.scanqr.databinding.ActivityEventCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -29,8 +30,11 @@ import java.io.File ...@@ -29,8 +30,11 @@ import java.io.File
class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCodeBinding::inflate) { class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCodeBinding::inflate) {
private var eventUIBean = EventUIBean() private var eventUIBean = EventUIBean()
private var tempImage: String = "" private var tempImagePath: String = ""
private var eventQrString = "" private var qrString = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -55,9 +59,9 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo ...@@ -55,9 +59,9 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo
binding.tvDesc.text = eventUIBean.description binding.tvDesc.text = eventUIBean.description
} }
Thread { Thread {
eventQrString = EventUIBean.createEventQRString(eventUIBean) qrString = EventUIBean.createEventQRString(eventUIBean)
LogEx.logDebug(TAG, "eventQrString=$eventQrString") LogEx.logDebug(TAG, "eventQrString=$qrString")
val bitmap = generateQRCode(eventQrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -65,7 +69,7 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo ...@@ -65,7 +69,7 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (eventUIBean.needCreate) { if (eventUIBean.needCreate) {
...@@ -98,7 +102,7 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo ...@@ -98,7 +102,7 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -108,27 +112,14 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo ...@@ -108,27 +112,14 @@ class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCo
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, eventQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
package com.base.scanqr.ui.location package com.base.scanqr.ui.location
import android.os.Bundle import com.base.scanqr.base.BaseActivity
import androidx.activity.enableEdgeToEdge import com.base.scanqr.databinding.ActivityLocationCodeBinding
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.scanqr.R
class LocationCodeActivity : AppCompatActivity() { class LocationCodeActivity : BaseActivity<ActivityLocationCodeBinding>(ActivityLocationCodeBinding::inflate) {
override fun onCreate(savedInstanceState: Bundle?) { override fun initView() {
super.onCreate(savedInstanceState) super.initView()
enableEdgeToEdge()
setContentView(R.layout.activity_location_code)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
} }
override fun initListener() {
super.initListener()
}
} }
\ No newline at end of file
...@@ -147,17 +147,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -147,17 +147,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
0 -> { 0 -> {
tabAt = 0 tabAt = 0
navController?.navigate(R.id.createFragment) navController?.navigate(R.id.createFragment)
val createPgPassTime = (System.currentTimeMillis() - createFgLastShow)
LogEx.logDebug( if (tabCanShowAd())
TAG,
"createPgPassTime=$createPgPassTime " +
"createFgInterval=${AdConfigBean.adsConfigBean.createFgInterval}"
)
val flag = createPgPassTime / 1000L > AdConfigBean.adsConfigBean.createFgInterval
if (createFgLastShow == 0L || flag)
AdsMgr.showInsert(this, false, object : AdsShowCallBack() { AdsMgr.showInsert(this, false, object : AdsShowCallBack() {
override fun show() { override fun show() {
createFgLastShow = System.currentTimeMillis() mainFgTabLastShow = System.currentTimeMillis()
} }
override fun close(where: Int) { override fun close(where: Int) {
...@@ -179,6 +173,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -179,6 +173,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
2 -> { 2 -> {
tabAt = 2 tabAt = 2
navController?.navigate(R.id.historyFragment) navController?.navigate(R.id.historyFragment)
if (tabCanShowAd())
AdsMgr.showInsert(this, false, object : AdsShowCallBack() {
override fun show() {
mainFgTabLastShow = System.currentTimeMillis()
}
override fun close(where: Int) {
}
override fun failed(where: Int) {
}
override fun googleFailed(where: Int) {
}
})
} }
3 -> { 3 -> {
...@@ -188,6 +197,17 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -188,6 +197,17 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
} }
} }
private fun tabCanShowAd(): Boolean {
val tabChangePassTime = (System.currentTimeMillis() - mainFgTabLastShow)
LogEx.logDebug(
TAG,
"tabChangePassTime=$tabChangePassTime " +
"tabFgInterval=${AdConfigBean.adsConfigBean.tabFgInterval}"
)
val flag = tabChangePassTime / 1000L > AdConfigBean.adsConfigBean.tabFgInterval
return mainFgTabLastShow == 0L || flag
}
fun TabLayout.Tab.setUnselected() { fun TabLayout.Tab.setUnselected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab) val textView = customView?.findViewById<TextView>(R.id.tv_tab)
LogEx.logDebug(TAG, "setUnselected ${textView?.text}") LogEx.logDebug(TAG, "setUnselected ${textView?.text}")
...@@ -215,6 +235,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -215,6 +235,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
companion object { companion object {
var tabAt = 1 var tabAt = 1
var createFgLastShow = 0L var mainFgTabLastShow = 0L
} }
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.base.scanqr.ui.message ...@@ -3,6 +3,7 @@ package com.base.scanqr.ui.message
import android.os.Environment import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -10,6 +11,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -10,6 +11,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.MessageUIBean import com.base.scanqr.bean.MessageUIBean
import com.base.scanqr.databinding.ActivityMessageCodeBinding import com.base.scanqr.databinding.ActivityMessageCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -26,8 +28,12 @@ import java.io.File ...@@ -26,8 +28,12 @@ import java.io.File
class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMessageCodeBinding::inflate) { class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMessageCodeBinding::inflate) {
private var messageUIBean = MessageUIBean() private var messageUIBean = MessageUIBean()
private var messageQrString = "" private var qrString = ""
private var tempImage: String = "" private var tempImagePath: String = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -49,9 +55,9 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes ...@@ -49,9 +55,9 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes
binding.tvMsg.text = messageUIBean.msg binding.tvMsg.text = messageUIBean.msg
} }
Thread { Thread {
messageQrString = MessageUIBean.createMessageQrString(messageUIBean) qrString = MessageUIBean.createMessageQrString(messageUIBean)
LogEx.logDebug(TAG, "messageQrString=$messageQrString") LogEx.logDebug(TAG, "messageQrString=$qrString")
val bitmap = generateQRCode(messageQrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -59,7 +65,7 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes ...@@ -59,7 +65,7 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (messageUIBean.needCreate) { if (messageUIBean.needCreate) {
...@@ -91,7 +97,7 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes ...@@ -91,7 +97,7 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -101,27 +107,14 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes ...@@ -101,27 +107,14 @@ class MessageCodeActivity : BaseActivity<ActivityMessageCodeBinding>(ActivityMes
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, messageQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
...@@ -3,10 +3,10 @@ package com.base.scanqr.ui.product ...@@ -3,10 +3,10 @@ package com.base.scanqr.ui.product
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Environment
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -14,6 +14,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -14,6 +14,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ProductUIBean import com.base.scanqr.bean.ProductUIBean
import com.base.scanqr.databinding.ActivityProductCodeBinding import com.base.scanqr.databinding.ActivityProductCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -33,7 +34,12 @@ import java.io.File ...@@ -33,7 +34,12 @@ import java.io.File
class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityProductCodeBinding::inflate) { class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityProductCodeBinding::inflate) {
private var productUIBean = ProductUIBean() private var productUIBean = ProductUIBean()
private var tempImage: String = "" private var qrString: String = ""
private var tempImagePath: String = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -51,11 +57,12 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro ...@@ -51,11 +57,12 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro
val data = intent.extras?.getString("data") val data = intent.extras?.getString("data")
data?.let { data?.let {
productUIBean = Gson().fromJson(data, ProductUIBean::class.java) productUIBean = Gson().fromJson(data, ProductUIBean::class.java)
qrString = productUIBean.content
binding.tvContent.text = productUIBean.content binding.tvContent.text = productUIBean.content
} }
Thread { Thread {
val bitmap = generateEAN13Barcode(productUIBean.content, 648, 255) val bitmap = generateEAN13Barcode(qrString, 648, 255)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -63,7 +70,7 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro ...@@ -63,7 +70,7 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (productUIBean.needCreate) { if (productUIBean.needCreate) {
...@@ -96,29 +103,16 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro ...@@ -96,29 +103,16 @@ class ProductCodeActivity : BaseActivity<ActivityProductCodeBinding>(ActivityPro
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, qrString)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(qrString).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
......
package com.base.scanqr.ui.telephone package com.base.scanqr.ui.telephone
import android.Manifest import android.Manifest
import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -11,6 +11,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -11,6 +11,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.TelephoneUIBean import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.databinding.ActivityTelephoneCodeBinding import com.base.scanqr.databinding.ActivityTelephoneCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -28,9 +29,13 @@ import java.io.File ...@@ -28,9 +29,13 @@ import java.io.File
class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(ActivityTelephoneCodeBinding::inflate) { class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(ActivityTelephoneCodeBinding::inflate) {
private var telephoneUIBean = TelephoneUIBean() private var telephoneUIBean = TelephoneUIBean()
private var telQrString = "" private var qrString = ""
private var tempImagePath: String = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
private var tempImage: String = ""
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
val flag = changeLanguage() val flag = changeLanguage()
...@@ -51,11 +56,11 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit ...@@ -51,11 +56,11 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit
data?.let { data?.let {
telephoneUIBean = Gson().fromJson(data, TelephoneUIBean::class.java) telephoneUIBean = Gson().fromJson(data, TelephoneUIBean::class.java)
binding.tvTel.text = telephoneUIBean.tel binding.tvTel.text = telephoneUIBean.tel
qrString = "tel:" + telephoneUIBean.tel
} }
Thread { Thread {
telQrString = "tel:" + telephoneUIBean.tel val bitmap = generateQRCode(qrString, 735, 735, 5)
val bitmap = generateQRCode(telQrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -63,7 +68,7 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit ...@@ -63,7 +68,7 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (telephoneUIBean.needCreate) { if (telephoneUIBean.needCreate) {
...@@ -95,34 +100,21 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit ...@@ -95,34 +100,21 @@ class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(Activit
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, telQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
...@@ -3,18 +3,18 @@ package com.base.scanqr.ui.text ...@@ -3,18 +3,18 @@ package com.base.scanqr.ui.text
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Environment
import android.widget.Toast import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.TextUIBean import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.databinding.ActivityTextCodeBinding import com.base.scanqr.databinding.ActivityTextCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -31,7 +31,11 @@ import java.io.File ...@@ -31,7 +31,11 @@ import java.io.File
class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeBinding::inflate) { class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeBinding::inflate) {
private var textUIBean = TextUIBean() private var textUIBean = TextUIBean()
private var tempImage: String = "" private var tempImagePath: String = ""
private var qrString = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -50,9 +54,10 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -50,9 +54,10 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
data?.let { data?.let {
textUIBean = Gson().fromJson(data, TextUIBean::class.java) textUIBean = Gson().fromJson(data, TextUIBean::class.java)
binding.tvContent.text = textUIBean.content binding.tvContent.text = textUIBean.content
qrString = textUIBean.content
} }
Thread { Thread {
val bitmap = generateQRCode(textUIBean.content, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -60,7 +65,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -60,7 +65,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (textUIBean.needCreate) { if (textUIBean.needCreate) {
...@@ -102,22 +107,9 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -102,22 +107,9 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
......
package com.base.scanqr.ui.vm
import android.content.Context
import android.os.Environment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.base.scanqr.R
import com.base.scanqr.utils.ToastUtils.toast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class QrViewModel : ViewModel() {
fun copyFileToDownloads(context: Context, name: String, copyTempPath: String) = viewModelScope.launch(Dispatchers.IO) {
val appFile = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
context.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = name
if (!name.endsWith(".jpg")) {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
val flag = downFile.createNewFile()
if (flag) {
File(copyTempPath).copyTo(downFile, true)
launch(Dispatchers.Main) {
context.toast("Save to:${appFile.absolutePath}", true)
}
}
}
}
\ No newline at end of file
...@@ -3,7 +3,7 @@ package com.base.scanqr.ui.website ...@@ -3,7 +3,7 @@ package com.base.scanqr.ui.website
import android.os.Environment import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.scanqr.BuildConfig import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -11,6 +11,7 @@ import com.base.scanqr.base.BaseActivity ...@@ -11,6 +11,7 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.WebsiteUIBean import com.base.scanqr.bean.WebsiteUIBean
import com.base.scanqr.databinding.ActivityWebsiteCodeBinding import com.base.scanqr.databinding.ActivityWebsiteCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -27,7 +28,13 @@ import java.io.File ...@@ -27,7 +28,13 @@ import java.io.File
class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWebsiteCodeBinding::inflate) { class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWebsiteCodeBinding::inflate) {
private var websiteUIBean = WebsiteUIBean() private var websiteUIBean = WebsiteUIBean()
private var tempImage: String = "" private var tempImagePath: String = ""
private var qrString = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
val flag = changeLanguage() val flag = changeLanguage()
...@@ -46,10 +53,11 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb ...@@ -46,10 +53,11 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb
data?.let { data?.let {
websiteUIBean = Gson().fromJson(data, WebsiteUIBean::class.java) websiteUIBean = Gson().fromJson(data, WebsiteUIBean::class.java)
binding.tvHttp.text = websiteUIBean.http binding.tvHttp.text = websiteUIBean.http
qrString = websiteUIBean.http
} }
Thread { Thread {
val bitmap = generateQRCode(websiteUIBean.http, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -57,7 +65,7 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb ...@@ -57,7 +65,7 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (websiteUIBean.needCreate) { if (websiteUIBean.needCreate) {
...@@ -89,29 +97,16 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb ...@@ -89,29 +97,16 @@ class WebsiteCodeActivity : BaseActivity<ActivityWebsiteCodeBinding>(ActivityWeb
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
......
...@@ -3,13 +3,16 @@ package com.base.scanqr.ui.wifi ...@@ -3,13 +3,16 @@ package com.base.scanqr.ui.wifi
import android.os.Environment import android.os.Environment
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.FunctionUIBean import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.WifiUIBean import com.base.scanqr.bean.WifiUIBean
import com.base.scanqr.bean.WifiUIBean.Companion.createWifiQRString
import com.base.scanqr.databinding.ActivityWifiCodeBinding import com.base.scanqr.databinding.ActivityWifiCodeBinding
import com.base.scanqr.ui.vm.QrViewModel
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
...@@ -27,8 +30,12 @@ import java.io.File ...@@ -27,8 +30,12 @@ import java.io.File
class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeBinding::inflate) { class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeBinding::inflate) {
private var wifiBean: WifiUIBean = WifiUIBean() private var wifiBean: WifiUIBean = WifiUIBean()
private var wifiQrString: String = "" private var qrString: String = ""
private var tempImage: String = "" private var tempImagePath: String = ""
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[QrViewModel::class.java]
}
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -47,41 +54,26 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -47,41 +54,26 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
LogEx.logDebug(TAG, "data=$data") LogEx.logDebug(TAG, "data=$data")
data?.let { data?.let {
wifiBean = Gson().fromJson(data, WifiUIBean::class.java) wifiBean = Gson().fromJson(data, WifiUIBean::class.java)
} if (wifiBean.securityId == 0) {
binding.tvSecurity.text = "WPA/WPA2"
}
if (wifiBean.securityId == 1) {
binding.tvSecurity.text = "WEP"
}
binding.tvSsid.text = wifiBean.ssid
binding.tvPassword.text = wifiBean.password
if (wifiBean.hidden) {
binding.tvHidden.text = "YES"
} else {
binding.tvHidden.text = "NO"
}
val content = StringBuilder() qrString = createWifiQRString(wifiBean)
content.append("WIFI:") LogEx.logDebug(TAG, "wifiContent=$qrString")
content.append("T:")
if (wifiBean.securityId == 0) {
content.append("WPA/WPA2").append(";")
binding.tvSecurity.text = "WPA/WPA2"
}
if (wifiBean.securityId == 1) {
content.append("WEP").append(";")
binding.tvSecurity.text = "WEP"
}
if (wifiBean.securityId == 2) {
content.append(";")
}
content.append("S:")
content.append(wifiBean.ssid).append(";")
content.append("P:")
content.append(wifiBean.password).append(";")
content.append("H:")
content.append(wifiBean.hidden).append(";")
wifiQrString = content.toString()
LogEx.logDebug(TAG, "wifiContent=$wifiQrString")
binding.tvSsid.text = wifiBean.ssid
binding.tvPassword.text = wifiBean.password
if (wifiBean.hidden) {
binding.tvHidden.text = "YES"
} else {
binding.tvHidden.text = "NO"
} }
Thread { Thread {
val bitmap = generateQRCode(wifiQrString, 735, 735, 5) val bitmap = generateQRCode(qrString, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
...@@ -90,7 +82,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -90,7 +82,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
tempImage = file.absolutePath tempImagePath = file.absolutePath
} }
} }
if (wifiBean.needCreate) { if (wifiBean.needCreate) {
...@@ -124,7 +116,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -124,7 +116,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage) val intent = intentShareImage(this, tempImagePath)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -134,27 +126,14 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -134,27 +126,14 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
kotlin.runCatching { kotlin.runCatching {
val appFile = File( val newName = File(tempImagePath).name
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
this.resources.getString(R.string.app_name)
)
if (!appFile.exists()) appFile.mkdirs()
var newName = File(tempImage).name
showInputNameDialog(newName) { name -> showInputNameDialog(newName) { name ->
if (name.endsWith(".jpg")) { viewModel.copyFileToDownloads(this, name, tempImagePath)
name.also { newName = it }
} else {
newName = "$name.jpg"
}
val downFile = File(appFile, newName)
downFile.createNewFile()
File(tempImage).copyTo(downFile, true)
toast("Save to:${appFile.absolutePath}", true)
} }
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, wifiQrString) copyText(TAG, qrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment