Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
D
Data Recovery White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Data Recovery White
Commits
9bcd694b
Commit
9bcd694b
authored
Jul 08, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...ui
parent
41821fcb
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1075 additions
and
8 deletions
+1075
-8
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+3
-0
PrivacyImportActivity.kt
...a/com/base/datarecovery/activity/PrivacyImportActivity.kt
+166
-0
PrivacySpaceActivity.kt
...va/com/base/datarecovery/activity/PrivacySpaceActivity.kt
+10
-0
FileGridAdapter.kt
...ain/java/com/base/datarecovery/adapter/FileGridAdapter.kt
+5
-1
MediaAdapter.kt
...c/main/java/com/base/datarecovery/adapter/MediaAdapter.kt
+132
-0
ConstObject.kt
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
+18
-0
MediaBean.kt
app/src/main/java/com/base/datarecovery/bean/MediaBean.kt
+12
-0
MediaTimeBean.kt
...src/main/java/com/base/datarecovery/bean/MediaTimeBean.kt
+10
-0
PrivacyFileImportFragment.kt
...m/base/datarecovery/fragment/PrivacyFileImportFragment.kt
+76
-0
PrivacyPageFragment.kt
...ava/com/base/datarecovery/fragment/PrivacyPageFragment.kt
+24
-2
MediaStoreHelp.kt
...rc/main/java/com/base/datarecovery/help/MediaStoreHelp.kt
+132
-0
DialogViews.kt
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
+56
-2
bg_577dfd_22.xml
app/src/main/res/drawable/bg_577dfd_22.xml
+5
-0
bg_square_selector.xml
app/src/main/res/drawable/bg_square_selector.xml
+6
-0
activity_privacy_import.xml
app/src/main/res/layout/activity_privacy_import.xml
+178
-0
dialog_camera_setting.xml
app/src/main/res/layout/dialog_camera_setting.xml
+32
-0
dialog_image_take.xml
app/src/main/res/layout/dialog_image_take.xml
+1
-1
dialog_remove_file_tip.xml
app/src/main/res/layout/dialog_remove_file_tip.xml
+90
-0
fragment_privacy_file_import.xml
app/src/main/res/layout/fragment_privacy_file_import.xml
+31
-0
item_media_grid.xml
app/src/main/res/layout/item_media_grid.xml
+2
-2
item_media_grid_select.xml
app/src/main/res/layout/item_media_grid_select.xml
+26
-0
item_time_media2.xml
app/src/main/res/layout/item_time_media2.xml
+60
-0
delicon.png
app/src/main/res/mipmap-xxhdpi/delicon.png
+0
-0
gouxuan_n.png
app/src/main/res/mipmap-xxhdpi/gouxuan_n.png
+0
-0
gouxuan_s.png
app/src/main/res/mipmap-xxhdpi/gouxuan_s.png
+0
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
9bcd694b
...
...
@@ -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"
/>
...
...
app/src/main/java/com/base/datarecovery/activity/PrivacyImportActivity.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/activity/PrivacySpaceActivity.kt
View file @
9bcd694b
...
...
@@ -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
()
}
}
...
...
app/src/main/java/com/base/datarecovery/adapter/FileGridAdapter.kt
View file @
9bcd694b
...
...
@@ -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"
)
...
...
app/src/main/java/com/base/datarecovery/adapter/MediaAdapter.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
View file @
9bcd694b
...
...
@@ -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
app/src/main/java/com/base/datarecovery/bean/MediaBean.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/bean/MediaTimeBean.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/fragment/PrivacyFileImportFragment.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/fragment/PrivacyPageFragment.kt
View file @
9bcd694b
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
)
...
...
app/src/main/java/com/base/datarecovery/help/MediaStoreHelp.kt
0 → 100644
View file @
9bcd694b
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
app/src/main/java/com/base/datarecovery/view/DialogViews.kt
View file @
9bcd694b
...
...
@@ -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
=
20
0
params
?.
y
=
5
0
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
)
}
}
}
app/src/main/res/drawable/bg_577dfd_22.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/drawable/bg_square_selector.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/activity_privacy_import.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/dialog_camera_setting.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/dialog_image_take.xml
View file @
9bcd694b
...
...
@@ -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"
...
...
app/src/main/res/layout/dialog_remove_file_tip.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/fragment_privacy_file_import.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/item_media_grid.xml
View file @
9bcd694b
...
...
@@ -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=
"8
0
dp"
android:layout_height=
"8
0
dp"
android:layout_width=
"8
8
dp"
android:layout_height=
"8
8
dp"
android:layout_margin=
"4dp"
app:cardCornerRadius=
"5dp"
app:cardElevation=
"0dp"
>
...
...
app/src/main/res/layout/item_media_grid_select.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/layout/item_time_media2.xml
0 → 100644
View file @
9bcd694b
<?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
app/src/main/res/mipmap-xxhdpi/delicon.png
0 → 100644
View file @
9bcd694b
9.82 KB
app/src/main/res/mipmap-xxhdpi/gouxuan_n.png
0 → 100644
View file @
9bcd694b
846 Bytes
app/src/main/res/mipmap-xxhdpi/gouxuan_s.png
0 → 100644
View file @
9bcd694b
1.49 KB
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment