Commit c41c9a24 authored by wanglei's avatar wanglei

...

parent 59d0e3ae
......@@ -4,9 +4,10 @@
<uses-feature
android:name="android.hardware.camera"
android:required="false" /> <!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
android:required="false" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" /> <!---->
<!-- 获取wifi列表 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
......@@ -15,15 +16,13 @@
<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.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
......
package com.base.scanqr.ui.contact
import android.Manifest
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.databinding.ActivityContractBinding
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.databinding.ActivityContractCodeBinding
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.intentShareImage
import com.base.scanqr.utils.IntentUtils.intentWriteContract
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 ContractCodeActivity : BaseActivity<ActivityContractBinding>(ActivityContractBinding::inflate) {
class ContractCodeActivity : BaseActivity<ActivityContractCodeBinding>(ActivityContractCodeBinding::inflate) {
private var contractUIBean = ContractUIBean()
private var tempImage: String = ""
private var contractQrString = ""
override fun onResumeOneShoot() {
super.onResumeOneShoot()
val flag = changeLanguage()
if (flag) return
AdsMgr.showBanner(binding.flBanner, false)
}
override fun initView() {
super.initView()
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_item)
val data = intent.extras?.getString("data")
data?.let {
contractUIBean = Gson().fromJson(data, ContractUIBean::class.java)
binding.tvName.text = contractUIBean.n
binding.tvTel.text = contractUIBean.tel
binding.tvEmail.text = contractUIBean.email
binding.tvAddress.text = contractUIBean.adr
}
Thread {
contractQrString = ContractUIBean.createContractQrString(contractUIBean)
LogEx.logDebug(TAG, "contractQrString=$contractQrString")
val bitmap = generateQRCode(contractQrString, 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 (contractUIBean.needCreate) {
contractUIBean.needCreate = false
SpJsonUtils.addJsonBean<ContractUIBean>(FunctionUIBean.KEY_CONTACT, contractUIBean)
}
}
}.start()
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
AdsMgr.showInsert(this@ContractCodeActivity, 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, contractQrString)
toast("Copied to clipboard", true)
}
launcher.launch(arrayOf(Manifest.permission.WRITE_CONTACTS)) {
}
binding.flSearch.setOnClickListener {
try {
val intent = intentWriteContract(contractUIBean)
startActivity(intent)
} catch (e: Exception) {
toast("No application was found to handle the add contract", true)
}
}
}
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import android.view.ViewGroup
import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT
......@@ -85,7 +86,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
}
KEY_CONTACT -> {
if (item is ContractUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_contact)
}
}
KEY_WEBSITE -> {
......
......@@ -12,6 +12,7 @@ import com.base.scanqr.bean.AdScanBean
import com.base.scanqr.bean.FunctionUIBean
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.databinding.FragmentHistoryBinding
import com.base.scanqr.ui.contact.ContractCodeActivity
import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity
......@@ -113,6 +114,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra("data", Gson().toJson(item))
})
}
FunctionUIBean.KEY_CONTACT -> {
activity?.startActivity(Intent(activity, ContractCodeActivity::class.java).apply {
putExtra("data", Gson().toJson(item))
})
}
}
}
......
......@@ -2,6 +2,7 @@ package com.base.scanqr.ui.main
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import com.base.scanqr.bean.FunctionUIBean
......@@ -42,6 +43,8 @@ class HistoryViewModel() : ViewModel() {
eventList.forEach { it.listContent = it.summary }
val telephoneList = SpJsonUtils.getSpJsonList<TelephoneUIBean>(FunctionUIBean.KEY_TELEPHONE)
telephoneList.forEach { it.listContent = it.tel }
val contractList = SpJsonUtils.getSpJsonList<ContractUIBean>(FunctionUIBean.KEY_CONTACT)
contractList.forEach { it.listContent = it.n }
historyList.addAll(wifiList)
historyList.addAll(textList)
......@@ -50,6 +53,7 @@ class HistoryViewModel() : ViewModel() {
historyList.addAll(productList)
historyList.addAll(eventList)
historyList.addAll(telephoneList)
historyList.addAll(contractList)
historyList.forEach {
LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}")
......@@ -85,7 +89,9 @@ class HistoryViewModel() : ViewModel() {
}
FunctionUIBean.KEY_CONTACT -> {
SpJsonUtils.removeJsonBean<ContractUIBean>(bean.scanType, bean as ContractUIBean, removeIf = { it1, it2 ->
it1.createTime == it2.createTime
})
}
FunctionUIBean.KEY_WEBSITE -> {
......
......@@ -13,6 +13,8 @@ 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.ContractUIBean.Companion.createContractBean
import com.base.scanqr.bean.ContractUIBean.Companion.isContractQR
import com.base.scanqr.bean.EmailUIBean.Companion.createEmailBean
import com.base.scanqr.bean.EmailUIBean.Companion.isEmailQR
import com.base.scanqr.bean.EventUIBean.Companion.createEventBean
......@@ -28,6 +30,7 @@ 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.contact.ContractCodeActivity
import com.base.scanqr.ui.email.EmailCodeActivity
import com.base.scanqr.ui.event.EventCodeActivity
import com.base.scanqr.ui.product.ProductCodeActivity
......@@ -146,6 +149,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
})
return
}
if (isContractQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
AdsMgr.showInsert(activity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
override fun failed(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
override fun googleFailed(where: Int) {
jumpContractCodeActivity(activity, qrCodeValue)
}
})
return
}
if (isTelephoneQR(qrCodeValue)) {
if (scanJump.get()) return
scanJump.set(true)
......@@ -263,6 +284,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}
}
private fun jumpContractCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, ContractCodeActivity::class.java).apply {
val bean = createContractBean(qrCodeValue)
bean.needCreate = true
bean.createType = CREATE_TYPE_SCAN
putExtra("data", Gson().toJson(bean))
})
}
private fun jumpTelephoneCodeActivity(activity: MainActivity, qrCodeValue: String) {
activity.startActivity(Intent(activity, TelephoneCodeActivity::class.java).apply {
val bean = createTelephoneBean(qrCodeValue)
......
......@@ -45,10 +45,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() {
super.initView()
startActivity(Intent(this, ContractActivity::class.java))
finish()
return
//
// startActivity(Intent(this, ContractActivity::class.java))
// finish()
// return
NotificationHoverUtils.stopNotificationHandler()
......
package com.base.scanqr.utils
import android.content.ContentValues
import android.content.Context
import android.content.Intent
import android.net.Uri
......@@ -8,6 +9,7 @@ import android.provider.CalendarContract
import android.provider.ContactsContract
import android.provider.Settings
import androidx.core.content.FileProvider
import com.base.scanqr.bean.ContractUIBean
import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.EventUIBean
import java.io.File
......@@ -128,4 +130,27 @@ object IntentUtils {
val shareIntent = Intent.createChooser(callIntent, null)
return shareIntent
}
fun intentWriteContract(bean: ContractUIBean): Intent {
val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI)
intent.putExtra(ContactsContract.Intents.Insert.NAME, bean.n)
intent.putExtra(ContactsContract.Intents.Insert.PHONE, bean.tel)
intent.putExtra(ContactsContract.Intents.Insert.EMAIL, bean.email)
//竞品拿个公司地址,受不了
intent.putExtra(ContactsContract.Intents.Insert.COMPANY, bean.adr)
// val values = ContentValues().apply {
// put(
// ContactsContract.CommonDataKinds.StructuredPostal.TYPE,
// ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER
// )
// put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, bean.adr)
// }
// val dataArrayList = ArrayList<ContentValues>()
// dataArrayList.add(values)
//
// intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA,dataArrayList)
val shareIntent = Intent.createChooser(intent, null)
return shareIntent
}
}
\ No newline at end of file
......@@ -25,6 +25,10 @@ object PermissionUtils {
fun Context.checkContactsReadPermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
}
fun Context.checkContactsWritePermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)
}
//endregion
//region 相机
......
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