Commit 784df70b authored by wanglei's avatar wanglei

...

parent a6862095
...@@ -46,6 +46,18 @@ ...@@ -46,6 +46,18 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".activity.largefile.LargeFileAnimationActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.largefile.LargeFileActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity <activity
android:name=".activity.appmanager.AppManagerAnimationActivity" android:name=".activity.appmanager.AppManagerAnimationActivity"
android:exported="false" android:exported="false"
......
...@@ -7,6 +7,7 @@ import androidx.activity.OnBackPressedCallback ...@@ -7,6 +7,7 @@ import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.junkclean.ScanJunkActivity import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity import com.base.datarecovery.activity.recovery.FileScanResultActivity
...@@ -96,8 +97,9 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() { ...@@ -96,8 +97,9 @@ class ResultActivity : BaseActivity<ActivityLayoutResultBinding>() {
WHATSAPP_CLEANER -> { WHATSAPP_CLEANER -> {
startActivity(Intent(this, WhatsAppCleanerAnimationActivity::class.java)) startActivity(Intent(this, WhatsAppCleanerAnimationActivity::class.java))
} }
LARGE_FILE->{
LARGE_FILE -> {
startActivity(Intent(this, LargeFileAnimationActivity::class.java))
} }
} }
finish() finish()
......
package com.base.datarecovery.activity.largefile
import android.annotation.SuppressLint
import android.content.Intent
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 androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.adapter.LargeFileAdapter
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.bean.ConstObject
import com.base.datarecovery.databinding.ActivityLargeFileBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.MediaStoreHelp
import com.base.datarecovery.help.MediaStoreHelp.getAllMedia
import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.view.DialogViews.showDeletePermanentlyDialog
import com.base.datarecovery.view.DialogViews.showExitFunctionDialog
import com.base.datarecovery.view.DialogViews.showGerPermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
private lateinit var largeFileAdapter: LargeFileAdapter
override val binding: ActivityLargeFileBinding by lazy {
ActivityLargeFileBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun initView() {
largeFileAdapter = LargeFileAdapter(itemClick = {}, selectClick = {
if (it.isNotEmpty()) {
binding.tvDelete.isEnabled = true
binding.tvDelete.text = "Delete(${it.sumOf { bean -> bean.size }.toFormatSize()})"
} else {
binding.tvDelete.isEnabled = false
}
})
binding.rv.adapter = largeFileAdapter
if (checkStorePermission()) {
initData()
} else {
showGerPermission(null, deny = { finishToMain() }, allow = {
requestStorePermission(launcher) {
if (it) initData() else finishToMain()
}
})
}
}
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
showExitFunctionDialog { show ->
if (show) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@LargeFileActivity) {
finishToMain()
}
} else {
finishToMain()
}
}
}
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.tvDelete.setOnClickListener {
showDeletePermanentlyDialog {
deleteFiles()
}
}
}
private fun deleteFiles() = lifecycleScope.launch(Dispatchers.IO) {
val list = largeFileAdapter.getSelectData()
runCatching {
list.forEach { bean ->
File(bean.path).delete()
}
}
launch(Dispatchers.Main) {
largeFileAdapter.removeData(list)
delay(1000)
startActivity(Intent(this@LargeFileActivity, ResultActivity::class.java).apply {
putExtra("from", ConstObject.LARGE_FILE)
})
finish()
}
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val beanList = getAllMedia { size -> size > 1024 * 1024 * 50 }
launch(Dispatchers.Main) {
binding.ivEmpty.isVisible = beanList.isEmpty()
largeFileAdapter.setData(beanList)
}
}
}
\ No newline at end of file
package com.base.datarecovery.activity.largefile
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.databinding.ActivityLargeFileAnimationBinding
import com.base.datarecovery.help.BaseActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class LargeFileAnimationActivity : BaseActivity<ActivityLargeFileAnimationBinding>() {
override val binding: ActivityLargeFileAnimationBinding by lazy {
ActivityLargeFileAnimationBinding.inflate(layoutInflater)
}
override fun initView() {
playLottie()
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
Toast.makeText(this@LargeFileAnimationActivity, "wait a moment", Toast.LENGTH_SHORT).show()
}
}
@SuppressLint("SetTextI18n")
private fun playLottie(showFinish: (() -> Unit)? = null) {
lifecycleScope.launch(Dispatchers.Main) {
delay(5000)
binding.lottie.visibility = View.GONE
binding.lottie.clearAnimation()
binding.lottieCompleted.visibility = View.VISIBLE
binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!"
delay(1000)
AdmobMaxHelper.admobMaxShowInterstitialAd(this@LargeFileAnimationActivity) {
showFinish?.invoke()
startActivity(Intent(this@LargeFileAnimationActivity, LargeFileActivity::class.java))
finish()
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.text.format.Formatter
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ItemLargeFileBinding
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.XmlEx.inflate
class LargeFileAdapter(
val itemClick: (data: MediaBean) -> Unit,
val selectClick: (selectList: List<MediaBean>) -> Unit
) : Adapter<LargeFileAdapter.UUU>() {
private val TAG = "BigFileAdapter"
private val files = arrayListOf<MediaBean>()
class UUU(view: View) : ViewHolder(view) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UUU {
return UUU(R.layout.item_large_file.inflate(parent))
}
override fun getItemCount(): Int {
return files.size
}
override fun onBindViewHolder(holder: UUU, position: Int) {
}
override fun onBindViewHolder(holder: UUU, position: Int, payloads: MutableList<Any>) {
val binding = ItemLargeFileBinding.bind(holder.itemView)
val data = files[position]
val content = holder.itemView.context
if (payloads.isEmpty()) {
binding.tvName.text = data.path.substring(data.path.lastIndexOf("/") + 1)
binding.tvSize.text = Formatter.formatFileSize(content, data.size)
binding.root.setOnClickListener {
itemClick.invoke(data)
}
binding.ivSelector.isSelected = data.isSelect
binding.flSelect.setOnClickListener {
data.isSelect = !data.isSelect
binding.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "dasds")
val selectList = files.filter { it.isSelect }
selectClick.invoke(selectList)
}
} else {
binding.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(bigFileList: List<MediaBean>) {
bigFileList.forEach {
LogEx.logDebug(TAG, "$it")
}
files.clear()
files.addAll(bigFileList)
files.sortByDescending { it.size }
notifyDataSetChanged()
}
fun getSelectData(): List<MediaBean> {
return files.filter { it.isSelect }
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(deleteList: List<MediaBean>) {
files.removeAll(deleteList.toSet())
notifyDataSetChanged()
}
fun isEmpty(): Boolean {
return files.isEmpty()
}
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ import android.net.Uri ...@@ -5,6 +5,7 @@ import android.net.Uri
data class MediaBean( data class MediaBean(
val path: String = "", val path: String = "",
val uri: Uri = Uri.EMPTY, val uri: Uri = Uri.EMPTY,
val size:Long=0,
val time: Long = 0, val time: Long = 0,
val mimeType: String = "", val mimeType: String = "",
) { ) {
......
...@@ -11,6 +11,8 @@ import com.base.datarecovery.activity.SettingActivity ...@@ -11,6 +11,8 @@ import com.base.datarecovery.activity.SettingActivity
import com.base.datarecovery.activity.appmanager.AppManagerActivity import com.base.datarecovery.activity.appmanager.AppManagerActivity
import com.base.datarecovery.activity.appmanager.AppManagerAnimationActivity import com.base.datarecovery.activity.appmanager.AppManagerAnimationActivity
import com.base.datarecovery.activity.junkclean.ScanJunkActivity import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.largefile.LargeFileActivity
import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
...@@ -76,6 +78,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -76,6 +78,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
binding.cardAppManager.setOnClickListener { binding.cardAppManager.setOnClickListener {
startActivity(Intent(requireContext(), AppManagerAnimationActivity::class.java)) startActivity(Intent(requireContext(), AppManagerAnimationActivity::class.java))
} }
binding.cardLargeFile.setOnClickListener {
startActivity(Intent(requireContext(), LargeFileAnimationActivity::class.java))
}
binding.flSetting.setOnClickListener { binding.flSetting.setOnClickListener {
startActivity(Intent(requireContext(), SettingActivity::class.java)) startActivity(Intent(requireContext(), SettingActivity::class.java))
......
...@@ -9,12 +9,47 @@ import android.net.Uri ...@@ -9,12 +9,47 @@ import android.net.Uri
import android.os.Environment import android.os.Environment
import android.provider.MediaStore import android.provider.MediaStore
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import java.io.File
object MediaStoreHelp { object MediaStoreHelp {
@SuppressLint("Recycle")
fun Context.getAllMedia(filter: (size: Long) -> Boolean): MutableList<MediaBean> {
val files: MutableList<MediaBean> = ArrayList()
var cursor: Cursor? = null
try {
val uri = MediaStore.Files.getContentUri("external")
cursor = contentResolver.query(uri, null, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val path = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA).let { cursor.getString(it) } ?: ""
val mimeType =
cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE).let { cursor.getString(it) } ?: ""
val size = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE).let { cursor.getLong(it) }
val modifiedDate =
cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED).let { cursor.getLong(it) }
val info = MediaBean(
path = path,
size = size,
mimeType = mimeType,
time = modifiedDate
)
if (filter(size)) {
files.add(info)
}
}
}
} catch (e: java.lang.Exception) {
e.printStackTrace()
} finally {
cursor?.close()
}
return files
}
@SuppressLint("Range") @SuppressLint("Range")
fun Context.getImageMedia( fun Context.getImageMedia(
list: ArrayList<MediaBean>, list: ArrayList<MediaBean>,
...@@ -51,7 +86,7 @@ object MediaStoreHelp { ...@@ -51,7 +86,7 @@ object MediaStoreHelp {
val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED)) val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED))
val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE)) val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE))
list.add(MediaBean(path, uri, time, mimeType)) list.add(MediaBean(path = path, uri = uri, time = time, mimeType = mimeType))
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
...@@ -102,7 +137,7 @@ object MediaStoreHelp { ...@@ -102,7 +137,7 @@ object MediaStoreHelp {
val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)) val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED))
val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE)) val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE))
list.add(MediaBean(path, uri, time, mimeType)) list.add(MediaBean(path = path, uri = uri, time = time, mimeType = mimeType))
} }
} }
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#999A9C" android:state_enabled="false" />
<item android:color="@color/white" android:state_enabled="true" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:drawable="@drawable/bg_577dfd_22"/>
<item android:state_enabled="false" android:drawable="@drawable/bg_e6e7e9_22"/>
</selector>
\ 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="#E6E7E9" />
<corners android:radius="22dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
tools:context=".activity.largefile.LargeFileActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white"
tools:ignore="UselessParent">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="50dp"
android:layout_height="50dp"
tools:ignore="UselessParent">
<ImageView
android:layout_width="17dp"
android:layout_height="17dp"
android:layout_gravity="center"
android:src="@mipmap/quit"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Large File Cleaner"
android:textColor="#000000"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:layout_marginStart="15dp"
android:text="All types"
android:textColor="#333333"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="5dp"
android:padding="15dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/arrow_l"
tools:ignore="ContentDescription" />
</FrameLayout>
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_large_file" />
<ImageView
android:id="@+id/iv_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/queshengye"
android:visibility="gone"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_delete"
android:layout_width="289dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:background="@drawable/bg_delete_selector"
android:enabled="false"
android:gravity="center"
android:text="Delete"
android:textColor="@color/color_delete_selector"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
\ 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"
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="@color/white"
tools:context=".activity.largefile.LargeFileAnimationActivity">
<com.base.datarecovery.view.XmlLottieAnimationView
android:id="@+id/lottie"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginHorizontal="80dp"
android:adjustViewBounds="true"
app:layout_constraintBottom_toTopOf="@+id/tv"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.7"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/new_lottie_large_file" />
<com.base.datarecovery.view.XmlLottieAnimationView
android:id="@+id/lottie_completed"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/tv"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:lottie_autoPlay="false"
app:lottie_rawRes="@raw/loading_completed" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="250dp"
android:gravity="center"
android:text="Wait a moment..."
android:textColor="#333333"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="10dp">
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_marginStart="5dp"
app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/largeicon"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/card"
app:layout_constraintEnd_toStartOf="@id/fl_select"
app:layout_constraintStart_toEndOf="@id/card"
app:layout_constraintTop_toTopOf="@id/card">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="#333333"
android:textSize="15sp"
android:textStyle="bold"
tools:text="aaaaa.xxx" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textColor="#999999"
android:textSize="12sp"
tools:text="8.7 MB" />
</LinearLayout>
<FrameLayout
android:id="@+id/fl_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="24dp"
android:layout_height="24dp"
android:background="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
</FrameLayout>
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="12dp"
android:layout_marginEnd="10dp"
android:background="#F4F4F4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/fl_select"
app:layout_constraintStart_toStartOf="@id/ll"
app:layout_constraintTop_toBottomOf="@id/ll" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
This diff is collapsed.
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