Commit 7d3cd81b authored by wanglei's avatar wanglei

...ui

parent 239af647
......@@ -2,7 +2,10 @@ package com.base.datarecovery
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
......@@ -25,6 +28,7 @@ class MyApplication : BaseApplication() {
MobileAds.initialize(this) { initializationStatus ->
}
}
initLifeListener()
}
......@@ -58,18 +62,18 @@ class MyApplication : BaseApplication() {
}
if (flag) {
// if (AdmobUtils.isOpenAdLoaded()) {
// AdmobUtils.showAppOpenAd(activity)
// } else {
// topActivity?.startActivity(
// Intent(
// topActivity,
// NewSplashActivity::class.java
// ).apply {
// putExtra("isHotLaunch", true)
// putExtra("type", -1)
// })
// }
if (AdmobOpenUtils.isOpenAdLoaded()) {
AdmobOpenUtils.showAppOpenAd(activity)
} else {
topActivity?.startActivity(
Intent(
topActivity,
SplashActivity::class.java
).apply {
putExtra("isHotLaunch", true)
putExtra("type", -1)
})
}
}
}
}
......
package com.base.datarecovery.activity
import android.graphics.Color
import android.os.Bundle
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.databinding.ActivityFileRecoveredBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
......@@ -17,6 +23,37 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val number = intent.extras?.getInt("Number") ?: 0
val scanType = intent.extras?.getInt("ScanType")
binding.tvNumber.text = number.toString()
val type = when (scanType) {
SCAN_PHOTOS -> if (number == 1) "Photo" else "Photos"
SCAN_VIDEOS -> if (number == 1) "Video" else "Videos"
SCAN_DOCUMENTS -> if (number == 1) "Document" else "Documents"
else -> ""
}
binding.tvType.text = type
}
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
binding.tvContinue.setOnClickListener {
finish()
}
binding.tvFinish.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
}
\ No newline at end of file
......@@ -6,13 +6,12 @@ import android.graphics.BitmapFactory
import android.graphics.Color
import android.os.Environment
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.adapter.FileMediaColumnsAdapter
import com.base.datarecovery.adapter.FileTimeColumnsAdapter
import com.base.datarecovery.adapter.RecoveryFilterAdapter
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
......@@ -39,7 +38,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}
private var folderBean: FolderBean? = null
private lateinit var adapter: FileMediaColumnsAdapter
private lateinit var adapter: FileTimeColumnsAdapter
private lateinit var filterAdapter: RecoveryFilterAdapter
......@@ -95,7 +94,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}
adapter = FileMediaColumnsAdapter(
adapter = FileTimeColumnsAdapter(scanType,
select = { all, size ->
binding.ivSelectAll.isSelected = all
binding.tvRecover.text = "Recover($size)"
......@@ -125,7 +124,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
binding.switchThumbnails.setOnCheckedChangeListener { buttonView, isChecked ->
adapter.toggleThumbnails(isChecked)
}
binding.ivSelectAll.setOnClickListener {
binding.flSelectAll.setOnClickListener {
binding.ivSelectAll.isSelected = !binding.ivSelectAll.isSelected
adapter.toggleAllSelect(binding.ivSelectAll.isSelected)
}
......@@ -161,7 +160,10 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}, finish = {
adapter.toggleAllSelect(false)
startActivity(Intent(this, FileRecoveredActivity::class.java))
startActivity(Intent(this, FileRecoveredActivity::class.java).apply {
putExtra("Number", list.size)
putExtra("ScanType", scanType)
})
})
}
......
......@@ -10,6 +10,7 @@ import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.bean.FolderBean
import com.base.datarecovery.bean.RecoveryBean
import com.base.datarecovery.bean.RecoveryBean.Companion.setType
import com.base.datarecovery.databinding.ActivityFileScanResultBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
......@@ -90,6 +91,10 @@ class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
val list = hashMap.map {
val folder = it.key.split("/").last()
if (scanType == SCAN_DOCUMENTS) {
it.value.forEach { bean -> bean.setType() }
}
FolderBean(folder, recoveryList = it.value)
}
binding.tvFolderNumber.text = list.size.toString()
......
......@@ -10,10 +10,12 @@ import android.text.style.UnderlineSpan
import android.view.View
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.databinding.ActivitySplashBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.utils.SPUtils
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
......@@ -27,6 +29,7 @@ import kotlin.random.Random
@SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private val TAG = "SplashActivity"
private var job: Job? = null
private val progress = MutableSharedFlow<Int>()
private val progressFlow: SharedFlow<Int> = progress
......@@ -77,6 +80,9 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
}
AdmobNativeUtils.loadNativeAd()
AdmobOpenUtils.loadAppOpenAd {
LogEx.logDebug(TAG, "load where=$it")
}
}
private fun jumpNext() {
......@@ -105,12 +111,25 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
}
}
fun startProgress() = lifecycleScope.launch {
var processTime = 0L
private fun startProgress() = lifecycleScope.launch {
while (isActive) {
delay(Random.nextLong(50, 150))
val value = binding.pb.progress + Random.nextInt(3, 5)
binding.pb.setProgress(value, true)
progress.emit(value)
val delayTime = Random.nextLong(300, 550)
delay(delayTime)
processTime += delayTime
if (processTime >= 3000) {
AdmobOpenUtils.showAppOpenAd(this@SplashActivity) {
LogEx.logDebug(TAG, "where $it")
binding.pb.progress = 100
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
finish()
}
}
}
}
......
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.FolderBean
import com.base.datarecovery.bean.RecoveryBean
import com.base.datarecovery.databinding.ItemMediaBinding
import com.base.datarecovery.databinding.ItemDocumentBinding
import com.base.datarecovery.databinding.ItemTimeMediaBinding
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class FileMediaColumnsAdapter(
class FileTimeColumnsAdapter(
val scanType: Int,
val select: (all: Boolean, size: Int) -> Unit,
) : RecyclerView.Adapter<FileMediaColumnsAdapter.MCV>() {
) : RecyclerView.Adapter<FileTimeColumnsAdapter.MCV>() {
private val beanList = arrayListOf<FolderBean>()
private var hideThumbnails: Boolean = false
......@@ -28,7 +36,7 @@ class FileMediaColumnsAdapter(
class MCV(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MCV {
return MCV(R.layout.item_media.inflate(parent))
return MCV(R.layout.item_time_media.inflate(parent))
}
override fun getItemCount(): Int {
......@@ -36,7 +44,7 @@ class FileMediaColumnsAdapter(
}
override fun onBindViewHolder(holder: MCV, position: Int) {
val binding = ItemMediaBinding.bind(holder.itemView)
val binding = ItemTimeMediaBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beanList[position]
......@@ -45,7 +53,17 @@ class FileMediaColumnsAdapter(
val subAdapter = MediaColumnsAdapter()
binding.rvMediaColumns.layoutManager = GridLayoutManager(context, columns)
if (scanType == SCAN_DOCUMENTS) {
binding.rvMediaColumns.layoutManager = LinearLayoutManager(context)
} else {
binding.rvMediaColumns.layoutManager = GridLayoutManager(context, columns)
binding.rvMediaColumns.layoutParams =
LinearLayout.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT).apply {
topMargin = context.resources.getDimensionPixelOffset(R.dimen.dp_8)
gravity = Gravity.CENTER_HORIZONTAL
}
}
binding.rvMediaColumns.adapter = subAdapter
val list = if (hideThumbnails) bean.recoveryList.filter { !it.isThumbnails } else bean.recoveryList
if (list.isEmpty()) {
......@@ -80,12 +98,15 @@ class FileMediaColumnsAdapter(
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CS {
val layout = when (columns) {
var layout = when (columns) {
2 -> R.layout.item_media_columns2
3 -> R.layout.item_media_columns3
4 -> R.layout.item_media_columns4
else -> R.layout.item_media_columns2
}
if (scanType == SCAN_DOCUMENTS) {
layout = R.layout.item_document
}
return CS(layout.inflate(parent))
}
......@@ -101,23 +122,54 @@ class FileMediaColumnsAdapter(
val context = holder.itemView.context
val data = list[position]
if (payloads.isEmpty()) {
Glide.with(context).asBitmap().load(data.path).centerCrop().into(holder.iv)
holder.iv.tag = data.path
holder.ivSelector.isSelected = data.isSelect
holder.ivSelector.setOnClickListener {
data.isSelect = !data.isSelect
if (scanType == SCAN_DOCUMENTS) {
if (payloads.isEmpty()) {
val binding = ItemDocumentBinding.bind(holder.itemView)
binding.ivSelector.isSelected = data.isSelect
val icon = when (data.type) {
"PDF" -> R.mipmap.pdf
"DOC" -> R.mipmap.doc
"XLS" -> R.mipmap.xls
"PPT" -> R.mipmap.ppt
else -> 0
}
binding.ivType.setImageResource(icon)
val file = File(data.path)
binding.tvName.text = file.name
val time = SimpleDateFormat("MMM-dd-yyyy", Locale.getDefault()).format(file.lastModified())
val size = file.length().toFormatSize()
val info = "$time $size"
binding.tvInfo.text = info
binding.root.setOnClickListener {
data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "asdada")
subItemClick(data)
}
} else {
holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "changeIv")
subItemClick(data)
super.onBindViewHolder(holder, position, payloads)
}
val file = File(data.path)
holder.tvSize.text = file.length().toFormatSize()
} else {
holder.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
if (payloads.isEmpty()) {
Glide.with(context).asBitmap().load(data.path).centerCrop().into(holder.iv)
holder.ivSelector.isSelected = data.isSelect
holder.itemView.setOnClickListener {
data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "changeIv")
subItemClick(data)
}
val file = File(data.path)
holder.tvSize.text = file.length().toFormatSize()
} else {
holder.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
}
@SuppressLint("NotifyDataSetChanged")
......
package com.base.datarecovery.ads
import android.app.Activity
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.pullAd
import com.base.datarecovery.ads.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.utils.LogEx
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import org.json.JSONObject
import java.util.UUID
object AdmobOpenUtils {
private val TAG = "AdmobOpenUtils"
private val mRequest = AdRequest.Builder().build()
private var openLoadTime = Long.MAX_VALUE
private var mOpenAd: AppOpenAd? = null
fun isOpenAdLoaded() = mOpenAd != null
fun loadAppOpenAd(skip: Boolean = false, onLoad: ((where: Int) -> Unit)? = null) {
if (mOpenAd != null || skip) {
onLoad?.invoke(1)
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onLoad?.invoke(2)
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "openAd")
// EventUtils.event("ad_pull_start", ext = obj)
AppOpenAd.load(
BaseApplication.context,
ConfigHelper.openAdmobId,
mRequest,
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(ad: AppOpenAd) {
openLoadTime = System.currentTimeMillis()
mOpenAd = ad
onLoad?.invoke(3)
pullAd(ad.responseInfo, "openAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
override fun onAdFailedToLoad(p0: LoadAdError) {
LogEx.logDebug(TAG, "LoadAdError ${p0.message}")
mOpenAd = null
onLoad?.invoke(4)
pullAd(p0.responseInfo, "openAd", p0.message, reqId = reqId)
}
})
}
fun showAppOpenAd(activity: Activity, skip: Boolean = false, onHidden: ((where: Int) -> Unit)? = null) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onHidden?.invoke(1)
return
}
val obj = JSONObject()
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_prepare_show", ext = obj)
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
mOpenAd = null
loadAppOpenAd()
onHidden?.invoke(2)
val obj = JSONObject()
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_expire", ext = obj)
return
}
if (mOpenAd != null) {
val thisMOpenAd = mOpenAd
mOpenAd = null
thisMOpenAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisMOpenAd?.responseInfo, "openAd")
isMultiClick(thisMOpenAd)
}
override fun onAdDismissedFullScreenContent() {
mOpenAd = null
onHidden?.invoke(3)
loadAppOpenAd()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
mOpenAd = null
onHidden?.invoke(4)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", p0.message)
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
}
override fun onAdShowedFullScreenContent() {
showAd(thisMOpenAd?.responseInfo, "openAd", activity)
}
}
thisMOpenAd?.show(activity)
} else {
onHidden?.invoke(5)
loadAppOpenAd()
val obj = JSONObject()
obj.put("reason", "no_ad")
obj.put("ad_unit", "openAd")
// EventUtils.event("ad_show_error", ext = obj)
}
}
}
\ No newline at end of file
package com.base.datarecovery.bean
import com.base.datarecovery.utils.FileHexEx.isDoc
import com.base.datarecovery.utils.FileHexEx.isDocx
import com.base.datarecovery.utils.FileHexEx.isPPT
import com.base.datarecovery.utils.FileHexEx.isPPTX
import com.base.datarecovery.utils.FileHexEx.isPdf
import com.base.datarecovery.utils.FileHexEx.isXls
import com.base.datarecovery.utils.FileHexEx.isXlsx
import java.io.File
data class RecoveryBean(
val path: String = "",
) {
var isSelect: Boolean = false
var isThumbnails: Boolean = false
var type: String = ""
companion object {
fun RecoveryBean.setType() {
val file = File(path)
if (isPdf(file)) {
type = "PDF"
}
if (isDocx(file) || isDoc(file)) {
type = "DOC"
}
if (isXlsx(file) || isXls(file)) {
type = "XLS"
}
if (isPPTX(file) || isPPT(file)) {
type = "PPT"
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.help
import com.base.datarecovery.activity.SplashActivity
import com.base.datarecovery.utils.SPUtils
object ConfigHelper {
......
......@@ -7,6 +7,7 @@ object LogEx {
val isOpen = true
val filterTAG = arrayOf(
"FileScanActivity",
"FileHexEx"
)
fun logDebug(tag: String, content: String, isMust: Boolean = false) {
......
......@@ -108,9 +108,9 @@ object DialogViews {
val recoveryFile = File(dir, file.name)
file.copyTo(recoveryFile, true)
}
mutableSharedFlow.emit(index + 1)
index++
mutableSharedFlow.emit(index)
delay(Random.nextLong(500, 1500))
index++
}
mutableSharedFlow.emit(-1)
}
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="22.5dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="@color/white" />
<corners android:radius="22.5dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#577DFD"
android:orientation="vertical"
tools:context=".activity.FileRecoveredActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="0dp">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/iv_yanhua"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="18dp"
android:layout_marginTop="25dp"
android:src="@mipmap/tu_yanhua"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_fanhui"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="15sp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="59sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/iv_yanhua"
app:layout_constraintStart_toEndOf="@id/iv_yanhua"
app:layout_constraintTop_toTopOf="@id/iv_yanhua"
tools:text="2" />
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="14dp"
android:layout_marginBottom="10dp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/tv_number"
app:layout_constraintStart_toEndOf="@id/tv_number"
tools:text="Photos" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
android:text="Recovered successfully!"
android:textColor="@color/white"
android:textSize="25sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/iv_yanhua"
app:layout_constraintTop_toBottomOf="@id/iv_yanhua"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:src="@mipmap/tubg_yanhua"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp">
<TextView
android:id="@+id/tv_continue"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_gravity="start"
android:background="@drawable/bg_stroke_ffffff_22"
android:gravity="center"
android:text="Continue"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_finish"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_marginStart="25dp"
android:background="@drawable/bg_f5f5f5_18"
android:gravity="center"
android:text="Finish"
android:textColor="#577DFD"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
......@@ -165,7 +165,8 @@
android:id="@+id/ll_all_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginStart="6dp"
android:layout_marginEnd="16dp"
android:background="@color/white"
android:orientation="horizontal"
android:paddingTop="20dp"
......@@ -173,13 +174,21 @@
app:layout_constraintTop_toBottomOf="@id/cl_top"
app:layout_scrollFlags="scroll|enterAlways">
<ImageView
android:id="@+id/iv_select_all"
<FrameLayout
android:id="@+id/fl_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
android:padding="10dp">
<ImageView
android:id="@+id/iv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:layout_width="0dp"
......@@ -271,7 +280,7 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:background="#FDFDFD"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginVertical="15dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
tools:ignore="ContentDescription"
tools:src="@mipmap/xls" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="xxxx.xls" />
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:textColor="#768294"
android:textSize="12sp"
tools:text="2024-06-20 18.9 KB" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
......@@ -16,7 +16,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginStart="16dp"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
......@@ -25,11 +25,10 @@
<LinearLayout
android:id="@+id/ll_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:layout_marginEnd="16dp"
tools:ignore="UseCompoundDrawables">
<ImageView
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dp_8">8dp</dimen>
</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