Commit ccaa799c authored by wanglei's avatar wanglei

...

parent b3568d25
package com.base.scanqr.bean package com.base.scanqr.bean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
data class EmailUIBean( data class EmailUIBean(
var address: String = "", var address: String = "",
var subject: String = "", var subject: String = "",
var message: String = "" var message: String = ""
) ): ScanBean(KEY_EMAIL)
\ No newline at end of file \ No newline at end of file
package com.base.scanqr.bean package com.base.scanqr.bean
data class HomeTabUIBean( data class HomeTabUIBean(
val icon:Int, val icon: Int,
val tab:String val tab: String
) ) : ScanBean()
\ No newline at end of file \ No newline at end of file
package com.base.scanqr.bean
abstract class ScanBean(
val scanType: String = ""
) {
var createTime = 0L
}
\ No newline at end of file
package com.base.scanqr.bean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_TEXT
data class TextUIBean(
var content: String = ""
) : ScanBean(KEY_TEXT)
\ No newline at end of file
package com.base.scanqr.bean package com.base.scanqr.bean
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
data class WifiUIBean( data class WifiUIBean(
var ssid: String = "", var ssid: String = "",
var bssid: String = "", var bssid: String = "",
var securityTypes: IntArray = intArrayOf(), var securityTypes: IntArray = intArrayOf(),
var securityId: Int = 0 var securityId: Int = 0
) { ) : ScanBean(KEY_WIFI) {
var password: String = "" var password: String = ""
var hidden: Boolean = false var hidden: Boolean = false
} }
\ No newline at end of file
...@@ -6,6 +6,7 @@ import androidx.core.view.updatePadding ...@@ -6,6 +6,7 @@ import androidx.core.view.updatePadding
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.EmailUIBean import com.base.scanqr.bean.EmailUIBean
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.databinding.ActivityEmailCodeBinding import com.base.scanqr.databinding.ActivityEmailCodeBinding
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
...@@ -14,6 +15,8 @@ import com.base.scanqr.utils.ClipboardUtils.copyText ...@@ -14,6 +15,8 @@ import com.base.scanqr.utils.ClipboardUtils.copyText
import com.base.scanqr.utils.IntentUtils.intentShareImage import com.base.scanqr.utils.IntentUtils.intentShareImage
import com.base.scanqr.utils.LogEx import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.QRCodeGenerator.generateQRCode import com.base.scanqr.utils.QRCodeGenerator.generateQRCode
import com.base.scanqr.utils.SpJsonUtils
import com.base.scanqr.utils.SpJsonUtils.SCAN_HISTORY_KEY
import com.base.scanqr.utils.ToastUtils.toast import com.base.scanqr.utils.ToastUtils.toast
import com.google.gson.Gson import com.google.gson.Gson
import java.io.File import java.io.File
...@@ -40,11 +43,15 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo ...@@ -40,11 +43,15 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
qrContent.append("BODY:").append(email.message).append(";") qrContent.append("BODY:").append(email.message).append(";")
content = qrContent.toString() content = qrContent.toString()
Thread { Thread {
SpJsonUtils.addJsonBean<ScanBean>(SCAN_HISTORY_KEY, email)
val bitmap = generateQRCode(content, 735, 735, 5) val bitmap = generateQRCode(content, 735, 735, 5)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
bitmap?.let { bitmap?.let {
if (email.createTime == 0L) {
email.createTime = System.currentTimeMillis()
}
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
......
package com.base.scanqr.ui.main
import android.content.Context
import android.view.ViewGroup
import com.base.scanqr.R
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
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_LOCATION
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_MESSAGE
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_TELEPHONE
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_TEXT
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WEBSITE
import com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.WifiUIBean
import com.base.scanqr.databinding.ItemHistoryBinding
import com.base.scanqr.ui.adapter.CommonViewHolder
import com.base.scanqr.utils.XmlEx.inflate
import com.chad.library.adapter4.BaseQuickAdapter
class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: ScanBean?) {
item ?: return
val binding = ItemHistoryBinding.bind(holder.itemView)
when (item.scanType) {
KEY_WIFI -> {
if (item is WifiUIBean) {
binding.tvDesc.text = item.ssid
}
}
KEY_TEXT -> {
}
KEY_EMAIL -> {
}
KEY_EVENT -> {
}
KEY_CONTACT -> {
}
KEY_WEBSITE -> {
}
KEY_LOCATION -> {
}
KEY_TELEPHONE -> {
}
KEY_MESSAGE -> {}
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
return CommonViewHolder(R.layout.item_history.inflate(parent))
}
}
\ No newline at end of file
package com.base.scanqr.ui.main package com.base.scanqr.ui.main
import androidx.core.view.updatePadding
import com.base.scanqr.base.BaseFragment import com.base.scanqr.base.BaseFragment
import com.base.scanqr.databinding.FragmentHistoryBinding import com.base.scanqr.databinding.FragmentHistoryBinding
import com.base.scanqr.utils.BarUtils
class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBinding::inflate) { class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBinding::inflate) {
override fun initView() {
super.initView()
binding.flTop.updatePadding(top = BarUtils.getStatusBarHeight())
}
override fun initListener() {
super.initListener()
}
} }
\ No newline at end of file
...@@ -5,6 +5,8 @@ import androidx.activity.addCallback ...@@ -5,6 +5,8 @@ import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.TextUIBean
import com.base.scanqr.databinding.ActivityTextCodeBinding import com.base.scanqr.databinding.ActivityTextCodeBinding
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import com.base.scanqr.utils.BarUtils import com.base.scanqr.utils.BarUtils
...@@ -13,12 +15,14 @@ import com.base.scanqr.utils.ClipboardUtils.copyText ...@@ -13,12 +15,14 @@ import com.base.scanqr.utils.ClipboardUtils.copyText
import com.base.scanqr.utils.IntentUtils.intentShareText import com.base.scanqr.utils.IntentUtils.intentShareText
import com.base.scanqr.utils.LogEx import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.QRCodeGenerator.generateQRCode import com.base.scanqr.utils.QRCodeGenerator.generateQRCode
import com.base.scanqr.utils.SpJsonUtils
import com.base.scanqr.utils.SpJsonUtils.SCAN_HISTORY_KEY
import com.base.scanqr.utils.ToastUtils.toast import com.base.scanqr.utils.ToastUtils.toast
import java.io.File import java.io.File
class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeBinding::inflate) { class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeBinding::inflate) {
private var content: String = "" private var textUIBean = TextUIBean()
private var tempImage: String = "" private var tempImage: String = ""
override fun initView() { override fun initView() {
super.initView() super.initView()
...@@ -26,15 +30,20 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -26,15 +30,20 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight()) binding.clTop.updatePadding(top = BarUtils.getStatusBarHeight())
val data = intent.extras?.getString("data") ?: "" val data = intent.extras?.getString("data") ?: ""
content = data textUIBean.content = data
binding.tvContent.text = data binding.tvContent.text = data
Thread { Thread {
val bitmap = generateQRCode(content, 735, 735, 5) val bitmap = generateQRCode(textUIBean.content, 735, 735, 5)
SpJsonUtils.addJsonBean<ScanBean>(SCAN_HISTORY_KEY, textUIBean)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
bitmap?.let { bitmap?.let {
textUIBean.content = data
if (textUIBean.createTime == 0L) {
textUIBean.createTime = System.currentTimeMillis()
}
val flag = saveBitmapToFile(it, file.absolutePath) val flag = saveBitmapToFile(it, file.absolutePath)
LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}") LogEx.logDebug(TAG, "flag=$flag tempImage=${file.absolutePath}")
if (flag) { if (flag) {
...@@ -54,7 +63,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -54,7 +63,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
binding.llShare.setOnClickListener { binding.llShare.setOnClickListener {
val intent = intentShareText(content) val intent = intentShareText(textUIBean.content)
runCatching { runCatching {
startActivity(intent) startActivity(intent)
} }
...@@ -84,7 +93,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB ...@@ -84,7 +93,7 @@ class TextCodeActivity : BaseActivity<ActivityTextCodeBinding>(ActivityTextCodeB
} }
} }
binding.llCopy.setOnClickListener { binding.llCopy.setOnClickListener {
copyText(TAG, content) copyText(TAG, textUIBean.content)
toast("Copied to clipboard", true) toast("Copied to clipboard", true)
} }
binding.flSearch.setOnClickListener { binding.flSearch.setOnClickListener {
......
...@@ -5,6 +5,7 @@ import androidx.activity.addCallback ...@@ -5,6 +5,7 @@ import androidx.activity.addCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.scanqr.R import com.base.scanqr.R
import com.base.scanqr.base.BaseActivity import com.base.scanqr.base.BaseActivity
import com.base.scanqr.bean.ScanBean
import com.base.scanqr.bean.WifiUIBean import com.base.scanqr.bean.WifiUIBean
import com.base.scanqr.databinding.ActivityWifiCodeBinding import com.base.scanqr.databinding.ActivityWifiCodeBinding
import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog import com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
...@@ -14,6 +15,8 @@ import com.base.scanqr.utils.ClipboardUtils.copyText ...@@ -14,6 +15,8 @@ import com.base.scanqr.utils.ClipboardUtils.copyText
import com.base.scanqr.utils.IntentUtils.intentShareImage import com.base.scanqr.utils.IntentUtils.intentShareImage
import com.base.scanqr.utils.LogEx import com.base.scanqr.utils.LogEx
import com.base.scanqr.utils.QRCodeGenerator.generateQRCode import com.base.scanqr.utils.QRCodeGenerator.generateQRCode
import com.base.scanqr.utils.SpJsonUtils
import com.base.scanqr.utils.SpJsonUtils.SCAN_HISTORY_KEY
import com.base.scanqr.utils.ToastUtils.toast import com.base.scanqr.utils.ToastUtils.toast
import com.google.gson.Gson import com.google.gson.Gson
import com.gyf.immersionbar.ktx.immersionBar import com.gyf.immersionbar.ktx.immersionBar
...@@ -64,6 +67,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB ...@@ -64,6 +67,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
} }
Thread { Thread {
val bitmap = generateQRCode(wifiContent, 735, 735, 5) val bitmap = generateQRCode(wifiContent, 735, 735, 5)
SpJsonUtils.addJsonBean<ScanBean>(SCAN_HISTORY_KEY, wifiBean)
runOnUiThread { runOnUiThread {
binding.ivQr.setImageBitmap(bitmap) binding.ivQr.setImageBitmap(bitmap)
val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg") val file = File(cacheDir, System.currentTimeMillis().toString() + ".jpg")
......
package com.base.scanqr.utils
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
object SpJsonUtils {
const val SCAN_HISTORY_KEY = "scan_history_key"
fun <T> getSpJsonList(key: String): List<T> {
val sp = AppPreferences.getInstance().getString(key, "")
return if (sp.equals("")) {
listOf()
} else {
val listType = object : TypeToken<List<T>>() {}.type
val users: List<T> = Gson().fromJson(sp, listType)
return users
}
}
fun <T> saveJsonBeanList(key: String, list: List<T>) {
val json = Gson().toJson(list)
AppPreferences.getInstance().put(key, json)
}
fun <T> addJsonBean(key: String, bean: T) {
val arrayList = arrayListOf<T>()
val list = getSpJsonList<T>(key)
arrayList.addAll(list)
arrayList.add(bean)
saveJsonBeanList(key, arrayList.toList())
}
fun <T> removeJsonBean(key: String, bean: T, removeIf: (it1: T, it2: T) -> Boolean) {
val list = getSpJsonList<T>(key).toMutableList()
list.removeIf { removeIf(it, bean) }
saveJsonBeanList(key, list)
}
}
\ No newline at end of file
...@@ -5,7 +5,7 @@ object SpStringUtils { ...@@ -5,7 +5,7 @@ object SpStringUtils {
private val TAG = "SpStringUtils" private val TAG = "SpStringUtils"
const val _KEY = "" // const val KEY = "KEY"
fun getSpStringList(key: String): List<String> { fun getSpStringList(key: String): List<String> {
val sp = AppPreferences.getInstance().getString(key, "") val sp = AppPreferences.getInstance().getString(key, "")
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#6473F8" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ECF6EE"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#EEEFFF" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F4F4F4" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F8E4E6" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout 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" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.main.HistoryFragment"> tools:context=".ui.main.HistoryFragment">
<!-- TODO: Update blank fragment layout --> <FrameLayout
<TextView android:id="@+id/fl_top"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
android:text="@string/hello_blank_fragment" />
</FrameLayout> <TextView
\ No newline at end of file android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:layout_marginVertical="10dp"
android:layout_marginStart="16dp"
android:text="@string/history"
android:textSize="19sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/iv_vip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="16dp"
android:src="@mipmap/h_vip"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="265dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:background="@drawable/bg_f4f4f4_10">
<TextView
android:id="@+id/tv_scan"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginVertical="3dp"
android:layout_marginStart="3dp"
android:layout_weight="1"
android:background="@drawable/bg_6473f8_10"
android:gravity="center"
android:text="@string/scan"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_create"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginVertical="3dp"
android:layout_marginEnd="3dp"
android:layout_weight="1"
android:background="@drawable/bg_transparent"
android:gravity="center"
android:text="@string/create"
android:textColor="#666666"
android:textSize="15sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp">
<LinearLayout
android:id="@+id/ll_sort"
android:layout_width="108dp"
android:layout_height="32dp"
android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_eeefff_10"
android:gravity="center">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/h_sort"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="6dp"
android:includeFontPadding="false"
android:text="@string/sort"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_export"
android:layout_width="108dp"
android:layout_height="32dp"
android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_ecf6ee_10"
android:gravity="center">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/h_export"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="6dp"
android:includeFontPadding="false"
android:text="@string/export"
android:textColor="@color/black" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_remove"
android:layout_width="108dp"
android:layout_height="32dp"
android:layout_marginHorizontal="5dp"
android:background="@drawable/bg_f8e4e6_10"
android:gravity="center">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/h_delete"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="6dp"
android:includeFontPadding="false"
android:text="@string/remove"
android:textColor="@color/black" />
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
tools:listitem="@layout/item_history"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="62dp"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:src="@mipmap/h_wifi"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_marginEnd="2dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="65X1069490602713" />
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:textColor="#999999"
android:textSize="14sp"
tools:text="20 seconds ago" />
</LinearLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/genduo"
tools:ignore="ContentDescription" />
</FrameLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
...@@ -42,4 +42,7 @@ ...@@ -42,4 +42,7 @@
<string name="enter_address_email">Enter address email</string> <string name="enter_address_email">Enter address email</string>
<string name="subject">Subject</string> <string name="subject">Subject</string>
<string name="enter_your_message_here">Enter your message here...</string> <string name="enter_your_message_here">Enter your message here...</string>
<string name="sort">Sort</string>
<string name="export">Export</string>
<string name="remove">Remove</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