Commit dec60fd7 authored by wanglei's avatar wanglei

...event

parent b27fe8f3
...@@ -97,6 +97,7 @@ dependencies { ...@@ -97,6 +97,7 @@ dependencies {
//第三方UI控件 //第三方UI控件
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4") implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4")
implementation("io.supercharge:shimmerlayout:2.1.0") implementation("io.supercharge:shimmerlayout:2.1.0")
implementation("com.github.Kunzisoft:Android-SwitchDateTimePicker:2.1")
//机器学习二维码扫描 //机器学习二维码扫描
......
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
<uses-feature <uses-feature
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> <!-- 获取wifi列表 --> android:required="false" />
<!-- 获取wifi列表 -->
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
...@@ -12,11 +14,15 @@ ...@@ -12,11 +14,15 @@
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" /> <!-- 前台服务 --> <uses-permission android:name="android.permission.CAMERA" />
<!-- 前台服务 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<application <application
android:name=".MyApplication" android:name=".MyApplication"
android:allowBackup="true" android:allowBackup="true"
...@@ -28,6 +34,9 @@ ...@@ -28,6 +34,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.ScanQR" android:theme="@style/Theme.ScanQR"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".ui.event.EventCodeActivity"
android:exported="false" />
<activity <activity
android:name=".ui.event.EventActivity" android:name=".ui.event.EventActivity"
android:exported="false" /> android:exported="false" />
......
...@@ -107,9 +107,11 @@ class MyApplication : Application() { ...@@ -107,9 +107,11 @@ class MyApplication : Application() {
private fun initGid() { private fun initGid() {
Thread { Thread {
val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext) kotlin.runCatching {
val advertisingId = info.id val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
AppPreferences.getInstance().put("gid", advertisingId) val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
}
}.start() }.start()
} }
......
...@@ -116,11 +116,11 @@ class AdInsertMgr { ...@@ -116,11 +116,11 @@ class AdInsertMgr {
} }
fun loadAd(context: Context, isUnLimit: Boolean, adEvent: AdEvent) { fun loadAd(context: Context, isUnLimit: Boolean, adEvent: AdEvent) {
if (!isUnLimit) { if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) { if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
this.showCallBack?.close(4) this.showCallBack?.close(4)
this.showCallBack = null this.showCallBack = null
adState.onAdLoadFailed()
return return
} }
} }
......
...@@ -119,6 +119,7 @@ class AdOpenMgr { ...@@ -119,6 +119,7 @@ class AdOpenMgr {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) { if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
this.showCallBack?.close() this.showCallBack?.close()
this.showCallBack = null this.showCallBack = null
adState.onAdLoadFailed()
return return
} }
} }
......
package com.base.scanqr.bean package com.base.scanqr.bean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import com.base.scanqr.utils.QRCodeUtils.getPairKeyValue
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
data class EmailUIBean( data class EmailUIBean(
var address: String = "", var address: String = "",
var subject: String = "", var subject: String = "",
var message: String = "" var message: String = ""
): ScanBean(KEY_EMAIL) ) : ScanBean(KEY_EMAIL) {
\ No newline at end of file companion object {
fun createEmailQrString(bean: EmailUIBean): String {
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
val qrContent = StringBuilder()
qrContent.append("MATMSG:")
qrContent.append("TO:").append(bean.address).append(";")
qrContent.append("SUB:").append(bean.subject).append(";")
qrContent.append("BODY:").append(bean.message).append(";")
return qrContent.toString()
}
fun isEmailQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("MATMSG:")
if (flag) {
return true
}
return false
}
fun createEmailBean(qrCodeValue: String): EmailUIBean {
val startTag = "MATMSG:"
val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length)
val splitList = subString.split(";")
val emailUIBean = EmailUIBean()
val addressKV = splitList.find { it.startsWith("TO:") } ?: ""
emailUIBean.address = getPairKeyValue(addressKV).second
val subKV = splitList.find { it.startsWith("SUB:") } ?: ""
emailUIBean.subject = getPairKeyValue(subKV).second
val bodyKV = splitList.find { it.startsWith("BODY:") } ?: ""
emailUIBean.message = getPairKeyValue(bodyKV).second
return emailUIBean
}
}
}
\ No newline at end of file
package com.base.scanqr.bean package com.base.scanqr.bean
import android.annotation.SuppressLint
import org.jacoco.core.internal.flow.IFrame
import java.text.SimpleDateFormat
import java.util.TimeZone
//BEGIN:VEVENT //BEGIN:VEVENT
//SUMMARY:xxx //SUMMARY:xxx
...@@ -9,10 +14,73 @@ package com.base.scanqr.bean ...@@ -9,10 +14,73 @@ package com.base.scanqr.bean
//DESCRIPTION:xxxx //DESCRIPTION:xxxx
//END:VEVENT //END:VEVENT
data class EventUIBean( data class EventUIBean(
val summary: String = "", var summary: String = "",
val dtstart: String = "", var dtstart: String = "",
val dtend: String = "", var dtend: String = "",
val location: String = "", var location: String = "",
val description: String = "" var description: String = ""
) : ScanBean(FunctionUIBean.KEY_EVENT) ) : ScanBean(FunctionUIBean.KEY_EVENT) {
\ No newline at end of file
var startTime: Long = 0
var endTime: Long = 0
companion object {
fun isEventQR(qr: String): Boolean {
if (qr.startsWith("BEGIN:VEVENT") && qr.endsWith("END:VEVENT")) {
return true
}
return false
}
fun createEventQRString(bean: EventUIBean): String {
val sb = StringBuilder()
val start = "BEGIN:VEVENT"
sb.append(start).append("\n")
sb.append("SUMMARY:").append(bean.summary).append("\n")
sb.append("DTSTART:").append(bean.dtstart).append("\n")
sb.append("DTEND:").append(bean.dtend).append("\n")
sb.append("LOCATION:").append(bean.location).append("\n")
sb.append("DESCRIPTION:").append(bean.description).append("\n")
val end = "END:VEVENT"
sb.append(end)
return sb.toString()
}
// DTSTART:20250102T060100
// DTEND:20250103T060100
@SuppressLint("SimpleDateFormat")
fun createEventBean(qr: String): EventUIBean {
val eventUIBean = EventUIBean()
val kvList = qr.split("\n")
kvList.forEach {
val pair = it.split(":")
val key = pair[0]
val value = pair[1]
if (key == "SUMMARY") {
eventUIBean.summary = value
}
if (key == "DTSTART") {
eventUIBean.dtstart = value
}
if (key == "DTEND") {
eventUIBean.dtend = value
}
if (key == "LOCATION") {
eventUIBean.location = value
}
if (key == "DESCRIPTION") {
eventUIBean.description = value
}
}
val format = SimpleDateFormat("yyyyMMdd'T'HHmmss")
format.timeZone = TimeZone.getTimeZone("UTC")
eventUIBean.startTime = format.parse(eventUIBean.dtstart)?.time ?: 0
eventUIBean.endTime = format.parse(eventUIBean.dtend)?.time ?: 0
return eventUIBean
}
}
}
...@@ -2,4 +2,21 @@ package com.base.scanqr.bean ...@@ -2,4 +2,21 @@ package com.base.scanqr.bean
data class WebsiteUIBean( data class WebsiteUIBean(
var http: String = "" var http: String = ""
) : ScanBean(FunctionUIBean.KEY_WEBSITE) ) : ScanBean(FunctionUIBean.KEY_WEBSITE) {
\ No newline at end of file companion object {
fun isWebsiteQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("http://") || qrCodeValue.startsWith("https://")
if (flag) {
return true
}
return false
}
fun createWebsiteBean(qrCodeValue: String): WebsiteUIBean {
val websiteUIBean = WebsiteUIBean()
websiteUIBean.http = qrCodeValue
return websiteUIBean
}
}
}
\ No newline at end of file
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.QRCodeUtils.getPairKeyValue
data class WifiUIBean( data class WifiUIBean(
...@@ -11,4 +12,43 @@ data class WifiUIBean( ...@@ -11,4 +12,43 @@ data class WifiUIBean(
) : ScanBean(KEY_WIFI) { ) : ScanBean(KEY_WIFI) {
var password: String = "" var password: String = ""
var hidden: Boolean = false var hidden: Boolean = false
companion object{
fun isWifiQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("WIFI:")
if (flag) {
return true
}
return false
}
fun createWifiBean(qrCodeValue: String): WifiUIBean {
val startTag = "WIFI:"
val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length)
val splitList = subString.split(";")
val wifiUIBean = WifiUIBean()
val ssidKV = splitList.find { it.startsWith("S:") } ?: ""
wifiUIBean.ssid = getPairKeyValue(ssidKV).second
val passWordKV = splitList.find { it.startsWith("P:") } ?: ""
wifiUIBean.password = getPairKeyValue(passWordKV).second
val hiddenKV = splitList.find { it.startsWith("H:") } ?: ""
wifiUIBean.hidden = getPairKeyValue(hiddenKV).second.toBoolean()
val securityKy = splitList.find { it.startsWith("T") }
if (securityKy.equals("WPA/WPA2")) {
wifiUIBean.securityId = 0
}
if (securityKy.equals("WEP")) {
wifiUIBean.securityId = 1
}
if (securityKy.equals("")) {
wifiUIBean.securityId = 0
}
return wifiUIBean
}
}
} }
\ No newline at end of file
...@@ -8,6 +8,7 @@ import com.base.scanqr.ads.AdsMgr ...@@ -8,6 +8,7 @@ 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.EmailUIBean import com.base.scanqr.bean.EmailUIBean
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.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
...@@ -27,7 +28,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -27,7 +28,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
private var email = EmailUIBean() private var email = EmailUIBean()
private var tempImage: String = "" private var tempImage: String = ""
private var content: String = "" private var emailQrString: String = ""
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
...@@ -49,16 +50,9 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -49,16 +50,9 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
binding.tvSubject.text = email.subject binding.tvSubject.text = email.subject
binding.tvMessage.text = email.message binding.tvMessage.text = email.message
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
val qrContent = StringBuilder()
qrContent.append("MATMSG:")
qrContent.append("TO:").append(email.address).append(";")
qrContent.append("SUB:").append(email.subject).append(";")
qrContent.append("BODY:").append(email.message).append(";")
content = qrContent.toString()
Thread { Thread {
val bitmap = generateQRCode(content, 735, 735, 5) emailQrString = createEmailQrString(email)
val bitmap = generateQRCode(emailQrString, 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")
...@@ -131,7 +125,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -131,7 +125,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, content) copyText(TAG, emailQrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
package com.base.scanqr.ui.event package com.base.scanqr.ui.event
import android.annotation.SuppressLint
import android.content.Intent
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.core.widget.addTextChangedListener
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.ConstObject.appLanguageSp
import com.base.scanqr.bean.EventUIBean import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.databinding.ActivityEventBinding import com.base.scanqr.databinding.ActivityEventBinding
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.ToastUtils.toast
import com.google.gson.Gson
import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment
import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment.OnButtonWithNeutralClickListener
import com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment.SimpleDateMonthAndDayFormatException
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.GregorianCalendar
import java.util.Locale
import java.util.TimeZone
class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::inflate) { class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::inflate) {
private val eventUIBean = EventUIBean() private val eventUIBean = EventUIBean()
private var dateTimeFragment: SwitchDateTimeDialogFragment? = null
private val tagDatetimeFragment: String = "tag_datetime_fragment"
private var startTime = Date(System.currentTimeMillis())
private var endTime = Date(System.currentTimeMillis())
private var setStartOrEnd: Boolean = false//start:true ;end:false
@SuppressLint("SimpleDateFormat")
private val dateTimeFormatter = SimpleDateFormat("yyyyMMdd_HHmmss")
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
super.onResumeOneShoot() super.onResumeOneShoot()
val flag = changeLanguage() val flag = changeLanguage()
...@@ -25,6 +48,81 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i ...@@ -25,6 +48,81 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
super.initView() super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight()) binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item) AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item)
initDateTimeFragment()
}
private fun initDateTimeFragment() {
dateTimeFragment = supportFragmentManager.findFragmentByTag(tagDatetimeFragment) as SwitchDateTimeDialogFragment?
if (dateTimeFragment == null) {
dateTimeFragment = SwitchDateTimeDialogFragment.newInstance(
getString(R.string.datetime),
getString(R.string.ok),
getString(R.string.cancel),
getString(R.string.clean), // Optional
appLanguageSp
)
}
// Optionally define a timezone
dateTimeFragment?.setTimeZone(TimeZone.getDefault())
// Assign unmodifiable values
dateTimeFragment?.set24HoursMode(false)
dateTimeFragment?.setHighlightAMPMSelection(false)
dateTimeFragment?.minimumDateTime = GregorianCalendar(1970, Calendar.JANUARY, 1).time
dateTimeFragment?.maximumDateTime = GregorianCalendar(2200, Calendar.DECEMBER, 30).time
dateTimeFragment?.setAlertStyle(R.style.DateTimeAlert)
// Define new day and month format
// 20241230T072300
try {
dateTimeFragment?.simpleDateMonthAndDayFormat =
SimpleDateFormat("MMMM dd", Locale.getDefault())
} catch (e: SimpleDateMonthAndDayFormatException) {
}
// Set listener for date
// Or use dateTimeFragment.setOnButtonClickListener(new SwitchDateTimeDialogFragment.OnButtonClickListener() {
dateTimeFragment?.setOnButtonClickListener(object : OnButtonWithNeutralClickListener {
override fun onPositiveButtonClick(date: Date) {
val dateTime = dateTimeFormatter.format(startTime).split("_")
val dateTimeS = dateTime[0] + "T" + dateTime[1]
kotlin.runCatching {
LogEx.logDebug(TAG, "dateTimeS=${dateTimeS}")
if (setStartOrEnd) {
binding.tvStartDate.text = createDDMMYYYY(date)
startTime = date
eventUIBean.dtstart = dateTimeS
} else {
endTime = date
if (endTime.before(startTime)) {
this@EventActivity.toast("please choose end time", true)
endTime = Date(System.currentTimeMillis())
return
}
binding.tvEndDate.text = createDDMMYYYY(date)
eventUIBean.dtend = dateTimeS
}
}
}
override fun onNegativeButtonClick(date: Date) {
}
override fun onNeutralButtonClick(date: Date) {
if (setStartOrEnd) {
binding.tvStartDate.text = this@EventActivity.resources.getString(R.string.begin_time)
eventUIBean.dtstart = ""
} else {
binding.tvEndDate.text = this@EventActivity.resources.getString(R.string.end_time)
eventUIBean.dtend = ""
}
}
})
} }
override fun initListener() { override fun initListener() {
...@@ -47,6 +145,68 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i ...@@ -47,6 +145,68 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
binding.flBack.setOnClickListener { binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.editName.addTextChangedListener { s ->
eventUIBean.summary = s.toString()
}
binding.editLocation.addTextChangedListener { s ->
eventUIBean.location = s.toString()
}
binding.editDescription.addTextChangedListener { s ->
eventUIBean.description = s.toString()
}
binding.llBeginTime.setOnClickListener {
val flag = supportFragmentManager.findFragmentByTag(tagDatetimeFragment) != null
if (dateTimeFragment?.isAdded == true && flag) return@setOnClickListener
setStartOrEnd = true
dateTimeFragment?.startAtCalendarView()
dateTimeFragment?.setDefaultDateTime(startTime)
dateTimeFragment?.show(supportFragmentManager, tagDatetimeFragment)
}
binding.llEndTime.setOnClickListener {
val flag = supportFragmentManager.findFragmentByTag(tagDatetimeFragment) != null
if (dateTimeFragment?.isAdded == true && flag) return@setOnClickListener
setStartOrEnd = false
dateTimeFragment?.startAtCalendarView()
dateTimeFragment?.setDefaultDateTime(endTime)
dateTimeFragment?.show(supportFragmentManager, tagDatetimeFragment)
}
binding.flQueren.setOnClickListener {
if (eventUIBean.summary.isEmpty()) {
toast("Enter title event", true)
return@setOnClickListener
}
if (eventUIBean.location.isEmpty()) {
toast("Enter location event", true)
return@setOnClickListener
}
if (eventUIBean.description.isEmpty()) {
toast("Enter description event", true)
return@setOnClickListener
}
if (eventUIBean.dtstart.isEmpty()) {
toast("Please choose begin Time", true)
return@setOnClickListener
}
if (eventUIBean.dtend.isEmpty()) {
toast("Please choose end Time", true)
return@setOnClickListener
}
startActivity(Intent(this, EventCodeActivity::class.java).apply {
eventUIBean.startTime = startTime.time
eventUIBean.endTime = endTime.time
putExtra("data", Gson().toJson(eventUIBean))
})
finish()
}
}
fun createDDMMYYYY(date: Date): String {
val format = SimpleDateFormat("dd/MMMM/yyyy", Locale.ENGLISH)
return format.format(date)
} }
} }
\ No newline at end of file
package com.base.scanqr.ui.event
import android.Manifest
import android.annotation.SuppressLint
import android.os.Environment
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.databinding.ActivityEventCodeBinding
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
import com.base.scanqr.utils.ClipboardUtils.copyText
import com.base.scanqr.utils.IntentUtils.intentAddCalendar
import com.base.scanqr.utils.IntentUtils.intentShareImage
import com.base.scanqr.utils.KotlinExt.toFormatTime5
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.QRCodeUtils.generateQRCode
import com.base.scanqr.utils.SpJsonUtils
import com.base.scanqr.utils.ToastUtils.toast
import com.google.gson.Gson
import java.io.File
class EventCodeActivity : BaseActivity<ActivityEventCodeBinding>(ActivityEventCodeBinding::inflate) {
private var eventUIBean = EventUIBean()
private var tempImage: String = ""
private var eventQrString = ""
override fun onResumeOneShoot() {
super.onResumeOneShoot()
val flag = changeLanguage()
if (flag) return
AdsMgr.showBanner(binding.flBanner, false)
}
@SuppressLint("SetTextI18n")
override fun initView() {
super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
launcher.launch(arrayOf(Manifest.permission.WRITE_CALENDAR)) {}
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item)
val data = intent.extras?.getString("data")
data?.let {
eventUIBean = Gson().fromJson(data, EventUIBean::class.java)
binding.tvDateTime.text = eventUIBean.startTime.toFormatTime5() + " - " + eventUIBean.endTime.toFormatTime5()
binding.tvLocation.text = eventUIBean.location
binding.tvDesc.text = eventUIBean.description
}
Thread {
eventQrString = EventUIBean.createEventQRString(eventUIBean)
LogEx.logDebug(TAG, "eventQrString=$eventQrString")
val bitmap = generateQRCode(eventQrString, 735, 735, 5)
runOnUiThread {
binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
bitmap?.let {
val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) {
tempImage = file.absolutePath
}
}
if (eventUIBean.needCreate) {
eventUIBean.needCreate = false
SpJsonUtils.addJsonBean<EventUIBean>(FunctionUIBean.KEY_EVENT, eventUIBean)
}
}
}.start()
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
AdsMgr.showInsert(this@EventCodeActivity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
finishToMainTop()
}
override fun failed(where: Int) {
finishToMainTop()
}
override fun googleFailed(where: Int) {
finishToMainTop()
}
})
}
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.llShare.setOnClickListener {
val intent = intentShareImage(this, tempImage)
runCatching {
startActivity(intent)
}
}
binding.llPdf.setOnClickListener {
toast("没实现")
}
binding.llDownload.setOnClickListener {
kotlin.runCatching {
val appFile = File(
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 ->
if (name.endsWith(".jpg")) {
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 {
copyText(TAG, eventQrString)
toast("Copied to clipboard", true)
}
binding.flSearch.setOnClickListener {
val intent = intentAddCalendar(eventUIBean)
try {
startActivity(intent)
finish()
} catch (e: Exception) {
toast("No application was found to handle the calendar event request", true)
}
}
}
}
\ No newline at end of file
...@@ -7,6 +7,7 @@ import com.base.scanqr.R ...@@ -7,6 +7,7 @@ import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.bean.AdScanBean import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EVENT import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EVENT
...@@ -77,7 +78,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() { ...@@ -77,7 +78,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
} }
KEY_EVENT -> { KEY_EVENT -> {
if (item is EventUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_event)
}
} }
KEY_CONTACT -> { KEY_CONTACT -> {
......
...@@ -13,6 +13,7 @@ import com.base.scanqr.bean.FunctionUIBean ...@@ -13,6 +13,7 @@ import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ScanBean import com.base.scanqr.bean.ScanBean
import com.base.scanqr.databinding.FragmentHistoryBinding import com.base.scanqr.databinding.FragmentHistoryBinding
import com.base.scanqr.ui.email.EmailCodeActivity import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity import com.base.scanqr.ui.website.WebsiteCodeActivity
...@@ -99,6 +100,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind ...@@ -99,6 +100,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra("data", Gson().toJson(item)) putExtra("data", Gson().toJson(item))
}) })
} }
FunctionUIBean.KEY_EVENT -> {
activity?.startActivity(Intent(activity, EventCodeActivity::class.java).apply {
putExtra("data", Gson().toJson(item))
})
}
} }
} }
......
...@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel ...@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.base.scanqr.bean.AdScanBean import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
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.bean.ScanBean import com.base.scanqr.bean.ScanBean
...@@ -37,12 +38,15 @@ class HistoryViewModel() : ViewModel() { ...@@ -37,12 +38,15 @@ class HistoryViewModel() : ViewModel() {
websiteList.forEach { it.listContent = it.http } websiteList.forEach { it.listContent = it.http }
val productList = SpJsonUtils.getSpJsonList<ProductUIBean>(FunctionUIBean.KEY_PRODUCT) val productList = SpJsonUtils.getSpJsonList<ProductUIBean>(FunctionUIBean.KEY_PRODUCT)
productList.forEach { it.listContent = it.content } productList.forEach { it.listContent = it.content }
val eventList = SpJsonUtils.getSpJsonList<EventUIBean>(FunctionUIBean.KEY_EVENT)
eventList.forEach { it.listContent = it.summary }
historyList.addAll(wifiList) historyList.addAll(wifiList)
historyList.addAll(textList) historyList.addAll(textList)
historyList.addAll(emailList) historyList.addAll(emailList)
historyList.addAll(websiteList) historyList.addAll(websiteList)
historyList.addAll(productList) historyList.addAll(productList)
historyList.addAll(eventList)
historyList.forEach { historyList.forEach {
LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}") LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}")
...@@ -92,7 +96,11 @@ class HistoryViewModel() : ViewModel() { ...@@ -92,7 +96,11 @@ class HistoryViewModel() : ViewModel() {
it1.createTime == it2.createTime it1.createTime == it2.createTime
}) })
} }
FunctionUIBean.KEY_EVENT ->{
SpJsonUtils.removeJsonBean<EventUIBean>(bean.scanType, bean as EventUIBean, removeIf = { it1, it2 ->
it1.createTime == it2.createTime
})
}
} }
historyList.remove(bean) historyList.remove(bean)
......
...@@ -13,12 +13,21 @@ import com.base.scanqr.R ...@@ -13,12 +13,21 @@ 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.BaseFragment import com.base.scanqr.base.BaseFragment
import com.base.scanqr.bean.EmailUIBean.Companion.createEmailBean
import com.base.scanqr.bean.EmailUIBean.Companion.isEmailQR
import com.base.scanqr.bean.EventUIBean.Companion.createEventBean
import com.base.scanqr.bean.EventUIBean.Companion.isEventQR
import com.base.scanqr.bean.ProductUIBean import com.base.scanqr.bean.ProductUIBean
import com.base.scanqr.bean.ScanBean.Companion.CREATE_TYPE_SCAN import com.base.scanqr.bean.ScanBean.Companion.CREATE_TYPE_SCAN
import com.base.scanqr.bean.TextUIBean import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.bean.WebsiteUIBean.Companion.createWebsiteBean
import com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR
import com.base.scanqr.bean.WifiUIBean.Companion.createWifiBean
import com.base.scanqr.bean.WifiUIBean.Companion.isWifiQR
import com.base.scanqr.databinding.FragmentScanBinding import com.base.scanqr.databinding.FragmentScanBinding
import com.base.scanqr.qr.QRImageAnalyzer import com.base.scanqr.qr.QRImageAnalyzer
import com.base.scanqr.ui.email.EmailCodeActivity import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity import com.base.scanqr.ui.website.WebsiteCodeActivity
...@@ -135,8 +144,26 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -135,8 +144,26 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}) })
return return
} }
if (isEventQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
jumpEventCodeActivity(activity, qrCodeValue)
}
override fun failed(where: Int) {
jumpEventCodeActivity(activity, qrCodeValue)
}
override fun googleFailed(where: Int) {
jumpEventCodeActivity(activity, qrCodeValue)
}
})
return
}
if (QRCodeUtils.isWifiQR(qrCodeValue)) { if (isWifiQR(qrCodeValue)) {
if (scanJump.get()) return if (scanJump.get()) return
scanJump.set(true) scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() { AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
...@@ -155,7 +182,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -155,7 +182,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return return
} }
if (QRCodeUtils.isEmailQR(qrCodeValue)) { if (isEmailQR(qrCodeValue)) {
if (scanJump.get()) return if (scanJump.get()) return
scanJump.set(true) scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() { AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
...@@ -174,7 +201,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -174,7 +201,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return return
} }
if (QRCodeUtils.isWebsiteQR(qrCodeValue)) { if (isWebsiteQR(qrCodeValue)) {
if (scanJump.get()) return if (scanJump.get()) return
scanJump.set(true) scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() { AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
...@@ -216,6 +243,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -216,6 +243,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
} }
} }
private fun jumpEventCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, EventCodeActivity::class.java).apply {
val bean = createEventBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
})
}
private fun jumpTextCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpTextCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, TextCodeActivity::class.java).apply { activity.startActivity(Intent(activity, TextCodeActivity::class.java).apply {
val bean = TextUIBean() val bean = TextUIBean()
...@@ -228,7 +264,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -228,7 +264,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpWebsiteCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpWebsiteCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, WebsiteCodeActivity::class.java).apply { activity.startActivity(Intent(activity, WebsiteCodeActivity::class.java).apply {
val bean = QRCodeUtils.createWebsiteBean(qrCodeValue) val bean = createWebsiteBean(qrCodeValue)
bean.needCreate = true bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean)) putExtra("data", Gson().toJson(bean))
...@@ -237,7 +273,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -237,7 +273,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpEmailCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpEmailCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, EmailCodeActivity::class.java).apply { activity.startActivity(Intent(activity, EmailCodeActivity::class.java).apply {
val bean = QRCodeUtils.createEmailBean(qrCodeValue) val bean = createEmailBean(qrCodeValue)
bean.needCreate = true bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean)) putExtra("data", Gson().toJson(bean))
...@@ -246,7 +282,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -246,7 +282,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpWifiCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpWifiCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, WifiCodeActivity::class.java).apply { activity.startActivity(Intent(activity, WifiCodeActivity::class.java).apply {
val bean = QRCodeUtils.createWifiBean(qrCodeValue) val bean = createWifiBean(qrCodeValue)
bean.needCreate = true bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean)) putExtra("data", Gson().toJson(bean))
......
...@@ -20,6 +20,7 @@ import com.base.scanqr.databinding.ActivityStartBinding ...@@ -20,6 +20,7 @@ import com.base.scanqr.databinding.ActivityStartBinding
import com.base.scanqr.fcm.notification.NotificationHoverUtils import com.base.scanqr.fcm.notification.NotificationHoverUtils
import com.base.scanqr.service.StayJobService.Companion.startJob import com.base.scanqr.service.StayJobService.Companion.startJob
import com.base.scanqr.ui.email.EmailActivity import com.base.scanqr.ui.email.EmailActivity
import com.base.scanqr.ui.event.EventActivity
import com.base.scanqr.ui.language.LanguageActivity import com.base.scanqr.ui.language.LanguageActivity
import com.base.scanqr.ui.main.MainActivity import com.base.scanqr.ui.main.MainActivity
import com.base.scanqr.ui.text.TextActivity import com.base.scanqr.ui.text.TextActivity
...@@ -43,6 +44,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i ...@@ -43,6 +44,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() { override fun initView() {
super.initView() super.initView()
startActivity(Intent(this, EventActivity::class.java))
finish()
return
NotificationHoverUtils.stopNotificationHandler() NotificationHoverUtils.stopNotificationHandler()
if (ConstObject.ifAgreePrivacy) { if (ConstObject.ifAgreePrivacy) {
......
package com.base.scanqr.ui.widget
import android.app.AlertDialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import com.base.scanqr.databinding.DialogDateTimeBinding
object DateTimeDialog {
fun Context.showDateTimeDialog() {
val dialog = AlertDialog.Builder(this).create()
val binding = DialogDateTimeBinding.inflate(LayoutInflater.from(this))
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val params = dialog.window?.attributes
// params?.width = resources.getDimensionPixelOffset(R.dimen.dp_320)
// params?.height = resources.getDimensionPixelOffset(R.dimen.dp_400)
params?.gravity = Gravity.CENTER
// params?.y = 50
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
}
}
\ No newline at end of file
...@@ -27,7 +27,7 @@ import java.io.File ...@@ -27,7 +27,7 @@ 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 wifiContent: String = "" private var wifiQrString: String = ""
private var tempImage: String = "" private var tempImage: String = ""
override fun onResumeOneShoot() { override fun onResumeOneShoot() {
...@@ -70,8 +70,8 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -70,8 +70,8 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
content.append("H:") content.append("H:")
content.append(wifiBean.hidden).append(";") content.append(wifiBean.hidden).append(";")
wifiContent = content.toString() wifiQrString = content.toString()
LogEx.logDebug(TAG, "wifiContent=$wifiContent") LogEx.logDebug(TAG, "wifiContent=$wifiQrString")
binding.tvSsid.text = wifiBean.ssid binding.tvSsid.text = wifiBean.ssid
binding.tvPassword.text = wifiBean.password binding.tvPassword.text = wifiBean.password
...@@ -81,7 +81,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -81,7 +81,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
binding.tvHidden.text = "NO" binding.tvHidden.text = "NO"
} }
Thread { Thread {
val bitmap = generateQRCode(wifiContent, 735, 735, 5) val bitmap = generateQRCode(wifiQrString, 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")
...@@ -154,7 +154,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -154,7 +154,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, wifiContent) copyText(TAG, wifiQrString)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
...@@ -4,10 +4,15 @@ import android.content.Context ...@@ -4,10 +4,15 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.provider.CalendarContract
import android.provider.Settings import android.provider.Settings
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import java.io.File import java.io.File
import java.util.GregorianCalendar
import java.util.TimeZone
object IntentUtils { object IntentUtils {
...@@ -83,4 +88,29 @@ object IntentUtils { ...@@ -83,4 +88,29 @@ object IntentUtils {
intent.setData(Uri.parse(url)) intent.setData(Uri.parse(url))
return intent return intent
} }
fun intentAddCalendar(eventUIBean: EventUIBean): Intent {
val intent = Intent(Intent.ACTION_INSERT)
intent.setData(CalendarContract.Events.CONTENT_URI)
// 设置事件标题
intent.putExtra(CalendarContract.Events.TITLE, eventUIBean.summary)
val startCalendar = GregorianCalendar()
startCalendar.timeInMillis = eventUIBean.startTime
startCalendar.setTimeZone(TimeZone.getTimeZone("UTC")) // 设置时区为UTC
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startCalendar.timeInMillis)
val endCalendar = GregorianCalendar()
endCalendar.timeInMillis = eventUIBean.endTime
endCalendar.setTimeZone(TimeZone.getTimeZone("UTC")) // 设置时区为UTC
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endCalendar.timeInMillis)
intent.putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
intent.putExtra(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().id)
// 设置事件描述(可选)
intent.putExtra(CalendarContract.Events.DESCRIPTION, eventUIBean.description)
// 设置事件地点
intent.putExtra(CalendarContract.Events.EVENT_LOCATION, eventUIBean.location)
return intent
}
} }
\ No newline at end of file
...@@ -41,6 +41,10 @@ object KotlinExt { ...@@ -41,6 +41,10 @@ object KotlinExt {
return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).format(this) return SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).format(this)
} }
fun Long.toFormatTime5(): String {
return SimpleDateFormat("hh:mm a, yyyy.M.dd", Locale.ENGLISH).format(this)
}
fun Long.toFormatMinute(): String { fun Long.toFormatMinute(): String {
return SimpleDateFormat("mm", Locale.ENGLISH).format(this) return SimpleDateFormat("mm", Locale.ENGLISH).format(this)
} }
......
...@@ -98,7 +98,7 @@ object QRCodeUtils { ...@@ -98,7 +98,7 @@ object QRCodeUtils {
} }
} }
private fun getPairKeyValue(keyValue: String): Pair<String, String> { fun getPairKeyValue(keyValue: String): Pair<String, String> {
val split = keyValue.split(":") val split = keyValue.split(":")
var key = "" var key = ""
kotlin.runCatching { kotlin.runCatching {
...@@ -111,85 +111,4 @@ object QRCodeUtils { ...@@ -111,85 +111,4 @@ object QRCodeUtils {
return Pair(key, value) return Pair(key, value)
} }
fun isWifiQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("WIFI:")
if (flag) {
return true
}
return false
}
fun createWifiBean(qrCodeValue: String): WifiUIBean {
val startTag = "WIFI:"
val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length)
LogEx.logDebug(TAG, "subString=$subString")
val splitList = subString.split(";")
val wifiUIBean = WifiUIBean()
val ssidKV = splitList.find { it.startsWith("S:") } ?: ""
wifiUIBean.ssid = getPairKeyValue(ssidKV).second
val passWordKV = splitList.find { it.startsWith("P:") } ?: ""
wifiUIBean.password = getPairKeyValue(passWordKV).second
val hiddenKV = splitList.find { it.startsWith("H:") } ?: ""
wifiUIBean.hidden = getPairKeyValue(hiddenKV).second.toBoolean()
val securityKy = splitList.find { it.startsWith("T") }
if (securityKy.equals("WPA/WPA2")) {
wifiUIBean.securityId = 0
}
if (securityKy.equals("WEP")) {
wifiUIBean.securityId = 1
}
if (securityKy.equals("")) {
wifiUIBean.securityId = 0
}
return wifiUIBean
}
fun isEmailQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("MATMSG:")
if (flag) {
return true
}
return false
}
//MATMSG:TO:179621228@qq.com;SUB:王雷;BODY:记得记得就觉得;
fun createEmailBean(qrCodeValue: String): EmailUIBean {
val startTag = "MATMSG:"
val subString = qrCodeValue.subSequence(startTag.length, qrCodeValue.length)
LogEx.logDebug(TAG, "subString=$subString")
val splitList = subString.split(";")
val emailUIBean = EmailUIBean()
val addressKV = splitList.find { it.startsWith("TO:") } ?: ""
emailUIBean.address = getPairKeyValue(addressKV).second
val subKV = splitList.find { it.startsWith("SUB:") } ?: ""
emailUIBean.subject = getPairKeyValue(subKV).second
val bodyKV = splitList.find { it.startsWith("BODY:") } ?: ""
emailUIBean.message = getPairKeyValue(bodyKV).second
return emailUIBean
}
fun isWebsiteQR(qrCodeValue: String): Boolean {
val flag = qrCodeValue.startsWith("http://") || qrCodeValue.startsWith("https://")
if (flag) {
return true
}
return false
}
fun createWebsiteBean(qrCodeValue: String): WebsiteUIBean {
val websiteUIBean = WebsiteUIBean()
websiteUIBean.http = qrCodeValue
return websiteUIBean
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
</selector>
\ No newline at end of file
...@@ -104,7 +104,7 @@ ...@@ -104,7 +104,7 @@
android:textSize="16sp" /> android:textSize="16sp" />
<EditText <EditText
android:id="@+id/edit_subject" android:id="@+id/editLocation"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="52dp" android:layout_height="52dp"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
...@@ -134,7 +134,7 @@ ...@@ -134,7 +134,7 @@
</FrameLayout> </FrameLayout>
<EditText <EditText
android:id="@+id/edit_message" android:id="@+id/editDescription"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="92dp" android:layout_height="92dp"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
...@@ -182,6 +182,7 @@ ...@@ -182,6 +182,7 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/tvStartDate"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
...@@ -224,6 +225,7 @@ ...@@ -224,6 +225,7 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/tvEndDate"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
......
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="0dp"
app:cardCornerRadius="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="138dp"
android:background="#6473F8">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="16dp"
android:text="@string/datetime"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/llTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="10dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="25sp"
android:textStyle="bold"
tools:text="2:59" />
<TextView
android:id="@+id/tvAmPm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:textColor="@color/white"
android:textSize="14sp"
android:textStyle="bold"
tools:text="AM" />
</LinearLayout>
<ImageView
android:id="@+id/ivChange"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:src="@mipmap/icondatetime"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="10dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<TextView
android:id="@+id/tvYear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:textColor="@color/white"
android:textSize="21sp"
android:textStyle="bold"
tools:text="2025" />
<TextView
android:id="@+id/tvMD"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textColor="@color/white"
android:textSize="21sp"
android:textStyle="bold"
tools:text="December 19" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="560dp">
<DatePicker
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
...@@ -81,7 +81,6 @@ ...@@ -81,7 +81,6 @@
<string name="rate_now">Rate now</string> <string name="rate_now">Rate now</string>
<string name="event_name">Event name</string> <string name="event_name">Event name</string>
<string name="enter_your_event_location">Enter your event location</string> <string name="enter_your_event_location">Enter your event location</string>
<string name="enter_your_event_name">Enter event name</string> <string name="enter_your_event_name">Enter event name</string>
...@@ -89,5 +88,8 @@ ...@@ -89,5 +88,8 @@
<string name="let_people_know_more_about_the_event">Let people know more about the event</string> <string name="let_people_know_more_about_the_event">Let people know more about the event</string>
<string name="begin_time">Begin Time</string> <string name="begin_time">Begin Time</string>
<string name="end_time">End Time</string> <string name="end_time">End Time</string>
<string name="datetime">DateTime</string>
<string name="clean">Clean</string>
<string name="ok">OK</string>
</resources> </resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Base.Theme.ScanQR" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Base.Theme.ScanQR" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style> </style>
<style name="Theme.ScanQR" parent="Base.Theme.ScanQR" /> <style name="Theme.ScanQR" parent="Base.Theme.ScanQR" />
...@@ -11,4 +10,63 @@ ...@@ -11,4 +10,63 @@
<item name="android:windowBackground">@drawable/splash_bp</item> <item name="android:windowBackground">@drawable/splash_bp</item>
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
</style> </style>
<style name="Theme.SwitchDateTime" parent="Theme.MaterialComponents.Light.DarkActionBar">
<item name="colorPrimary">#3944FF</item>
<item name="colorPrimaryDark">#FFAF00</item>
<item name="android:textColorPrimaryInverse">#FF1629</item>
<!-- 设置为白色 -->
<item name="android:textColorSecondaryInverse">#5AFF21</item>
</style>
<!--日历圆圈背景-->
<style name="Theme.SwitchDateTime.Date">
<item name="mcv_selectionColor">#6473F8</item>
</style>
<!--标题头的背景-->
<style name="Theme.SwitchDateTime.HeaderBackground">
<item name="android:background">#6473F8</item>
</style>
<style name="Theme.SwitchDateTime.Time">
<!-- 大圆背景-->
<item name="timeCircleColor">#E1E1E1</item>
<!-- 时针中心点颜色-->
<item name="timeCenterColor">#6473F8</item>
<!--时针选择器的颜色-->
<item name="timeSelectorColor">#6473F8</item>
<!--时针数字颜色-->
<item name="timeCircularNumbersColor">@color/black</item>
<!--am pm文本的颜色-->
<item name="timeAmPmTextColor">@color/black</item>
<!--am pm 未选中的颜色-->
<item name="timeAmPmBackgroundColor">#00FFFFFF</item>
<!--am pm 选中的颜色-->
<item name="timeAmPmSelectBackgroundColor">#6473F8</item>
</style>
<!--日期时间弹窗样式-->
<style name="DateTimeAlert" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="buttonBarPositiveButtonStyle">@style/accessPositiveBtnStyle</item>
<item name="buttonBarNegativeButtonStyle">@style/accessNegativeBtnStyle</item>
<item name="buttonBarNeutralButtonStyle">@style/accessNeutralButtonStyle</item>
</style>
<style name="accessPositiveBtnStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">#6473F8</item>
</style>
<style name="accessNegativeBtnStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">#6473F8</item>
</style>
<style name="accessNeutralButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">#6473F8</item>
</style>
</resources> </resources>
\ No newline at end of file
...@@ -14,6 +14,8 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 ...@@ -14,6 +14,8 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# AndroidX package structure to make it clearer which packages are bundled with the # AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK # Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn # https://developer.android.com/topic/libraries/support-library/androidx-rn
#Jetifier ??:??????????? Support Library ???????? androidx ???
android.enableJetifier=true
android.useAndroidX=true android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official
......
...@@ -19,6 +19,7 @@ vungle = "7.4.2.0" ...@@ -19,6 +19,7 @@ vungle = "7.4.2.0"
facebook = "6.18.0.0" facebook = "6.18.0.0"
mintegral = "16.8.61.0" mintegral = "16.8.61.0"
pangle = "6.3.0.4.0" pangle = "6.3.0.4.0"
protoliteWellKnownTypes = "18.0.0"
[libraries] [libraries]
...@@ -48,6 +49,7 @@ applovin_vungle = { group = "com.applovin.mediation", name = "vungle-adapter", v ...@@ -48,6 +49,7 @@ applovin_vungle = { group = "com.applovin.mediation", name = "vungle-adapter", v
applovin_facebook = { group = "com.applovin.mediation", name = "facebook-adapter", version.ref = "facebook" } applovin_facebook = { group = "com.applovin.mediation", name = "facebook-adapter", version.ref = "facebook" }
applovin_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" } applovin_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" }
applovin_pangle = { group = "com.applovin.mediation", name = "bytedance-adapter", version.ref = "pangle" } applovin_pangle = { group = "com.applovin.mediation", name = "bytedance-adapter", version.ref = "pangle" }
protolite-well-known-types = { group = "com.google.firebase", name = "protolite-well-known-types", version.ref = "protoliteWellKnownTypes" }
......
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