Commit 801e9303 authored by wanglei's avatar wanglei

...ui

parent 894540ad
......@@ -4,8 +4,6 @@ import android.annotation.SuppressLint
import android.graphics.BitmapFactory
import android.graphics.Color
import android.view.View
import android.widget.PopupWindow
import android.widget.Toast
import androidx.activity.addCallback
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
......@@ -20,7 +18,9 @@ import com.base.datarecovery.databinding.ActivityFileRecoveryBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.toFormatTime
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.view.PopupWindowViews.showRecoveryFilterPopupWindow
import com.base.datarecovery.utils.TimeUtils.isWithinOneMonth
import com.base.datarecovery.utils.TimeUtils.isWithinSixMonths
import com.base.datarecovery.utils.TimeUtils.isWithinTwentyFourMonths
import com.google.gson.Gson
import java.io.File
......@@ -36,20 +36,20 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
private lateinit var filterAdapter: RecoveryFilterAdapter
private val dateFilter = arrayListOf(
private val dateFilterList = arrayListOf(
RecoveryFilterBean("All", "Size", true),
RecoveryFilterBean("With 1 month", "Date"),
RecoveryFilterBean("With 6 months", "Date"),
RecoveryFilterBean("With 24 months", "Date"),
)
private var sizeFilter = arrayListOf(
private var sizeFilterList = arrayListOf(
RecoveryFilterBean("All", "Size", true),
RecoveryFilterBean("0 - 1 M", "Size"),
RecoveryFilterBean("1 - 5 M", "Size"),
RecoveryFilterBean("> 5 M", "Size"),
)
private val layoutFilter = arrayListOf(
private val layoutFilterList = arrayListOf(
RecoveryFilterBean("2 columns", "Layout", true),
RecoveryFilterBean("3 columns", "Layout"),
RecoveryFilterBean("4 columns", "Layout"),
......@@ -88,7 +88,7 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
}
adapter = FileMediaColumnsAdapter(2,
adapter = FileMediaColumnsAdapter(
select = { all, size ->
binding.ivSelectAll.isSelected = all
binding.tvRecover.text = "Recover($size)"
......@@ -143,19 +143,19 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
if (filter == R.id.ll_date) {
binding.ivDate.setImageResource(R.mipmap.zhankai)
filterAdapter.setData(dateFilter)
filterAdapter.setData(dateFilterList)
} else {
binding.ivDate.setImageResource(R.mipmap.shouqi)
}
if (filter == R.id.ll_size) {
binding.ivSize.setImageResource(R.mipmap.zhankai)
filterAdapter.setData(sizeFilter)
filterAdapter.setData(sizeFilterList)
} else {
binding.ivSize.setImageResource(R.mipmap.shouqi)
}
if (filter == R.id.ll_layout) {
binding.ivLayout.setImageResource(R.mipmap.zhankai)
filterAdapter.setData(layoutFilter)
filterAdapter.setData(layoutFilterList)
} else {
binding.ivLayout.setImageResource(R.mipmap.shouqi)
}
......@@ -170,18 +170,29 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
recoveryFilterBean?.let { bean ->
if (bean.type == "Date") {
dateFilter.find { it.isSelect }?.isSelect = false
dateFilter.find { it == bean }?.isSelect = true
dateFilterList.find { it.isSelect }?.isSelect = false
dateFilterList.find { it == bean }?.isSelect = true
initData()
return
}
if (bean.type == "Size") {
sizeFilter.find { it.isSelect }?.isSelect = false
sizeFilter.find { it == bean }?.isSelect = true
sizeFilterList.find { it.isSelect }?.isSelect = false
sizeFilterList.find { it == bean }?.isSelect = true
initData()
return
}
if (bean.type == "Layout") {
layoutFilter.find { it.isSelect }?.isSelect = false
layoutFilter.find { it == bean }?.isSelect = true
layoutFilterList.find { it.isSelect }?.isSelect = false
layoutFilterList.find { it == bean }?.isSelect = true
val index = layoutFilterList.indexOf(bean)
val columns = when (index) {
0 -> 2
1 -> 3
2 -> 4
else -> 2
}
adapter.changeColumns(columns)
}
}
......@@ -190,17 +201,19 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
private fun initData() {
val hash = HashMap<String, ArrayList<RecoveryBean>>()
folderBean?.let {
it.recoveryList.forEach { recoveryBean ->
val file = File(recoveryBean.path)
val time = file.lastModified().toFormatTime()
if (hash[time].isNullOrEmpty()) {
hash[time] = arrayListOf()
if (dateFilter(recoveryBean) && sizeFilter(recoveryBean)) {
val file = File(recoveryBean.path)
val time = file.lastModified().toFormatTime()
if (hash[time].isNullOrEmpty()) {
hash[time] = arrayListOf()
}
hash[time]?.add(recoveryBean)
}
hash[time]?.add(recoveryBean)
}
}
val list = arrayListOf<FolderBean>()
......@@ -210,4 +223,26 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
adapter.setData(list)
}
private fun dateFilter(recoveryBean: RecoveryBean): Boolean {
val index = dateFilterList.indexOfFirst { it.isSelect }
return when (index) {
1 -> isWithinOneMonth(File(recoveryBean.path).lastModified())
2 -> isWithinSixMonths(File(recoveryBean.path).lastModified())
3 -> isWithinTwentyFourMonths(File(recoveryBean.path).lastModified())
else -> true
}
}
private fun sizeFilter(recoveryBean: RecoveryBean): Boolean {
val oneMegabyte = 1024 * 1024L
val index = sizeFilterList.indexOfFirst { it.isSelect }
return when (index) {
1 -> File(recoveryBean.path).length() in 0L..oneMegabyte
2 -> File(recoveryBean.path).length() in oneMegabyte..oneMegabyte * 5
3 -> File(recoveryBean.path).length() > oneMegabyte * 5
else -> true
}
}
}
\ No newline at end of file
......@@ -18,12 +18,12 @@ import com.bumptech.glide.Glide
import java.io.File
class FileMediaColumnsAdapter(
val columns: Int,
val select: (all: Boolean, size: Int) -> Unit,
) : RecyclerView.Adapter<FileMediaColumnsAdapter.MCV>() {
private val beanList = arrayListOf<FolderBean>()
private var hideThumbnails: Boolean = false
private var columns: Int = 2
class MCV(view: View) : ViewHolder(view)
......@@ -177,4 +177,8 @@ class FileMediaColumnsAdapter(
notifyDataSetChanged()
}
fun changeColumns(columns: Int) {
this.columns = columns
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.base.datarecovery.utils
import java.util.Calendar
object TimeUtils {
fun isWithinOneMonth(pastTimestamp: Long): Boolean {
val calendar = Calendar.getInstance()
val currentTime = System.currentTimeMillis()
// 将当前时间减去一个月
calendar.timeInMillis = currentTime
calendar.add(Calendar.MONTH, -1)
val oneMonthAgo = calendar.timeInMillis
// 检查过去的时间戳是否在当前时间与一个月前之间
return pastTimestamp in oneMonthAgo..currentTime
}
fun isWithinSixMonths(pastTimestamp: Long): Boolean {
val calendar = Calendar.getInstance() // 获取当前时间的Calendar实例
val currentTime = System.currentTimeMillis() // 获取当前时间的时间戳
// 设置calendar到当前时间
calendar.timeInMillis = currentTime
// 减去6个月
calendar.add(Calendar.MONTH, -6)
val sixMonthsAgo = calendar.timeInMillis // 计算6个月前的日期
// 检查过去的时间戳是否在6个月的范围内
return pastTimestamp in sixMonthsAgo..currentTime
}
fun isWithinTwentyFourMonths(timestamp: Long): Boolean {
val calendar = Calendar.getInstance() // 获取当前时间的Calendar实例
val currentTime = System.currentTimeMillis() // 获取当前时间的时间戳
// 设置calendar到当前时间
calendar.timeInMillis = currentTime
// 减去24个月
calendar.add(Calendar.MONTH, -24)
val twentyFourMonthsAgo = calendar.timeInMillis // 计算24个月前的日期
// 检查时间戳是否在24个月的范围内
return timestamp in twentyFourMonthsAgo..currentTime
}
}
\ No newline at end of file
package com.base.datarecovery.view
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.View
import android.widget.FrameLayout
import android.widget.PopupWindow
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.adapter.RecoveryFilterAdapter
import com.base.datarecovery.bean.RecoveryFilterBean
import com.base.datarecovery.databinding.PopupwindowRecoveryFilterBinding
import com.base.datarecovery.view.XmlEx.inflate
object PopupWindowViews {
fun showRecoveryFilterPopupWindow(
view: View,
list: List<RecoveryFilterBean>,
click: (bean: RecoveryFilterBean) -> Unit,
dismiss: () -> Unit
): PopupWindow {
val popupWindowView = R.layout.popupwindow_recovery_filter.inflate(view.context)
val popupWindowHeight = FrameLayout.LayoutParams.WRAP_CONTENT
val binding = PopupwindowRecoveryFilterBinding.bind(popupWindowView)
val popupWindow = PopupWindow(popupWindowView, view.width, popupWindowHeight, true)
popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
popupWindow.isOutsideTouchable = false
popupWindow.isTouchable = true
val adapter = RecoveryFilterAdapter {
click.invoke(it)
popupWindow.dismiss()
}
binding.rv.adapter = adapter
adapter.setData(list)
popupWindow.showAsDropDown(view)
popupWindow.setOnDismissListener {
dismiss.invoke()
}
return popupWindow
}
}
\ No newline at end of file
......@@ -161,49 +161,52 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.coordinatorlayout.widget.CoordinatorLayout
<LinearLayout
android:id="@+id/ll_all_select"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_top">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:background="@color/white"
android:orientation="horizontal"
android:paddingTop="20dp"
android:paddingBottom="10dp"
app:layout_constraintTop_toBottomOf="@id/cl_top"
app:layout_scrollFlags="scroll|enterAlways">
<ImageView
android:id="@+id/iv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:background="@color/white"
android:orientation="horizontal"
android:paddingTop="20dp"
android:paddingBottom="10dp"
app:layout_scrollFlags="scroll|enterAlways">
android:layout_gravity="center_vertical"
android:src="@drawable/b_circle_selector"
tools:ignore="ContentDescription" />
<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/b_circle_selector"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:text="Select all"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:src="@mipmap/qiehuan"
tools:ignore="ContentDescription" />
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:text="Select all"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_all_select">
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:src="@mipmap/qiehuan"
tools:ignore="ContentDescription" />
</LinearLayout>
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
......
......@@ -2,8 +2,8 @@
<androidx.cardview.widget.CardView 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="105dp"
android:layout_height="105dp"
android:layout_width="85dp"
android:layout_height="85dp"
android:layout_margin="8dp"
app:cardCornerRadius="12.5dp">
......
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