Commit 17d4a4fa authored by wanglei's avatar wanglei

...

parent 8469a0d8
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
<uses-feature <uses-feature
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> android:required="false" /> <!-- 获取wifi列表 -->
<!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 --> <!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取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" />
...@@ -13,13 +15,16 @@ ...@@ -13,13 +15,16 @@
<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.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<application <application
android:name=".MyApplication" android:name=".MyApplication"
...@@ -32,7 +37,10 @@ ...@@ -32,7 +37,10 @@
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.telephone.TelephoneCodeActivity"
android:exported="false"
android:theme="@style/Theme.ScanQR" />
<activity <activity
android:name=".ui.start.StartActivity" android:name=".ui.start.StartActivity"
android:exported="true" android:exported="true"
......
...@@ -5,7 +5,8 @@ data class TelephoneUIBean( ...@@ -5,7 +5,8 @@ data class TelephoneUIBean(
) : ScanBean(FunctionUIBean.KEY_TELEPHONE) { ) : ScanBean(FunctionUIBean.KEY_TELEPHONE) {
companion object { companion object {
fun isWifiQR(qrCodeValue: String): Boolean {
fun isTelephoneQR(qrCodeValue: String): Boolean {
if (qrCodeValue.startsWith("tel:")) { if (qrCodeValue.startsWith("tel:")) {
return true return true
} }
......
...@@ -20,6 +20,7 @@ import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WEBSITE ...@@ -20,6 +20,7 @@ import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WEBSITE
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import com.base.scanqr.bean.ProductUIBean import com.base.scanqr.bean.ProductUIBean
import com.base.scanqr.bean.ScanBean import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.bean.TextUIBean import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.bean.WebsiteUIBean import com.base.scanqr.bean.WebsiteUIBean
import com.base.scanqr.bean.WifiUIBean import com.base.scanqr.bean.WifiUIBean
...@@ -98,7 +99,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() { ...@@ -98,7 +99,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
} }
KEY_TELEPHONE -> { KEY_TELEPHONE -> {
if (item is TelephoneUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_telephone)
}
} }
KEY_MESSAGE -> {} KEY_MESSAGE -> {}
......
...@@ -15,6 +15,7 @@ import com.base.scanqr.databinding.FragmentHistoryBinding ...@@ -15,6 +15,7 @@ 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.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
import com.base.scanqr.ui.telephone.TelephoneCodeActivity
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
import com.base.scanqr.ui.widget.DeleteQRDialog.showDeleteQRDialog import com.base.scanqr.ui.widget.DeleteQRDialog.showDeleteQRDialog
...@@ -106,6 +107,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind ...@@ -106,6 +107,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra("data", Gson().toJson(item)) putExtra("data", Gson().toJson(item))
}) })
} }
FunctionUIBean.KEY_TELEPHONE -> {
activity?.startActivity(Intent(activity, TelephoneCodeActivity::class.java).apply {
putExtra("data", Gson().toJson(item))
})
}
} }
} }
......
...@@ -2,12 +2,12 @@ package com.base.scanqr.ui.main ...@@ -2,12 +2,12 @@ package com.base.scanqr.ui.main
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
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.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
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.bean.TextUIBean import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.bean.WebsiteUIBean import com.base.scanqr.bean.WebsiteUIBean
import com.base.scanqr.bean.WifiUIBean import com.base.scanqr.bean.WifiUIBean
...@@ -40,6 +40,8 @@ class HistoryViewModel() : ViewModel() { ...@@ -40,6 +40,8 @@ class HistoryViewModel() : ViewModel() {
productList.forEach { it.listContent = it.content } productList.forEach { it.listContent = it.content }
val eventList = SpJsonUtils.getSpJsonList<EventUIBean>(FunctionUIBean.KEY_EVENT) val eventList = SpJsonUtils.getSpJsonList<EventUIBean>(FunctionUIBean.KEY_EVENT)
eventList.forEach { it.listContent = it.summary } eventList.forEach { it.listContent = it.summary }
val telephoneList = SpJsonUtils.getSpJsonList<TelephoneUIBean>(FunctionUIBean.KEY_TELEPHONE)
telephoneList.forEach { it.listContent = it.tel }
historyList.addAll(wifiList) historyList.addAll(wifiList)
historyList.addAll(textList) historyList.addAll(textList)
...@@ -47,6 +49,7 @@ class HistoryViewModel() : ViewModel() { ...@@ -47,6 +49,7 @@ class HistoryViewModel() : ViewModel() {
historyList.addAll(websiteList) historyList.addAll(websiteList)
historyList.addAll(productList) historyList.addAll(productList)
historyList.addAll(eventList) historyList.addAll(eventList)
historyList.addAll(telephoneList)
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}")
...@@ -96,11 +99,18 @@ class HistoryViewModel() : ViewModel() { ...@@ -96,11 +99,18 @@ class HistoryViewModel() : ViewModel() {
it1.createTime == it2.createTime it1.createTime == it2.createTime
}) })
} }
FunctionUIBean.KEY_EVENT ->{
FunctionUIBean.KEY_EVENT -> {
SpJsonUtils.removeJsonBean<EventUIBean>(bean.scanType, bean as EventUIBean, removeIf = { it1, it2 -> SpJsonUtils.removeJsonBean<EventUIBean>(bean.scanType, bean as EventUIBean, removeIf = { it1, it2 ->
it1.createTime == it2.createTime it1.createTime == it2.createTime
}) })
} }
FunctionUIBean.KEY_TELEPHONE -> {
SpJsonUtils.removeJsonBean<TelephoneUIBean>(bean.scanType, bean as TelephoneUIBean, removeIf = { it1, it2 ->
it1.createTime == it2.createTime
})
}
} }
historyList.remove(bean) historyList.remove(bean)
......
...@@ -19,6 +19,8 @@ import com.base.scanqr.bean.EventUIBean.Companion.createEventBean ...@@ -19,6 +19,8 @@ import com.base.scanqr.bean.EventUIBean.Companion.createEventBean
import com.base.scanqr.bean.EventUIBean.Companion.isEventQR 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.TelephoneUIBean.Companion.createTelephoneBean
import com.base.scanqr.bean.TelephoneUIBean.Companion.isTelephoneQR
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.createWebsiteBean
import com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR import com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR
...@@ -29,6 +31,7 @@ import com.base.scanqr.qr.QRImageAnalyzer ...@@ -29,6 +31,7 @@ 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.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity import com.base.scanqr.ui.product.ProductCodeActivity
import com.base.scanqr.ui.telephone.TelephoneCodeActivity
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
import com.base.scanqr.ui.wifi.WifiCodeActivity import com.base.scanqr.ui.wifi.WifiCodeActivity
...@@ -36,7 +39,6 @@ import com.base.scanqr.utils.BitmapUtils.uriToBitmap ...@@ -36,7 +39,6 @@ import com.base.scanqr.utils.BitmapUtils.uriToBitmap
import com.base.scanqr.utils.IntentUtils.intentSafPickImage import com.base.scanqr.utils.IntentUtils.intentSafPickImage
import com.base.scanqr.utils.LogEx import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkCameraPermission import com.base.scanqr.utils.PermissionUtils.checkCameraPermission
import com.base.scanqr.utils.QRCodeUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.google.mlkit.vision.barcode.common.Barcode import com.google.mlkit.vision.barcode.common.Barcode
import com.gyf.immersionbar.ktx.immersionBar import com.gyf.immersionbar.ktx.immersionBar
...@@ -144,6 +146,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -144,6 +146,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}) })
return return
} }
if (isTelephoneQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
jumpTelephoneCodeActivity(activity, qrCodeValue)
}
override fun failed(where: Int) {
jumpTelephoneCodeActivity(activity, qrCodeValue)
}
override fun googleFailed(where: Int) {
jumpTelephoneCodeActivity(activity, qrCodeValue)
}
})
return
}
if (isEventQR(qrCodeValue)) { if (isEventQR(qrCodeValue)) {
if (scanJump.get()) return if (scanJump.get()) return
scanJump.set(true) scanJump.set(true)
...@@ -243,6 +263,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl ...@@ -243,6 +263,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
} }
} }
private fun jumpTelephoneCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, TelephoneCodeActivity::class.java).apply {
val bean = createTelephoneBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
})
}
private fun jumpEventCodeActivity(activity: MainActivity, qrCodeValue: String) { private fun jumpEventCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, EventCodeActivity::class.java).apply { activity.startActivity(Intent(activity, EventCodeActivity::class.java).apply {
val bean = createEventBean(qrCodeValue) val bean = createEventBean(qrCodeValue)
......
...@@ -45,10 +45,6 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i ...@@ -45,10 +45,6 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() { override fun initView() {
super.initView() super.initView()
startActivity(Intent(this, TelephoneActivity::class.java))
finish()
return
NotificationHoverUtils.stopNotificationHandler() NotificationHoverUtils.stopNotificationHandler()
if (ConstObject.ifAgreePrivacy) { if (ConstObject.ifAgreePrivacy) {
......
package com.base.scanqr.ui.telephone package com.base.scanqr.ui.telephone
import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack import com.base.scanqr.ads.AdsShowCallBack
...@@ -11,8 +13,14 @@ import com.base.scanqr.base.BaseActivity ...@@ -11,8 +13,14 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.TelephoneUIBean import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.databinding.ActivityTelephoneBinding import com.base.scanqr.databinding.ActivityTelephoneBinding
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
import com.base.scanqr.utils.ContactUtils.queryTel
import com.base.scanqr.utils.IntentUtils.intentPickContacts import com.base.scanqr.utils.IntentUtils.intentPickContacts
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkContactsReadPermission
import com.base.scanqr.utils.ToastUtils.toast import com.base.scanqr.utils.ToastUtils.toast
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelephoneBinding::inflate) { class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelephoneBinding::inflate) {
...@@ -55,14 +63,48 @@ class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelepho ...@@ -55,14 +63,48 @@ class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelepho
telephoneBean.tel = s.toString() telephoneBean.tel = s.toString()
} }
binding.tvSelect.setOnClickListener { binding.tvSelect.setOnClickListener {
val intent = intentPickContacts() if (!checkContactsReadPermission()) {
try { launcher.launch(arrayOf(android.Manifest.permission.READ_CONTACTS)) {
launcher.launch(intent) { result -> if (checkContactsReadPermission()) {
val contactUri: Uri? = result.data?.data pickTel()
}
} }
} catch (e: Exception) { } else {
toast("No application was found to handle the contacts pick", true) pickTel()
} }
}
binding.flQueren.setOnClickListener {
if (telephoneBean.tel.isEmpty()) {
toast("Enter phone number", true)
return@setOnClickListener
}
startActivity(Intent(this@TelephoneActivity, TelephoneCodeActivity::class.java).apply {
putExtra("data", Gson().toJson(telephoneBean))
})
finish()
}
}
private fun pickTel() {
val intent = intentPickContacts()
try {
launcher.launch(intent) { result ->
val contactUri: Uri? = result.data?.data
LogEx.logDebug(TAG, "")
if (contactUri != null) {
lifecycleScope.launch(Dispatchers.IO) {
val tel = queryTel(contactUri) ?: ""
telephoneBean.tel = tel
launch(Dispatchers.Main) {
binding.edit.setText(tel)
}
}
}
}
} catch (e: Exception) {
toast("No application was found to handle the contacts pick", true)
} }
} }
......
package com.base.scanqr.ui.telephone package com.base.scanqr.ui.telephone
import android.os.Bundle import android.Manifest
import com.google.android.material.snackbar.Snackbar import android.os.Environment
import androidx.appcompat.app.AppCompatActivity import androidx.activity.addCallback
import androidx.navigation.findNavController import androidx.core.view.updatePadding
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import com.base.scanqr.R 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.FunctionUIBean
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.databinding.ActivityTelephoneCodeBinding import com.base.scanqr.databinding.ActivityTelephoneCodeBinding
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.intentCallPhone
import com.base.scanqr.utils.IntentUtils.intentShareImage
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkCallPhonePermission
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 TelephoneCodeActivity : AppCompatActivity() { class TelephoneCodeActivity : BaseActivity<ActivityTelephoneCodeBinding>(ActivityTelephoneCodeBinding::inflate) {
private lateinit var appBarConfiguration: AppBarConfiguration private var telephoneUIBean = TelephoneUIBean()
private lateinit var binding: ActivityTelephoneCodeBinding private var telQrString = ""
override fun onCreate(savedInstanceState: Bundle?) { private var tempImage: String = ""
super.onCreate(savedInstanceState) override fun onResumeOneShoot() {
super.onResumeOneShoot()
val flag = changeLanguage()
if (flag) return
binding = ActivityTelephoneCodeBinding.inflate(layoutInflater) AdsMgr.showBanner(binding.flBanner, false)
setContentView(binding.root) }
override fun initView() {
super.initView()
setSupportActionBar(binding.toolbar) binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item)
val navController = findNavController(R.id.nav_host_fragment_content_telephone_code) val data = intent.extras?.getString("data")
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
binding.fab.setOnClickListener { view -> data?.let {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) telephoneUIBean = Gson().fromJson(data, TelephoneUIBean::class.java)
.setAction("Action", null) binding.tvTel.text = telephoneUIBean.tel
.setAnchorView(R.id.fab).show()
} }
Thread {
telQrString = "tel:" + telephoneUIBean.tel
val bitmap = generateQRCode(telQrString, 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 (telephoneUIBean.needCreate) {
telephoneUIBean.needCreate = false
SpJsonUtils.addJsonBean<TelephoneUIBean>(FunctionUIBean.KEY_TELEPHONE, telephoneUIBean)
}
}
}.start()
} }
override fun onSupportNavigateUp(): Boolean { override fun initListener() {
val navController = findNavController(R.id.nav_host_fragment_content_telephone_code) super.initListener()
return navController.navigateUp(appBarConfiguration) onBackPressedDispatcher.addCallback {
|| super.onSupportNavigateUp() AdsMgr.showInsert(this@TelephoneCodeActivity, 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.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, telQrString)
toast("Copied to clipboard", true)
}
binding.flSearch.setOnClickListener {
if (!checkCallPhonePermission()) {
launcher.launch(arrayOf(Manifest.permission.CALL_PHONE)) {
if (checkCallPhonePermission()) {
callPhone()
}
}
} else {
callPhone()
}
}
}
private fun callPhone() {
try {
val intent = intentCallPhone(telephoneUIBean.tel)
startActivity(intent)
} catch (e: Exception) {
toast("No application was found to handle the phone call", true)
}
} }
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ import android.provider.ContactsContract ...@@ -9,7 +9,7 @@ import android.provider.ContactsContract
object ContactUtils { object ContactUtils {
@SuppressLint("Range") @SuppressLint("Range")
fun Context.queryTel(contactUri: Uri) { fun Context.queryTel(contactUri: Uri): String? {
val cursor = contentResolver.query( val cursor = contentResolver.query(
contactUri, contactUri,
null, null,
...@@ -18,8 +18,8 @@ object ContactUtils { ...@@ -18,8 +18,8 @@ object ContactUtils {
null null
) )
cursor?.use { cursor?.use {
if (it.moveToFirst()) { if (cursor.moveToFirst()) {
val phoneId = it.getLong(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)) val phoneId = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))
val phoneCursor = contentResolver.query( val phoneCursor = contentResolver.query(
ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phoneId), ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phoneId),
null, null,
...@@ -28,13 +28,15 @@ object ContactUtils { ...@@ -28,13 +28,15 @@ object ContactUtils {
null null
) )
phoneCursor?.use { phoneCursor?.use {
if (it.moveToFirst()) { if (phoneCursor.moveToFirst()) {
val phoneNumber = val phoneNumber =
phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
// 使用phoneNumber // 使用phoneNumber
return phoneNumber
} }
} }
} }
} }
return null
} }
} }
\ No newline at end of file
...@@ -122,4 +122,10 @@ object IntentUtils { ...@@ -122,4 +122,10 @@ object IntentUtils {
val chooser = Intent.createChooser(intent, null) val chooser = Intent.createChooser(intent, null)
return chooser return chooser
} }
fun intentCallPhone(tel: String): Intent {
val callIntent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$tel"))
val shareIntent = Intent.createChooser(callIntent, null)
return shareIntent
}
} }
\ No newline at end of file
...@@ -15,6 +15,18 @@ import com.base.scanqr.utils.IntentUtils.intentAppDetailsSettings ...@@ -15,6 +15,18 @@ import com.base.scanqr.utils.IntentUtils.intentAppDetailsSettings
object PermissionUtils { object PermissionUtils {
//region 打电话
fun Context.checkCallPhonePermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
}
//endregion
//region联系人
fun Context.checkContactsReadPermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
}
//endregion
//region 相机 //region 相机
fun Context.checkCameraPermission(): Boolean { fun Context.checkCameraPermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:background="@color/white"
tools:context=".ui.telephone.TelephoneCodeActivity"> tools:context=".ui.website.WebsiteCodeActivity">
<com.google.android.material.appbar.AppBarLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar <FrameLayout
android:id="@+id/toolbar" android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="@string/telephone"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/fl_back"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/fl_banner"
app:layout_constraintTop_toBottomOf="@id/cl_top">
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" /> android:layout_height="wrap_content"
android:orientation="vertical">
</com.google.android.material.appbar.AppBarLayout> <androidx.cardview.widget.CardView
android:layout_width="195dp"
android:layout_height="195dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
app:cardCornerRadius="20dp"
app:cardElevation="5dp">
<include layout="@layout/content_telephone_code" /> <ImageView
android:id="@+id/iv_qr"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:scaleType="fitXY"
tools:ignore="ContentDescription" />
<com.google.android.material.floatingactionbutton.FloatingActionButton </androidx.cardview.widget.CardView>
android:id="@+id/fab"
android:layout_width="wrap_content" <com.base.scanqr.ads.NativeParentView
android:layout_height="wrap_content" android:id="@+id/fl_ad"
android:layout_gravity="bottom|end" android:layout_width="match_parent"
android:layout_marginEnd="@dimen/fab_margin" android:layout_height="wrap_content"
android:layout_marginBottom="16dp" android:layout_marginHorizontal="16dp"
app:srcCompat="@android:drawable/ic_dialog_email" /> android:layout_marginTop="24dp"
android:background="@drawable/bg_ecf6ff_20"
android:minHeight="133dp">
<io.supercharge.shimmerlayout.ShimmerLayout
android:id="@+id/shimmerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="16dp"
app:shimmer_angle="25"
app:shimmer_animation_duration="2000"
app:shimmer_auto_start="true"
app:shimmer_color="#33ffffff"
app:shimmer_mask_width="0.2">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/czhanweitu"
tools:ignore="ContentDescription,ImageContrastCheck" />
</io.supercharge.shimmerlayout.ShimmerLayout>
</com.base.scanqr.ads.NativeParentView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="15dp"
android:layout_marginBottom="8dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="15dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="12dp"
android:text="@string/phone_number"
android:textColor="#666666"
android:textSize="16sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="17dp"
android:src="@mipmap/phoneicon"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvTel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="5dp"
android:textColor="#6473F8"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginHorizontal="14dp"
android:layout_marginTop="8dp"
android:background="#E2E2E2" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="98dp"
android:layout_marginVertical="8dp"
app:layout_constraintBottom_toTopOf="@id/fl_search"
app:layout_constraintTop_toBottomOf="@id/ll_content"
tools:ignore="DisableBaselineAlignment">
<LinearLayout
android:id="@+id/ll_share"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/w_share"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:text="@string/share"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_pdf"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/w_export"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:text="@string/export_to_pdf"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_download"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/w_download"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:text="@string/download"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_copy"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/w_copy"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:text="@string/copy"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/fl_search"
android:layout_width="171dp"
android:layout_height="30dp"
android:layout_marginBottom="12dp"
android:background="@drawable/bg_stroke_6473f8_90"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:ignore="UseCompoundDrawables,UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/h_lianjie"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="4dp"
android:includeFontPadding="false"
android:text="@string/search_on_the_web"
android:textColor="#6473F8"
android:textSize="11sp" />
</LinearLayout>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<FrameLayout
android:id="@id/fl_banner"
android:layout_width="match_parent"
android:layout_height="60dp"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file \ No newline at end of file
...@@ -132,7 +132,7 @@ ...@@ -132,7 +132,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="14dp" android:layout_marginStart="14dp"
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:text="Link Website" android:text="@string/link_website"
android:textColor="#666666" android:textColor="#666666"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:src="@mipmap/h_wifi" tools:src="@mipmap/h_wifi"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<LinearLayout <LinearLayout
......
...@@ -94,5 +94,40 @@ ...@@ -94,5 +94,40 @@
<string name="phone">Phone</string> <string name="phone">Phone</string>
<string name="enter_phone_number">Enter phone number</string> <string name="enter_phone_number">Enter phone number</string>
<string name="select_in_contacts">Select in contacts</string> <string name="select_in_contacts">Select in contacts</string>
<!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="lorem_ipsum">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris volutpat, dolor id interdum
ullamcorper, risus dolor egestas lectus, sit amet mattis purus dui nec risus. Maecenas non sodales nisi, vel dictum dolor.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend diam,
vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a, ornare ex. Sed rhoncus est ut libero porta
lobortis. Fusce in dictum tellus.\n\n
Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus egestas, est a condimentum egestas,
turpis nisl iaculis ipsum, in dictum tellus dolor sed neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui.
Interdum et malesuada fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae, molestie nibh.
Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor bibendum, vel congue leo egestas.\n\n
Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit amet auctor at, mollis non turpis.
Nullam pretium libero vestibulum, finibus orci vel, molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero
facilisis et. Integer interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at lacinia sit
amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula, in lobortis sem porta sed. Integer id ultrices
magna, in luctus elit. Sed a pellentesque est.\n\n
Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh. Morbi laoreet, tortor sed facilisis
varius, nibh orci rhoncus nulla, id elementum leo dui non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu
libero sed commodo. In eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc, quis imperdiet
eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra ipsum. Nunc quis augue egestas, cursus lorem at,
molestie sem. Morbi a consectetur ipsum, a placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet
finibus convallis.\n\n
Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In
volutpat arcu ut felis sagittis, in finibus massa gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur
ullamcorper, libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper sodales. Praesent bibendum
rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus libero vel nunc consequat, quis tincidunt nisl eleifend. Cras
bibendum enim a justo luctus vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
</string>
<string name="phone_number">Phone number</string>
<string name="link_website">Link Website</string>
</resources> </resources>
\ No newline at end of file
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