Commit 17d4a4fa authored by wanglei's avatar wanglei

...

parent 8469a0d8
......@@ -4,8 +4,10 @@
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 --><!-- 获取wifi列表 -->
android:required="false" /> <!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取wifi列表 -->
<!-- 获取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" />
......@@ -13,13 +15,16 @@
<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.CALL_PHONE"/>
<application
android:name=".MyApplication"
......@@ -32,7 +37,10 @@
android:supportsRtl="true"
android:theme="@style/Theme.ScanQR"
tools:targetApi="31">
<activity
android:name=".ui.telephone.TelephoneCodeActivity"
android:exported="false"
android:theme="@style/Theme.ScanQR" />
<activity
android:name=".ui.start.StartActivity"
android:exported="true"
......
......@@ -5,7 +5,8 @@ data class TelephoneUIBean(
) : ScanBean(FunctionUIBean.KEY_TELEPHONE) {
companion object {
fun isWifiQR(qrCodeValue: String): Boolean {
fun isTelephoneQR(qrCodeValue: String): Boolean {
if (qrCodeValue.startsWith("tel:")) {
return true
}
......
......@@ -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.ProductUIBean
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.bean.WebsiteUIBean
import com.base.scanqr.bean.WifiUIBean
......@@ -98,7 +99,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
}
KEY_TELEPHONE -> {
if (item is TelephoneUIBean) {
binding.ivIcon.setImageResource(R.mipmap.h_telephone)
}
}
KEY_MESSAGE -> {}
......
......@@ -15,6 +15,7 @@ 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.telephone.TelephoneCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity
import com.base.scanqr.ui.widget.DeleteQRDialog.showDeleteQRDialog
......@@ -106,6 +107,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
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
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
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.bean.WebsiteUIBean
import com.base.scanqr.bean.WifiUIBean
......@@ -40,6 +40,8 @@ class HistoryViewModel() : ViewModel() {
productList.forEach { it.listContent = it.content }
val eventList = SpJsonUtils.getSpJsonList<EventUIBean>(FunctionUIBean.KEY_EVENT)
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(textList)
......@@ -47,6 +49,7 @@ class HistoryViewModel() : ViewModel() {
historyList.addAll(websiteList)
historyList.addAll(productList)
historyList.addAll(eventList)
historyList.addAll(telephoneList)
historyList.forEach {
LogEx.logDebug(TAG, "${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}")
......@@ -96,11 +99,18 @@ class HistoryViewModel() : ViewModel() {
it1.createTime == it2.createTime
})
}
FunctionUIBean.KEY_EVENT ->{
FunctionUIBean.KEY_EVENT -> {
SpJsonUtils.removeJsonBean<EventUIBean>(bean.scanType, bean as EventUIBean, removeIf = { it1, it2 ->
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)
......
......@@ -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.ProductUIBean
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.WebsiteUIBean.Companion.createWebsiteBean
import com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR
......@@ -29,6 +31,7 @@ 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.telephone.TelephoneCodeActivity
import com.base.scanqr.ui.text.TextCodeActivity
import com.base.scanqr.ui.website.WebsiteCodeActivity
import com.base.scanqr.ui.wifi.WifiCodeActivity
......@@ -36,7 +39,6 @@ import com.base.scanqr.utils.BitmapUtils.uriToBitmap
import com.base.scanqr.utils.IntentUtils.intentSafPickImage
import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.PermissionUtils.checkCameraPermission
import com.base.scanqr.utils.QRCodeUtils
import com.google.gson.Gson
import com.google.mlkit.vision.barcode.common.Barcode
import com.gyf.immersionbar.ktx.immersionBar
......@@ -144,6 +146,24 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
})
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 (scanJump.get()) return
scanJump.set(true)
......@@ -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) {
activity.startActivity(Intent(activity, EventCodeActivity::class.java).apply {
val bean = createEventBean(qrCodeValue)
......
......@@ -45,10 +45,6 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override fun initView() {
super.initView()
startActivity(Intent(this, TelephoneActivity::class.java))
finish()
return
NotificationHoverUtils.stopNotificationHandler()
if (ConstObject.ifAgreePrivacy) {
......
package com.base.scanqr.ui.telephone
import android.content.Intent
import android.net.Uri
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import com.base.scanqr.R
import com.base.scanqr.ads.AdsMgr
import com.base.scanqr.ads.AdsShowCallBack
......@@ -11,8 +13,14 @@ import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.TelephoneUIBean
import com.base.scanqr.databinding.ActivityTelephoneBinding
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.LogEx
import com.base.scanqr.utils.PermissionUtils.checkContactsReadPermission
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) {
......@@ -55,16 +63,50 @@ class TelephoneActivity : BaseActivity<ActivityTelephoneBinding>(ActivityTelepho
telephoneBean.tel = s.toString()
}
binding.tvSelect.setOnClickListener {
if (!checkContactsReadPermission()) {
launcher.launch(arrayOf(android.Manifest.permission.READ_CONTACTS)) {
if (checkContactsReadPermission()) {
pickTel()
}
}
} else {
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)
}
}
}
}
\ No newline at end of file
package com.base.scanqr.ui.telephone
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
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.bean.FunctionUIBean
import com.base.scanqr.bean.TelephoneUIBean
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 lateinit var binding: ActivityTelephoneCodeBinding
private var telephoneUIBean = TelephoneUIBean()
private var telQrString = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
private var tempImage: String = ""
override fun onResumeOneShoot() {
super.onResumeOneShoot()
val flag = changeLanguage()
if (flag) return
binding = ActivityTelephoneCodeBinding.inflate(layoutInflater)
setContentView(binding.root)
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)
setSupportActionBar(binding.toolbar)
val data = intent.extras?.getString("data")
val navController = findNavController(R.id.nav_host_fragment_content_telephone_code)
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
data?.let {
telephoneUIBean = Gson().fromJson(data, TelephoneUIBean::class.java)
binding.tvTel.text = telephoneUIBean.tel
}
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()
}
binding.fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null)
.setAnchorView(R.id.fab).show()
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
AdsMgr.showInsert(this@TelephoneCodeActivity, false, object : AdsShowCallBack() {
override fun close(where: Int) {
finishToMainTop()
}
override fun failed(where: Int) {
finishToMainTop()
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment_content_telephone_code)
return navController.navigateUp(appBarConfiguration)
|| super.onSupportNavigateUp()
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
object ContactUtils {
@SuppressLint("Range")
fun Context.queryTel(contactUri: Uri) {
fun Context.queryTel(contactUri: Uri): String? {
val cursor = contentResolver.query(
contactUri,
null,
......@@ -18,8 +18,8 @@ object ContactUtils {
null
)
cursor?.use {
if (it.moveToFirst()) {
val phoneId = it.getLong(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))
if (cursor.moveToFirst()) {
val phoneId = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID))
val phoneCursor = contentResolver.query(
ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phoneId),
null,
......@@ -28,13 +28,15 @@ object ContactUtils {
null
)
phoneCursor?.use {
if (it.moveToFirst()) {
if (phoneCursor.moveToFirst()) {
val phoneNumber =
phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
// 使用phoneNumber
return phoneNumber
}
}
}
}
return null
}
}
\ No newline at end of file
......@@ -122,4 +122,10 @@ object IntentUtils {
val chooser = Intent.createChooser(intent, null)
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
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 相机
fun Context.checkCameraPermission(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
......
......@@ -132,7 +132,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="12dp"
android:text="Link Website"
android:text="@string/link_website"
android:textColor="#666666"
android:textSize="16sp"
android:textStyle="bold" />
......
......@@ -20,7 +20,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:src="@mipmap/h_wifi"
tools:src="@mipmap/h_wifi"
tools:ignore="ContentDescription" />
<LinearLayout
......
......@@ -94,5 +94,40 @@
<string name="phone">Phone</string>
<string name="enter_phone_number">Enter phone number</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>
\ 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