Commit dec60fd7 authored by wanglei's avatar wanglei

...event

parent b27fe8f3
......@@ -97,6 +97,7 @@ dependencies {
//第三方UI控件
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4")
implementation("io.supercharge:shimmerlayout:2.1.0")
implementation("com.github.Kunzisoft:Android-SwitchDateTimePicker:2.1")
//机器学习二维码扫描
......
......@@ -4,7 +4,9 @@
<uses-feature
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.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
......@@ -12,11 +14,15 @@
<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_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_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<application
android:name=".MyApplication"
android:allowBackup="true"
......@@ -28,6 +34,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.ScanQR"
tools:targetApi="31">
<activity
android:name=".ui.event.EventCodeActivity"
android:exported="false" />
<activity
android:name=".ui.event.EventActivity"
android:exported="false" />
......
......@@ -107,9 +107,11 @@ class MyApplication : Application() {
private fun initGid() {
Thread {
val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
kotlin.runCatching {
val info: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
}
}.start()
}
......
......@@ -116,11 +116,11 @@ class AdInsertMgr {
}
fun loadAd(context: Context, isUnLimit: Boolean, adEvent: AdEvent) {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
......
......@@ -119,6 +119,7 @@ class AdOpenMgr {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
this.showCallBack?.close()
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
......
package com.base.scanqr.bean
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(
var address: String = "",
var subject: String = "",
var message: String = ""
): ScanBean(KEY_EMAIL)
\ No newline at end of file
) : ScanBean(KEY_EMAIL) {
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
import android.annotation.SuppressLint
import org.jacoco.core.internal.flow.IFrame
import java.text.SimpleDateFormat
import java.util.TimeZone
//BEGIN:VEVENT
//SUMMARY:xxx
......@@ -9,10 +14,73 @@ package com.base.scanqr.bean
//DESCRIPTION:xxxx
//END:VEVENT
data class EventUIBean(
val summary: String = "",
val dtstart: String = "",
val dtend: String = "",
val location: String = "",
val description: String = ""
) : ScanBean(FunctionUIBean.KEY_EVENT)
\ No newline at end of file
var summary: String = "",
var dtstart: String = "",
var dtend: String = "",
var location: String = "",
var description: String = ""
) : ScanBean(FunctionUIBean.KEY_EVENT) {
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
data class WebsiteUIBean(
var http: String = ""
) : ScanBean(FunctionUIBean.KEY_WEBSITE)
\ No newline at end of file
) : ScanBean(FunctionUIBean.KEY_WEBSITE) {
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
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import com.base.scanqr.utils.QRCodeUtils.getPairKeyValue
data class WifiUIBean(
......@@ -11,4 +12,43 @@ data class WifiUIBean(
) : ScanBean(KEY_WIFI) {
var password: String = ""
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
import com.base.scanqr.ads.AdsShowCallBack
import com.base.scanqr.base.BaseActivity
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.databinding.ActivityEmailCodeBinding
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
......@@ -27,7 +28,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
private var email = EmailUIBean()
private var tempImage: String = ""
private var content: String = ""
private var emailQrString: String = ""
override fun onResumeOneShoot() {
super.onResumeOneShoot()
......@@ -49,16 +50,9 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
binding.tvSubject.text = email.subject
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 {
val bitmap = generateQRCode(content, 735, 735, 5)
emailQrString = createEmailQrString(email)
val bitmap = generateQRCode(emailQrString, 735, 735, 5)
runOnUiThread {
binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
......@@ -131,7 +125,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
}
}
binding.llCopy.setOnClickListener {
copyText(TAG, content)
copyText(TAG, emailQrString)
toast("Copied to clipboard", true)
}
binding.flSearch.setOnClickListener {
......
package com.base.scanqr.ui.event
import android.annotation.SuppressLint
import android.content.Intent
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.core.widget.addTextChangedListener
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.ConstObject.appLanguageSp
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.databinding.ActivityEventBinding
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) {
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() {
super.onResumeOneShoot()
val flag = changeLanguage()
......@@ -25,6 +48,81 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
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() {
......@@ -47,6 +145,68 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
binding.flBack.setOnClickListener {
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
import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.bean.AdScanBean
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_EMAIL
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EVENT
......@@ -77,7 +78,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
}
KEY_EVENT -> {
if (item is EventUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_event)
}
}
KEY_CONTACT -> {
......
......@@ -13,6 +13,7 @@ import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.databinding.FragmentHistoryBinding
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.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity
......@@ -99,6 +100,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
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
import androidx.lifecycle.viewModelScope
import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ProductUIBean
import com.base.scanqr.bean.ScanBean
......@@ -37,12 +38,15 @@ class HistoryViewModel() : ViewModel() {
websiteList.forEach { it.listContent = it.http }
val productList = SpJsonUtils.getSpJsonList<ProductUIBean>(FunctionUIBean.KEY_PRODUCT)
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(textList)
historyList.addAll(emailList)
historyList.addAll(websiteList)
historyList.addAll(productList)
historyList.addAll(eventList)
historyList.forEach {
LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}")
......@@ -92,7 +96,11 @@ class HistoryViewModel() : ViewModel() {
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)
......
......@@ -13,12 +13,21 @@ import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack
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.ScanBean.Companion.CREATE_TYPE_SCAN
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.qr.QRImageAnalyzer
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.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity
......@@ -135,8 +144,26 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
})
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
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
......@@ -155,7 +182,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return
}
if (QRCodeUtils.isEmailQR(qrCodeValue)) {
if (isEmailQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
......@@ -174,7 +201,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return
}
if (QRCodeUtils.isWebsiteQR(qrCodeValue)) {
if (isWebsiteQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
......@@ -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) {
activity.startActivity(Intent(activity, TextCodeActivity::class.java).apply {
val bean = TextUIBean()
......@@ -228,7 +264,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpWebsiteCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, WebsiteCodeActivity::class.java).apply {
val bean = QRCodeUtils.createWebsiteBean(qrCodeValue)
val bean = createWebsiteBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
......@@ -237,7 +273,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpEmailCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, EmailCodeActivity::class.java).apply {
val bean = QRCodeUtils.createEmailBean(qrCodeValue)
val bean = createEmailBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
......@@ -246,7 +282,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private fun jumpWifiCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, WifiCodeActivity::class.java).apply {
val bean = QRCodeUtils.createWifiBean(qrCodeValue)
val bean = createWifiBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
......
......@@ -20,6 +20,7 @@ import com.base.scanqr.databinding.ActivityStartBinding
import com.base.scanqr.fcm.notification.NotificationHoverUtils
import com.base.scanqr.service.StayJobService.Companion.startJob
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.main.MainActivity
import com.base.scanqr.ui.text.TextActivity
......@@ -43,6 +44,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() {
super.initView()
startActivity(Intent(this, EventActivity::class.java))
finish()
return
NotificationHoverUtils.stopNotificationHandler()
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
class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeBinding::inflate) {
private var wifiBean: WifiUIBean = WifiUIBean()
private var wifiContent: String = ""
private var wifiQrString: String = ""
private var tempImage: String = ""
override fun onResumeOneShoot() {
......@@ -70,8 +70,8 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
content.append("H:")
content.append(wifiBean.hidden).append(";")
wifiContent = content.toString()
LogEx.logDebug(TAG, "wifiContent=$wifiContent")
wifiQrString = content.toString()
LogEx.logDebug(TAG, "wifiContent=$wifiQrString")
binding.tvSsid.text = wifiBean.ssid
binding.tvPassword.text = wifiBean.password
......@@ -81,7 +81,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
binding.tvHidden.text = "NO"
}
Thread {
val bitmap = generateQRCode(wifiContent, 735, 735, 5)
val bitmap = generateQRCode(wifiQrString, 735, 735, 5)
runOnUiThread {
binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
......@@ -154,7 +154,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
}
}
binding.llCopy.setOnClickListener {
copyText(TAG, wifiContent)
copyText(TAG, wifiQrString)
toast("Copied to clipboard", true)
}
binding.flSearch.setOnClickListener {
......
......@@ -4,10 +4,15 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.CalendarContract
import android.provider.Settings
import androidx.core.content.FileProvider
import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import java.io.File
import java.util.GregorianCalendar
import java.util.TimeZone
object IntentUtils {
......@@ -83,4 +88,29 @@ object IntentUtils {
intent.setData(Uri.parse(url))
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 {
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 {
return SimpleDateFormat("mm", Locale.ENGLISH).format(this)
}
......
......@@ -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(":")
var key = ""
kotlin.runCatching {
......@@ -111,85 +111,4 @@ object QRCodeUtils {
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 @@
android:textSize="16sp" />
<EditText
android:id="@+id/edit_subject"
android:id="@+id/editLocation"
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_marginHorizontal="16dp"
......@@ -134,7 +134,7 @@
</FrameLayout>
<EditText
android:id="@+id/edit_message"
android:id="@+id/editDescription"
android:layout_width="match_parent"
android:layout_height="92dp"
android:layout_marginHorizontal="16dp"
......@@ -182,6 +182,7 @@
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvStartDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
......@@ -224,6 +225,7 @@
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvEndDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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 @@
<string name="rate_now">Rate now</string>
<string name="event_name">Event name</string>
<string name="enter_your_event_location">Enter your event location</string>
<string name="enter_your_event_name">Enter event name</string>
......@@ -89,5 +88,8 @@
<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="end_time">End Time</string>
<string name="datetime">DateTime</string>
<string name="clean">Clean</string>
<string name="ok">OK</string>
</resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<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 name="Theme.ScanQR" parent="Base.Theme.ScanQR" />
......@@ -11,4 +10,63 @@
<item name="android:windowBackground">@drawable/splash_bp</item>
<item name="android:windowFullscreen">false</item>
</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>
\ No newline at end of file
......@@ -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
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
#Jetifier ??:??????????? Support Library ???????? androidx ???
android.enableJetifier=true
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
......
......@@ -19,6 +19,7 @@ vungle = "7.4.2.0"
facebook = "6.18.0.0"
mintegral = "16.8.61.0"
pangle = "6.3.0.4.0"
protoliteWellKnownTypes = "18.0.0"
[libraries]
......@@ -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_mintegral = { group = "com.applovin.mediation", name = "mintegral-adapter", version.ref = "mintegral" }
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