Commit 9bcd694b authored by wanglei's avatar wanglei

...ui

parent 41821fcb
......@@ -18,6 +18,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.DataRecovery"
tools:targetApi="31">
<activity
android:name=".activity.PrivacyImportActivity"
android:exported="false" />
<activity
android:name=".activity.PinActivity"
android:exported="false" />
......
package com.base.datarecovery.activity
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.view.View
import android.widget.Toast
import androidx.activity.addCallback
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.bean.ConstObject.rememberOption
import com.base.datarecovery.bean.ConstObject.rememberRemove
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ActivityPrivacyImportBinding
import com.base.datarecovery.fragment.PrivacyFileImportFragment
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.MediaStoreHelp.updateMediaStore
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showRemoveOriginalTip
import com.google.android.gms.ads.MediationUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class PrivacyImportActivity : BaseActivity<ActivityPrivacyImportBinding>() {
private val TAG = "PrivacyImportActivity"
private val photosImportFragment: PrivacyFileImportFragment by lazy {
PrivacyFileImportFragment("Photos")
}
private val videosImportFragment: PrivacyFileImportFragment by lazy {
PrivacyFileImportFragment("Videos")
}
private val fragments by lazy {
mutableListOf(photosImportFragment, videosImportFragment)
}
override val binding: ActivityPrivacyImportBinding by lazy {
ActivityPrivacyImportBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.viewpager2.run {
adapter = object : FragmentStateAdapter(this@PrivacyImportActivity) {
override fun getItemCount(): Int {
return fragments.size
}
override fun createFragment(position: Int): Fragment {
return fragments[position]
}
}
}
binding.viewpager2.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
if (position == 0) {
binding.llPhotos.isSelected = true
binding.llVideos.isSelected = false
} else {
binding.llVideos.isSelected = true
binding.llPhotos.isSelected = false
}
}
})
}
override fun initListener() {
super.initListener()
binding.llPhotos.setOnClickListener {
binding.viewpager2.currentItem = 0
}
binding.llVideos.setOnClickListener {
binding.viewpager2.currentItem = 1
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finish()
}
}
private val photosPath = arrayListOf<MediaBean>()
private val videosPath = arrayListOf<MediaBean>()
@SuppressLint("SetTextI18n")
fun showCardImport(type: String, list: List<MediaBean>) {
if (type == "Photos") {
photosPath.clear()
photosPath.addAll(list)
} else {
videosPath.clear()
videosPath.addAll(list)
}
val allSelect = arrayListOf<MediaBean>()
allSelect.addAll(photosPath)
allSelect.addAll(videosPath)
if (allSelect.isNotEmpty()) {
binding.cardImport.isVisible = true
binding.tvSelectNumber.text = "${allSelect.size} Selected"
binding.tvSize.text = allSelect.sumOf { File(it.path).length() }.toFormatSize()
binding.tvImport.setOnClickListener {
if (!rememberOption) {
showRemoveOriginalTip { isRememberOption, isRemove ->
rememberOption = isRememberOption
rememberRemove = isRemove
copyMediaToPrivacySpace(allSelect)
}
} else {
copyMediaToPrivacySpace(allSelect)
}
}
} else {
binding.tvImport.setOnClickListener {}
binding.cardImport.isVisible = false
}
}
private fun copyMediaToPrivacySpace(allSelect: ArrayList<MediaBean>) {
binding.flProgress.setOnClickListener { }
binding.flProgress.visibility = View.VISIBLE
lifecycleScope.launch(Dispatchers.IO) {
allSelect.forEach {
LogEx.logDebug(TAG, it.mintype)
val dir = filesDir
val file = File(it.path)
runCatching {
if (it.mintype.contains("image")) {
val imageDir = File(dir, "photos")
file.copyTo(File(imageDir, file.name), true)
} else {
val videoDir = File(dir, "videos")
file.copyTo(File(videoDir, file.name), true)
}
if (rememberRemove) {
file.delete()
}
}
}
updateMediaStore()
launch(Dispatchers.Main) {
binding.flProgress.visibility = View.GONE
setResult(0, Intent().apply { putExtra("Result", "Success") })
finish()
}
}
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.base.datarecovery.activity
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
......@@ -16,6 +17,9 @@ import com.base.datarecovery.fragment.PrivacyPageFragment
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.utils.BarUtils
/**
* 隐私空间
*/
class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
override val binding: ActivityPrivacySpaceBinding by lazy {
......@@ -74,6 +78,12 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
binding.llVideos.setOnClickListener {
binding.viewpager2.currentItem = 1
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
......
......@@ -7,12 +7,14 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.databinding.ItemMediaGridBinding
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
class FileGridAdapter : RecyclerView.Adapter<FileGridAdapter.FFF>() {
private val beanList = arrayListOf<String>()
private val TAG = "FileGridAdapter"
inner class FFF(view: View) : ViewHolder(view)
......@@ -27,7 +29,9 @@ class FileGridAdapter : RecyclerView.Adapter<FileGridAdapter.FFF>() {
override fun onBindViewHolder(holder: FFF, position: Int) {
val binding = ItemMediaGridBinding.bind(holder.itemView)
val context = holder.itemView.context
Glide.with(context).load(beanList[position]).centerCrop().into(binding.iv)
val data = beanList[position]
LogEx.logDebug(TAG, data)
Glide.with(context).load(data).centerCrop().into(binding.iv)
}
@SuppressLint("NotifyDataSetChanged")
......
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.bean.MediaTimeBean
import com.base.datarecovery.databinding.ItemTimeMedia2Binding
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
class MediaAdapter(private val clickAction: (Pair<Boolean, List<MediaBean>>) -> Unit) : RecyclerView.Adapter<MediaAdapter.NNN>() {
private val beanList = arrayListOf<MediaTimeBean>()
inner class NNN(view: View) : ViewHolder(view) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NNN {
return NNN(R.layout.item_time_media2.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
override fun onBindViewHolder(holder: NNN, position: Int) {}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: NNN, position: Int, payloads: MutableList<Any>) {
val binding = ItemTimeMedia2Binding.bind(holder.itemView)
// val context = holder.itemView.context
val bean = beanList[position]
if (payloads.isEmpty()) {
binding.tvTime.text = bean.time + " (${bean.beans.size})"
binding.ivSelector.isSelected = bean.isSelect
val subAdapter = MediaSubAdapter(bean.beans)
binding.rvMediaColumns.adapter = subAdapter
binding.flSelect.setOnClickListener {
bean.isSelect = !bean.isSelect
binding.ivSelector.isSelected = bean.isSelect
notifyItemChanged(position, "222")
toggleSubList(bean, subAdapter)
}
} else {
binding.ivSelector.isSelected = bean.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
private fun toggleSubList(bean: MediaTimeBean, subAdapter: MediaSubAdapter) {
bean.beans.forEach { it.isSelect = bean.isSelect }
subAdapter.notifyDataSetChanged()
clickAction.invoke(getSelectData())
}
private fun getSelectData(): Pair<Boolean, List<MediaBean>> {
val flatMap = beanList.flatMap { it.beans }
val allSelect = flatMap.all { it.isSelect }
val pathList = flatMap.filter { it.isSelect }
return Pair(allSelect, pathList)
}
private inner class MediaSubAdapter(val list: List<MediaBean>) : RecyclerView.Adapter<MediaSubAdapter.Sub>() {
inner class Sub(view: View) : ViewHolder(view) {
val iv = view.findViewById<ImageView>(R.id.iv)
val ivSelector = view.findViewById<ImageView>(R.id.iv_selector)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Sub {
return Sub(R.layout.item_media_grid_select.inflate(parent))
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: Sub, position: Int) {
}
override fun onBindViewHolder(holder: Sub, position: Int, payloads: MutableList<Any>) {
val context = holder.itemView.context
val data = list[position]
if (payloads.isEmpty()) {
Glide.with(context).load(data.path).centerCrop().into(holder.iv)
holder.ivSelector.isSelected = data.isSelect
holder.itemView.setOnClickListener {
data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect
this.notifyItemChanged(position, "hh")
clickAction.invoke(getSelectData())
}
} else {
holder.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun toggleAllSelect(select: Boolean) {
beanList.forEach { it.isSelect = select }
beanList.flatMap { it.beans }.forEach { it.isSelect = select }
notifyDataSetChanged()
clickAction.invoke(getSelectData())
}
@SuppressLint("NotifyDataSetChanged")
fun setData(list: List<MediaTimeBean>) {
beanList.clear()
beanList.addAll(list)
notifyDataSetChanged()
}
}
\ No newline at end of file
......@@ -17,4 +17,22 @@ object ConstObject {
field = value
SPUtils.getInstance().put("ifAgreePrivacy", value, true)
}
var rememberOption = false
get() {
return SPUtils.getInstance().getBoolean("rememberOption", field)
}
set(value) {
field = value
SPUtils.getInstance().put("rememberOption", value, true)
}
var rememberRemove = false
get() {
return SPUtils.getInstance().getBoolean("rememberRemove", field)
}
set(value) {
field = value
SPUtils.getInstance().put("rememberRemove", value, true)
}
}
\ No newline at end of file
package com.base.datarecovery.bean
import android.net.Uri
data class MediaBean(
val path: String = "",
val uri: Uri = Uri.EMPTY,
val time: Long = 0,
val mintype:String,
) {
var isSelect: Boolean = false
}
\ No newline at end of file
package com.base.datarecovery.bean
import android.net.Uri
data class MediaTimeBean(
val time: String = "",
val beans: List<MediaBean> = listOf()
) {
var isSelect: Boolean = false
}
\ No newline at end of file
package com.base.datarecovery.fragment
import android.annotation.SuppressLint
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.PrivacyImportActivity
import com.base.datarecovery.adapter.MediaAdapter
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.bean.MediaTimeBean
import com.base.datarecovery.databinding.FragmentPrivacyFileImportBinding
import com.base.datarecovery.help.BaseFragment
import com.base.datarecovery.help.MediaStoreHelp.getImageMedia
import com.base.datarecovery.help.MediaStoreHelp.getVideoMedia
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.HashMap
import java.util.Locale
class PrivacyFileImportFragment(val type: String) : BaseFragment<FragmentPrivacyFileImportBinding>() {
override val binding: FragmentPrivacyFileImportBinding by lazy {
FragmentPrivacyFileImportBinding.inflate(layoutInflater)
}
private lateinit var adapter: MediaAdapter
override fun setView() {
adapter = MediaAdapter { pair ->
binding.tvSelectAll.text = if (pair.first) "Unselect ALL" else "Select All"
(requireActivity() as PrivacyImportActivity).showCardImport(type,pair.second)
}
binding.rv.adapter = adapter
initData()
}
@SuppressLint("SetTextI18n")
override fun setListener() {
binding.tvSelectAll.setOnClickListener {
val text = binding.tvSelectAll.text
if (text == "Unselect ALL") {
adapter.toggleAllSelect(false)
} else {
adapter.toggleAllSelect(true)
}
}
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val list = arrayListOf<MediaBean>()
if (type == "Photos") {
requireContext().getImageMedia(list)
} else {
requireContext().getVideoMedia(list)
}
val hashMap = HashMap<String, ArrayList<MediaBean>>()
list.forEach {
val time = SimpleDateFormat("yyyy-MMM-dd", Locale.getDefault()).format(it.time)
if (hashMap[time].isNullOrEmpty()) {
hashMap[time] = arrayListOf()
}
hashMap[time]?.add(it)
}
val beanList = hashMap.map {
MediaTimeBean(it.key, it.value)
}
launch(Dispatchers.Main) {
adapter.setData(beanList)
}
}
}
\ No newline at end of file
package com.base.datarecovery.fragment
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.PrivacyImportActivity
import com.base.datarecovery.activity.PrivacySpaceActivity
import com.base.datarecovery.adapter.FileGridAdapter
import com.base.datarecovery.databinding.FragmentPrivacyPageBinding
import com.base.datarecovery.help.BaseFragment
import com.base.datarecovery.help.FileHelp.loadFileByFilter
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import com.base.datarecovery.view.DialogViews.showImageImportDialog
import java.io.File
......@@ -30,7 +37,18 @@ class PrivacyPageFragment(
override fun setListener() {
arrayOf(binding.ivAdd, binding.ivAddEmpty).forEach {
it.setOnClickListener {
requireContext().showImageImportDialog()
requireContext().showImageImportDialog(import = {
val launcher = (requireActivity() as PrivacySpaceActivity).launcher
launcher.launch(
Intent(requireContext(), PrivacyImportActivity::class.java)
) { activityResult ->
val result = activityResult.data?.extras?.getString("Result")
Toast.makeText(requireContext(), result, Toast.LENGTH_SHORT).show()
initData()
}
}, camera = {
requireContext().showCameraSettingDialog()
})
}
}
......@@ -50,10 +68,14 @@ class PrivacyPageFragment(
lifecycleScope.loadFileByFilter(folder = dir,
filter = { true },
onDo = { list.add(it.absolutePath) },
onDo = {
LogEx.logDebug(TAG, "$it")
list.add(it.absolutePath)
},
onFinish = {
if (list.isNotEmpty()) {
binding.flEmpty.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.ivAdd.visibility = View.VISIBLE
binding.tvManager.visibility = View.VISIBLE
adapter.setData(list)
......
package com.base.datarecovery.help
import android.annotation.SuppressLint
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.media.MediaScannerConnection
import android.net.Uri
import android.os.Environment
import android.provider.MediaStore
import com.base.datarecovery.bean.MediaBean
import java.io.File
object MediaStoreHelp {
@SuppressLint("Range")
fun Context.getImageMedia(
list: ArrayList<MediaBean>,
): ArrayList<MediaBean> {
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.MIME_TYPE,
MediaStore.Images.Media.DATE_MODIFIED,
)
var cursor: Cursor? = null
val externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI // 你也可以使用INTERNAL_CONTENT_URI来查询内部存储
try {
cursor = contentResolver.query(
externalUri,
projection,
null,
null,
MediaStore.Images.Media.DATE_TAKEN + " DESC"// 排序方式,按照拍摄
)
if (cursor != null) {
while (cursor.moveToNext()) {
val path =
cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA))
val uri =
ContentUris.withAppendedId(
externalUri,
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID))
)
val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED))
val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE))
list.add(MediaBean(path, uri, time, mimeType))
}
}
} catch (e: Exception) {
} finally {
cursor?.close()
}
return list
}
@SuppressLint("Range")
fun Context.getVideoMedia(list: ArrayList<MediaBean>): ArrayList<MediaBean> {
// MediaStore.Video.Media.DATE_TAKEN:表示视频拍摄的时间,
// MediaStore.Video.Media.DATE_ADDED:表示视频文件被添加到MediaStore数据库的时间
// MediaStore.Video.Media.DATE_MODIFIED:表示视频文件最后被修改的时间,
val projection = arrayOf(
MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DATE_MODIFIED,
MediaStore.Video.Media.MIME_TYPE,
// MediaStore.Video.Media.DATE_TAKEN,
)
val externalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
var cursor: Cursor? = null
try {
cursor = contentResolver.query(
externalUri,
projection,
null, // 选择条件,null表示查询所有
null, // 选择参数,配合选择条件使用
MediaStore.Video.Media.DATE_TAKEN + " DESC" // 按日期降序排序
)
if (cursor != null) {
while (cursor.moveToNext()) {
// 获取视频文件的属性
val path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA))
val uri =
ContentUris.withAppendedId(
externalUri,
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID))
)
val time = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED))
val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE))
list.add(MediaBean(path, uri, time, mimeType))
}
}
} catch (e: Exception) {
} finally {
cursor?.close()
}
return list
}
val commonMediaDir = arrayOf(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).absolutePath,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).absolutePath,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).absolutePath,
)
fun Context.updateMediaStore(
filePath: Array<String> = commonMediaDir
) {
MediaScannerConnection.scanFile(
this, filePath, null
) { path: String?, uri: Uri? -> }
}
}
\ No newline at end of file
......@@ -9,12 +9,17 @@ import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.rememberOption
import com.base.datarecovery.databinding.DialogCameraSettingBinding
import com.base.datarecovery.databinding.DialogImageTakeBinding
import com.base.datarecovery.databinding.DialogPermissonOpenBinding
import com.base.datarecovery.databinding.DialogRecoveringBinding
import com.base.datarecovery.databinding.DialogRemoveFileTipBinding
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import com.base.datarecovery.view.DialogViews.showRecoveringDialog
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
......@@ -140,7 +145,7 @@ object DialogViews {
}
fun Context.showImageImportDialog() {
fun Context.showImageImportDialog(import: () -> Unit, camera: () -> Unit) {
val binding = DialogImageTakeBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this, R.style.CustomAlertDialogStyle).setView(binding.root).create()
......@@ -150,8 +155,57 @@ object DialogViews {
val params = dialog.window?.attributes
params?.gravity = Gravity.BOTTOM
params?.y = 200
params?.y = 50
dialog.window?.attributes = params
binding.llImport.setOnClickListener {
dialog.dismiss()
import.invoke()
}
binding.llCamera.setOnClickListener {
dialog.dismiss()
camera.invoke()
}
}
fun Context.showCameraSettingDialog() {
val binding = DialogCameraSettingBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this, R.style.CustomAlertDialogStyle).setView(binding.root).create()
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
val params = dialog.window?.attributes
dialog.window?.attributes = params
binding.tvOk.setOnClickListener { dialog.dismiss() }
}
fun Context.showRemoveOriginalTip(click: (isRememberOption: Boolean, isRemove: Boolean) -> Unit) {
val binding = DialogRemoveFileTipBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this, R.style.CustomAlertDialogStyle).setView(binding.root).create()
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
binding.ivSelector.setOnClickListener {
binding.ivSelector.isSelected = !binding.ivSelector.isSelected
}
binding.tvRemove.setOnClickListener {
dialog.dismiss()
click.invoke(binding.ivSelector.isSelected, true)
}
binding.tvNoRemove.setOnClickListener {
dialog.dismiss()
click.invoke(binding.ivSelector.isSelected, false)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#577DFD" />
<corners android:radius="22dp" />
</shape>
\ 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:drawable="@mipmap/gouxuan_n" android:state_selected="false" />
<item android:drawable="@mipmap/gouxuan_s" android:state_selected="true" />
</selector>
\ 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:background="#F4F4F6"
android:orientation="vertical"
tools:context=".activity.PrivacyImportActivity">
<View
android:layout_width="match_parent"
android:layout_height="40dp" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/quit"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_photos"
android:layout_width="135dp"
android:layout_height="45dp"
android:background="@drawable/bg_tab_privacy">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/photos_p"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp"
android:text="Photos"
android:textColor="@color/bg_tab_text_privacy"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_videos"
android:layout_width="135dp"
android:layout_height="45dp"
android:layout_marginStart="30dp"
android:background="@drawable/bg_tab_privacy">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/videos_p"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp"
android:text="Videos"
android:textColor="@color/bg_tab_text_privacy"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.cardview.widget.CardView
android:id="@+id/card_import"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="bottom"
android:layout_marginHorizontal="25dp"
android:layout_marginBottom="30dp"
android:visibility="gone"
app:cardCornerRadius="15dp"
app:cardElevation="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="25dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_select_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="18sp"
tools:text="1 Selected" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="#999999"
tools:text="936.1 MB" />
</LinearLayout>
<TextView
android:id="@+id/tv_import"
android:layout_width="90dp"
android:layout_height="41dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="30dp"
android:background="@drawable/bg_577dfd_17_5"
android:gravity="center"
android:text="Import"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<FrameLayout
android:id="@+id/fl_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?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="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="30dp"
android:layout_marginTop="30dp"
android:text="Please turn on camera and microphone permissions in your phone setting first"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_ok"
android:layout_width="251dp"
android:layout_height="44dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="35dp"
android:layout_marginBottom="22dp"
android:background="@drawable/bg_577dfd_22"
android:gravity="center"
android:text="OK"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
\ No newline at end of file
......@@ -60,7 +60,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:text="Take photo or video"
android:text="Import photos or videos"
android:textColor="#181D2C"
android:textSize="17sp"
android:textStyle="bold"
......
<?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="360dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="36dp"
android:src="@mipmap/delicon"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="Remove files from your phone after import?"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="30dp"
android:layout_marginTop="14dp"
android:gravity="center"
android:text="This will delete your original files after imported from album."
android:textColor="#666666"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_remove"
android:layout_width="250dp"
android:layout_height="44dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="24dp"
android:background="@drawable/bg_577dfd_22"
android:gravity="center"
android:text="Remove"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_no_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="Don't Remove"
android:textColor="#666666"
android:textSize="17sp"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_remember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="32dp"
android:layout_marginBottom="30dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg_square_selector"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:text="Always remember this option"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
\ 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment.PrivacyFileImportFragment">
<TextView
android:id="@+id/tv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginTop="25sp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:text="Select All"
android:textColor="#3A9BFF"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_time_media2" />
</LinearLayout>
\ No newline at end of file
......@@ -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="80dp"
android:layout_height="80dp"
android:layout_width="88dp"
android:layout_height="88dp"
android:layout_margin="4dp"
app:cardCornerRadius="5dp"
app:cardElevation="0dp">
......
<?xml version="1.0" encoding="utf-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="88dp"
android:layout_height="88dp"
android:layout_margin="4dp"
app:cardCornerRadius="5dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="8dp"
android:src="@drawable/bg_circle_border_selector"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
\ 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:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginEnd="16dp"
tools:ignore="UseCompoundDrawables">
<FrameLayout
android:id="@+id/fl_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="15dp">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="5dp"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:textColor="#666666"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText"
tools:text="Today" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_media_columns"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="4"
tools:listitem="@layout/item_media_grid_select" />
</LinearLayout>
\ 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