Commit 7304dac9 authored by wanglei's avatar wanglei

...ui

parent b8601506
...@@ -12,21 +12,13 @@ ...@@ -12,21 +12,13 @@
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/logo"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/logo"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.DataRecovery" android:theme="@style/Theme.DataRecovery"
tools:targetApi="31"> tools:targetApi="34">
<activity
android:name=".activity.PrivacyImportActivity"
android:exported="false" />
<activity
android:name=".activity.PinActivity"
android:exported="false" />
<activity
android:name=".activity.PrivacySpaceActivity"
android:exported="false" />
<activity <activity
android:name=".activity.SplashActivity" android:name=".activity.SplashActivity"
android:exported="true"> android:exported="true">
...@@ -36,12 +28,54 @@ ...@@ -36,12 +28,54 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".activity.ScreenShotActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.whatsapp.WhatsAppCleanerActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.whatsapp.WhatsAppMessageCleanActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity <activity
android:name=".activity.MainActivity" android:name=".activity.MainActivity"
android:exported="false" android:exported="false"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.privacyspace.PrivacyPinTwoActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.privacyspace.PrivacyPinOneActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.privacyspace.PrivacyImportActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.privacyspace.PrivacySpaceActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity <activity
android:name=".activity.FileRecoveredActivity" android:name=".activity.FileRecoveredActivity"
android:exported="false" android:exported="false"
......
...@@ -122,7 +122,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() { ...@@ -122,7 +122,7 @@ class FileScanActivity : BaseActivity<ActivityFileScanBinding>() {
private fun requestPermission() { private fun requestPermission() {
showGerPermission(null, deny = { finishToMain() }, allow = { showGerPermission(null, deny = { }, allow = {
requestStorePermission(launcher, jumpAction = {}, result = { flag -> requestStorePermission(launcher, jumpAction = {}, result = { flag ->
if (flag) beginScan() if (flag) beginScan()
......
package com.base.datarecovery.activity
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.base.datarecovery.R
import com.base.datarecovery.databinding.ActivityPinBinding
import com.base.datarecovery.help.BaseActivity
class PinActivity : BaseActivity<ActivityPinBinding>() {
override val binding: ActivityPinBinding by lazy {
ActivityPinBinding.inflate(layoutInflater)
}
override fun initView() {
}
}
\ No newline at end of file
package com.base.datarecovery.activity
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.adapter.ScreenShotAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.bean.ScreenPhotoBean
import com.base.datarecovery.bean.ScreenshotBean
import com.base.datarecovery.databinding.ActivityScreenShotBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.FileHelp
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.view.DialogViews.showGerPermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
import kotlin.collections.HashSet
class ScreenShotActivity : BaseActivity<ActivityScreenShotBinding>() {
private lateinit var screenShotAdapter: ScreenShotAdapter
override val binding: ActivityScreenShotBinding by lazy {
ActivityScreenShotBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
screenShotAdapter = ScreenShotAdapter { size ->
setCleanUpUi(size)
}
binding.rv.adapter = screenShotAdapter
if (checkStorePermission()) {
initData()
} else {
dialog = showGerPermission(null, deny = {},
allow = {
requestStorePermission(launcher, result = { flag ->
if (flag) initData() else finishToMain()
})
})
}
}
@SuppressLint("SetTextI18n")
private fun setCleanUpUi(size: Int) {
if (size > 0) {
binding.tvClean.isEnabled = true
binding.tvClean.text = "CLEAN(${size})"
} else {
binding.tvClean.isEnabled = false
binding.tvClean.text = "CLEAN"
}
binding.llSelectAll.isSelected = screenShotAdapter.isAllSelect()
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val list = getScreenshotBean()
launch(Dispatchers.Main) {
screenShotAdapter.setData(list)
val size = list.sumOf { it.screenPhotoBean.sumOf { ss -> ss.file.length() } }
val sizeF = size.toFormatSize().split(" ")
binding.tvSize.text = sizeF[0]
binding.tvUnit.text = sizeF[1]
}
}
override fun initListener() {
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
AdmobInterstitialUtils.showInterstitialAd(this@ScreenShotActivity) {
finishToMain()
}
}
binding.llSelectAll.setOnClickListener {
binding.llSelectAll.isSelected = !binding.llSelectAll.isSelected
screenShotAdapter.toggleSelect(binding.llSelectAll.isSelected)
val size = screenShotAdapter.getSelectDataSize()
setCleanUpUi(size)
}
binding.tvClean.setOnClickListener {
val files = screenShotAdapter.getSelectData()
AdmobInterstitialUtils.showInterstitialAd(this) {
lifecycleScope.launch(Dispatchers.IO) {
async {
files.forEach { screenFile ->
runCatching {
val file = screenFile.file
if (file.exists()) file.delete()
}
}
}.await()
launch(Dispatchers.Main) {
screenShotAdapter.removeData(files)
}
}
}
}
}
private fun getScreenshotBean(): ArrayList<ScreenshotBean> {
val dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
val screenFiles = FileHelp.getDirFiles(dcim)
val hash = HashMap<String, HashSet<File>>()
val formatter = SimpleDateFormat("yyyy/MM", Locale.getDefault())
screenFiles.forEach { file ->
val time = formatter.format(file.lastModified())
if (hash[time] == null) {
hash[time] = HashSet()
}
val set = hash[time]
set?.add(file)
}
val beans = arrayListOf<ScreenshotBean>()
hash.forEach { (t, u) ->
val arrayList = arrayListOf<ScreenPhotoBean>()
val mapList = u.map { file -> ScreenPhotoBean(file) }
arrayList.addAll(mapList)
beans.add(ScreenshotBean(t, arrayList))
}
return beans
}
}
\ No newline at end of file
...@@ -11,6 +11,7 @@ import android.view.View ...@@ -11,6 +11,7 @@ import android.view.View
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.ads.AdmobOpenUtils import com.base.datarecovery.ads.AdmobOpenUtils
import com.base.datarecovery.bean.ConstObject.ifAgreePrivacy
import com.base.datarecovery.databinding.ActivitySplashBinding import com.base.datarecovery.databinding.ActivitySplashBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.ConfigHelper import com.base.datarecovery.help.ConfigHelper
...@@ -34,14 +35,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { ...@@ -34,14 +35,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
private val progress = MutableSharedFlow<Int>() private val progress = MutableSharedFlow<Int>()
private val progressFlow: SharedFlow<Int> = progress private val progressFlow: SharedFlow<Int> = progress
private var oneClickStart: Boolean = false private var oneClickStart: Boolean = false
var ifAgreePrivacy = false
get() {
return SPUtils.getInstance().getBoolean("ifAgreePrivacy", field)
}
set(value) {
field = value
SPUtils.getInstance().put("ifAgreePrivacy", value, true)
}
override val binding: ActivitySplashBinding by lazy { override val binding: ActivitySplashBinding by lazy {
ActivitySplashBinding.inflate(layoutInflater) ActivitySplashBinding.inflate(layoutInflater)
......
package com.base.datarecovery.activity package com.base.datarecovery.activity.privacyspace
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
...@@ -22,7 +21,6 @@ import com.base.datarecovery.help.MediaStoreHelp.updateMediaStore ...@@ -22,7 +21,6 @@ import com.base.datarecovery.help.MediaStoreHelp.updateMediaStore
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showRemoveOriginalTip import com.base.datarecovery.view.DialogViews.showRemoveOriginalTip
import com.google.android.gms.ads.MediationUtils
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
...@@ -135,12 +133,12 @@ class PrivacyImportActivity : BaseActivity<ActivityPrivacyImportBinding>() { ...@@ -135,12 +133,12 @@ class PrivacyImportActivity : BaseActivity<ActivityPrivacyImportBinding>() {
binding.flProgress.visibility = View.VISIBLE binding.flProgress.visibility = View.VISIBLE
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
allSelect.forEach { allSelect.forEach {
LogEx.logDebug(TAG, it.mintype) LogEx.logDebug(TAG, it.mimeType)
val dir = filesDir val dir = filesDir
val file = File(it.path) val file = File(it.path)
runCatching { runCatching {
if (it.mintype.contains("image")) { if (it.mimeType.contains("image")) {
val imageDir = File(dir, "photos") val imageDir = File(dir, "photos")
file.copyTo(File(imageDir, file.name), true) file.copyTo(File(imageDir, file.name), true)
} else { } else {
......
package com.base.datarecovery.activity.privacyspace
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.view.KeyEvent
import androidx.activity.addCallback
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacyPinOneBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.array2String
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.AsteriskPasswordTransformationMethod
import com.base.datarecovery.view.DialogViews.showPinReEnterDialog
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class PrivacyPinOneActivity : BaseActivity<ActivityPrivacyPinOneBinding>() {
private val TAG = "PrivacyPinActivity"
private val firstInput = arrayOf("", "", "", "")
override val binding: ActivityPrivacyPinOneBinding by lazy {
ActivityPrivacyPinOneBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
}
@RequiresApi(Build.VERSION_CODES.O)
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
}
setInput()
setDeleteKey()
}
private fun setDeleteKey() {
arrayOf(binding.edit1, binding.edit2, binding.edit3, binding.edit4).forEach {
it.setOnKeyListener { v, actionId, event ->
if ((event.action == KeyEvent.ACTION_DOWN) && (event.keyCode == KeyEvent.KEYCODE_DEL)) {
if (binding.edit1.hasFocus()) {
binding.edit1.setText("")
}
if (binding.edit2.hasFocus()) {
binding.edit2.setText("")
binding.edit1.requestFocus()
}
if (binding.edit3.hasFocus()) {
binding.edit3.setText("")
binding.edit2.requestFocus()
}
if (binding.edit4.hasFocus()) {
binding.edit4.setText("")
binding.edit3.requestFocus()
}
true
} else {
false
}
}
}
}
private fun startJump() {
if (privacyPinPassword.isNotEmpty()) {
if (privacyPinPassword == firstInput.array2String()) {
startActivity(Intent(this, PrivacySpaceActivity::class.java))
finish()
} else {
warmPassword()
}
} else {
launcher.launch(
Intent(this, PrivacyPinTwoActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
putExtra("FirstInput", firstInput.array2String())
}
) {
startActivity(Intent(this, PrivacySpaceActivity::class.java))
finish()
}
}
}
private fun setInput() {
binding.edit1.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl1.isSelected = hasFocus
}
binding.edit2.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl2.isSelected = hasFocus
}
binding.edit3.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl3.isSelected = hasFocus
}
binding.edit4.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl4.isSelected = hasFocus
}
binding.edit1.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit2.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit3.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit4.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit1.requestFocus()
binding.edit1.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
firstInput[0] = text
binding.edit2.requestFocus()
}
}
binding.edit2.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
firstInput[1] = text
binding.edit3.requestFocus()
}
}
binding.edit3.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
firstInput[2] = text
binding.edit4.requestFocus()
}
}
binding.edit4.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
firstInput[3] = text
startJump()
}
}
}
private fun warmPassword() {
binding.fl1.tag = true
binding.fl1.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl2.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl3.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl4.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.edit1.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit2.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit3.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit4.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
val dialog = showPinReEnterDialog()
lifecycleScope.launch {
delay(2000)
dialog.dismiss()
}
}
private fun cancelWarmPassword() {
if (binding.fl1.tag == true) {
binding.fl1.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl2.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl3.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl4.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.edit1.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit2.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit3.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit4.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.fl1.tag = false
}
}
}
\ No newline at end of file
package com.base.datarecovery.activity.privacyspace
import android.graphics.Color
import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.activity.addCallback
import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacyPinTwoBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.array2String
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.AsteriskPasswordTransformationMethod
import com.base.datarecovery.view.DialogViews.showPinReEnterDialog
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class PrivacyPinTwoActivity : BaseActivity<ActivityPrivacyPinTwoBinding>() {
private var firstInput = "null"
private val secondInput = arrayOf("", "", "", "")
private val TAG = "PrivacyPinTwoActivity"
override val binding: ActivityPrivacyPinTwoBinding by lazy {
ActivityPrivacyPinTwoBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
firstInput = intent.extras?.getString("FirstInput") ?: "null"
LogEx.logDebug(TAG, "firstInput=$firstInput")
}
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finish()
}
setInput()
setDeleteKey()
}
private fun hideInput() {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(binding.edit4.windowToken, 0)
binding.edit4.clearFocus()
}
private fun warmPassword() {
binding.fl1.tag = true
binding.fl1.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl2.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl3.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.fl4.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin_warm)
binding.edit1.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit2.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit3.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
binding.edit4.setTextColor(ContextCompat.getColor(this, R.color.color_fa020b))
val dialog = showPinReEnterDialog()
lifecycleScope.launch {
delay(2000)
dialog.dismiss()
}
}
private fun cancelWarmPassword() {
if (binding.fl1.tag == true) {
binding.fl1.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl2.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl3.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.fl4.background = ContextCompat.getDrawable(this, R.drawable.bg_border_pin)
binding.edit1.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit2.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit3.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.edit4.setTextColor(ContextCompat.getColor(this, R.color.black))
binding.fl1.tag = false
}
}
private fun startJump() {
binding.llInput.visibility = View.GONE
binding.llRememberTip.visibility = View.VISIBLE
hideInput()
onBackPressedDispatcher.addCallback {
setResult(0, intent)
finish()
}
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
private fun setInput() {
binding.edit1.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl1.isSelected = hasFocus
}
binding.edit2.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl2.isSelected = hasFocus
}
binding.edit3.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl3.isSelected = hasFocus
}
binding.edit4.setOnFocusChangeListener { v, hasFocus ->
cancelWarmPassword()
binding.fl4.isSelected = hasFocus
}
binding.edit1.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit2.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit3.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit4.transformationMethod = AsteriskPasswordTransformationMethod()
binding.edit1.requestFocus()
binding.edit1.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
secondInput[0] = text
binding.edit2.requestFocus()
}
}
binding.edit2.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
secondInput[1] = text
binding.edit3.requestFocus()
}
}
binding.edit3.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
secondInput[2] = text
binding.edit4.requestFocus()
}
}
binding.edit4.addTextChangedListener {
val text = it.toString()
LogEx.logDebug(TAG, "text=$text")
if (text.isNotEmpty()) {
secondInput[3] = text
if (firstInput == secondInput.array2String()) {
privacyPinPassword = firstInput
startJump()
} else {
warmPassword()
}
}
}
}
private fun setDeleteKey() {
arrayOf(binding.edit1, binding.edit2, binding.edit3, binding.edit4).forEach {
it.setOnKeyListener { v, actionId, event ->
if ((event.action == KeyEvent.ACTION_DOWN) && (event.keyCode == KeyEvent.KEYCODE_DEL)) {
if (binding.edit1.hasFocus()) {
binding.edit1.setText("")
}
if (binding.edit2.hasFocus()) {
binding.edit2.setText("")
binding.edit1.requestFocus()
}
if (binding.edit3.hasFocus()) {
binding.edit3.setText("")
binding.edit2.requestFocus()
}
if (binding.edit4.hasFocus()) {
binding.edit4.setText("")
binding.edit3.requestFocus()
}
true
} else {
false
}
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.activity package com.base.datarecovery.activity.privacyspace
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.addCallback 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.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.datarecovery.R import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding import com.base.datarecovery.databinding.ActivityPrivacySpaceBinding
import com.base.datarecovery.fragment.PrivacyPageFragment import com.base.datarecovery.fragment.PrivacyPageFragment
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
...@@ -37,6 +34,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() { ...@@ -37,6 +34,7 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
} }
@SuppressLint("SetTextI18n")
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
...@@ -64,13 +62,24 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() { ...@@ -64,13 +62,24 @@ class PrivacySpaceActivity : BaseActivity<ActivityPrivacySpaceBinding>() {
} }
} }
}) })
if (privacyPinPassword.isEmpty()) {
binding.tvUninstallTip.setTextColor(Color.parseColor("#FAB44B"))
binding.tvGoOrSetting.text = "Setting"
} else {
binding.tvPinTip.visibility = View.GONE
binding.tvGoOrSetting.text = "Got it"
}
} }
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
binding.tvGoIt.setOnClickListener { binding.tvGoOrSetting.setOnClickListener {
binding.llUninstallTip.visibility = View.GONE if (privacyPinPassword.isEmpty()) {
startActivity(Intent(this, PrivacyPinOneActivity::class.java))
} else {
binding.llTip.visibility = View.GONE
}
} }
binding.llPhotos.setOnClickListener { binding.llPhotos.setOnClickListener {
binding.viewpager2.currentItem = 0 binding.viewpager2.currentItem = 0
......
package com.base.datarecovery.activity.whatsapp
import android.content.Intent
import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.R
import com.base.datarecovery.adapter.WhatsAppCleanerAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.bean.WhatsAppCleanerBean
import com.base.datarecovery.databinding.ActivityWhatsAppCleanerBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.FileHelp.getDirFiles
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.FileHexEx.isImage
import com.base.datarecovery.utils.FileHexEx.isVideo
import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showGerPermission
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class WhatsAppCleanerActivity : BaseActivity<ActivityWhatsAppCleanerBinding>() {
private val TAG = "WhatsAppCleanerActivity"
private lateinit var adapter: WhatsAppCleanerAdapter
override val binding: ActivityWhatsAppCleanerBinding by lazy {
ActivityWhatsAppCleanerBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
adapter = WhatsAppCleanerAdapter {
startActivity(Intent(this, WhatsAppMessageCleanActivity::class.java).apply {
putExtra("PathList", Gson().toJson(it.subFile.toTypedArray()))
putExtra("Tittle", it.tittle)
})
finish()
}
binding.rv.adapter = adapter
if (checkStorePermission()) {
initData()
} else {
showGerPermission(null, deny = {
finishToMain()
}, allow = {
requestStorePermission(
launcher,
result = { flag ->
if (flag) {
initData()
} else {
finishToMain()
}
},
)
})
}
AdmobNativeUtils.showNativeAd(this, binding.flAd)
}
override fun initListener() {
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
AdmobInterstitialUtils.showInterstitialAd(this@WhatsAppCleanerActivity) {
finishToMain()
}
}
binding.tvTvGotIt.setOnClickListener {
}
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val whatsAppRoot = File(Environment.getExternalStorageDirectory(), "Android/media/com.whatsapp/WhatsApp/Media/")
LogEx.logDebug(TAG, whatsAppRoot.absolutePath)
val list = arrayListOf<WhatsAppCleanerBean>()
list.add(WhatsAppCleanerBean(R.mipmap.videomessages, "Video Messages"))
list.add(WhatsAppCleanerBean(R.mipmap.imagemessages, "Image Messages"))
list.add(WhatsAppCleanerBean(R.mipmap.audiomessages, "Audio Messages"))
var totalSize = 0L
whatsAppRoot.listFiles()?.forEach { file ->
if (file.name == "WhatsApp Video") {
LogEx.logDebug(TAG, "whatsapp file=${file.absolutePath}")
val bean = list.find { it.tittle == "Video Messages" }
val subFile = getDirFiles(file).filter { isVideo(it) }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
// subFile.forEach { path ->
// LogEx.logDebug(TAG, "path=$path")
// }
}
if (file.name == "WhatsApp Images") {
val bean = list.find { it.tittle == "Image Messages" }
val subFile = getDirFiles(file).filter { isImage(it) }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
}
if (file.name == "WhatsApp Audio") {
val bean = list.find { it.tittle == "Audio Messages" }
val subFile = getDirFiles(file).filter { it.name.contains(".mp3") }
val size = subFile.sumOf { it.length() }
bean?.size = size
totalSize += size
bean?.subFile = subFile.map { it.absolutePath }
}
}
launch(Dispatchers.Main) {
adapter.setData(list)
val split = totalSize.toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
}
}
\ No newline at end of file
package com.base.datarecovery.activity.whatsapp
import android.content.Intent
import android.graphics.Color
import androidx.activity.addCallback
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.base.datarecovery.adapter.WhatsAppMediaAdapter
import com.base.datarecovery.ads.AdmobInterstitialUtils
import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ActivityWhatsAppMessageCleanBinding
import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.utils.BarUtils
import com.google.gson.Gson
import java.io.File
class WhatsAppMessageCleanActivity : BaseActivity<ActivityWhatsAppMessageCleanBinding>() {
private val pathList by lazy {
val json = intent.extras?.getString("PathList")
val list = Gson().fromJson(json, Array<String>::class.java)
list.map { MediaBean(it) }
}
private lateinit var adapter: WhatsAppMediaAdapter
override val binding: ActivityWhatsAppMessageCleanBinding by lazy {
ActivityWhatsAppMessageCleanBinding.inflate(layoutInflater)
}
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val tittle = intent.extras?.getString("Tittle") ?: ""
binding.tvTitle.text = tittle
var isList = false
when (tittle) {
"Audio Messages" -> {
binding.rv.layoutManager = LinearLayoutManager(this)
isList = true
}
else -> {
binding.rv.layoutManager = GridLayoutManager(this, 3)
}
}
adapter = WhatsAppMediaAdapter(isList) {
binding.llSelectAll.isSelected = it
binding.tvClean.isEnabled = adapter.getSelectData().isNotEmpty()
val split = adapter.getSelectDataSize().toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
binding.rv.adapter = adapter
adapter.setData(pathList)
AdmobNativeUtils.showNativeAd(this, binding.flAd)
}
override fun initListener() {
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
AdmobInterstitialUtils.showInterstitialAd(this@WhatsAppMessageCleanActivity, isShowInterVal = false) {
finishToMain()
}
}
binding.llSelectAll.setOnClickListener {
it.isSelected = !it.isSelected
adapter.toggleSelect(it.isSelected)
binding.tvClean.isEnabled = it.isSelected
val split = adapter.getSelectDataSize().toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
binding.tvClean.setOnClickListener {
AdmobInterstitialUtils.showInterstitialAd(this) {
val list = adapter.getSelectData()
runCatching {
list.forEach { File(it).delete() }
}
finish()
}
}
}
}
\ No newline at end of file
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.bean.ScreenPhotoBean
import com.base.datarecovery.bean.ScreenshotBean
import com.base.datarecovery.databinding.ItemScreenPhotoBinding
import com.base.datarecovery.databinding.ItemScreenshotBinding
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
class ScreenShotAdapter(
val select: (size: Int) -> Unit
) : RecyclerView.Adapter<ScreenShotAdapter.SSS>() {
private var beans = arrayListOf<ScreenshotBean>()
inner class SSS(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SSS {
return SSS(R.layout.item_screenshot.inflate(parent))
}
override fun getItemCount(): Int {
return beans.size
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindViewHolder(holder: SSS, position: Int) {
val binding = ItemScreenshotBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beans[position]
binding.tvSelectAll.text = if (bean.isSelect) "UNSELECT ALL" else "SELECT ALL"
binding.tvSelectAll.setOnClickListener {
bean.isSelect = !bean.isSelect
bean.screenPhotoBean.forEach { subBean -> subBean.isSelect = bean.isSelect }
notifyItemChanged(position)
select.invoke(getSelectDataSize())
}
binding.tvTime.text = bean.time
binding.group.removeAllViews()
bean.screenPhotoBean.forEach { screenPhotoBean ->
val itemView = R.layout.item_screen_photo.inflate(binding.group)
val photoBinding = ItemScreenPhotoBinding.bind(itemView)
Glide.with(context).load(screenPhotoBean.file).centerCrop().into(photoBinding.iv)
photoBinding.ivSelector.isSelected = screenPhotoBean.isSelect
arrayOf(photoBinding.root, photoBinding.ivSelector).forEach {
it.setOnClickListener {
screenPhotoBean.isSelect = !screenPhotoBean.isSelect
photoBinding.ivSelector.isSelected = screenPhotoBean.isSelect
bean.isSelect = bean.screenPhotoBean.all { it.isSelect }
notifyDataSetChanged()
select.invoke(getSelectDataSize())
}
}
binding.group.addView(itemView)
}
if (bean.screenPhotoBean.size < 3) {
repeat(2) {
val itemView = R.layout.item_screen_photo.inflate(binding.group)
itemView.visibility = View.INVISIBLE
binding.group.addView(itemView)
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(screenshotBean: List<ScreenshotBean>) {
beans.clear()
beans.addAll(screenshotBean)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(selected: Boolean) {
beans.forEach {
it.isSelect = selected
it.screenPhotoBean.forEach {
it.isSelect = selected
}
}
notifyDataSetChanged()
}
fun isAllSelect(): Boolean {
return beans.all { bean -> bean.screenPhotoBean.all { it.isSelect } }
}
fun getSelectDataSize(): Int {
return beans.sumOf { bean -> bean.screenPhotoBean.filter { it.isSelect }.size }
}
fun getSelectData(): List<ScreenPhotoBean> {
return beans.flatMap { bean ->
bean.screenPhotoBean.filter { it.isSelect }
}
}
@SuppressLint("NotifyDataSetChanged")
fun removeData(files: List<ScreenPhotoBean>) {
beans.forEach { screenshotBean ->
screenshotBean.screenPhotoBean.removeAll(files.toSet())
}
beans.removeIf { it.screenPhotoBean.isEmpty() }
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.graphics.Color
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.datarecovery.R
import com.base.datarecovery.bean.WhatsAppCleanerBean
import com.base.datarecovery.databinding.ItemWhatsappBinding
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.utils.ScreenUtil.dpToPx
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
class WhatsAppCleanerAdapter(val click: (bean: WhatsAppCleanerBean) -> Unit) : RecyclerView.Adapter<WhatsAppCleanerAdapter.Whats>() {
private val beanList = arrayListOf<WhatsAppCleanerBean>()
class Whats(view: View) : ViewHolder(view) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Whats {
return Whats(R.layout.item_whatsapp.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
override fun onBindViewHolder(holder: Whats, position: Int) {
val binding = ItemWhatsappBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beanList[position]
binding.iv.setImageDrawable(ContextCompat.getDrawable(context, bean.icon))
binding.tvTitle.text = bean.tittle
if (bean.subFile.isEmpty()) {
binding.llIv.visibility = View.GONE
binding.tvSize.setTextColor(Color.parseColor("#999999"))
binding.ivArrow.setImageDrawable(ContextCompat.getDrawable(context, R.mipmap.jianotu_whatsapp))
binding.tvNoMessage.visibility = View.VISIBLE
} else {
binding.llIv.visibility = View.VISIBLE
runCatching {
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(context.dpToPx(10)))
val image1 = bean.subFile[0]
Glide.with(context).load(image1).apply(options).into(binding.iv1)
val image2 = bean.subFile[1]
Glide.with(context).load(image2).apply(options).into(binding.iv2)
val image3 = bean.subFile[2]
Glide.with(context).load(image3).apply(options).into(binding.iv3)
}
binding.tvSize.setTextColor(Color.parseColor("#355BEA"))
binding.tvSize.text = bean.size.toFormatSize()
binding.ivArrow.setImageDrawable(ContextCompat.getDrawable(context, R.mipmap.jianotul_whatsapp))
binding.tvNoMessage.visibility = View.GONE
}
binding.root.setOnClickListener {
if (bean.subFile.isEmpty()) {
return@setOnClickListener
}
click.invoke(bean)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(list: List<WhatsAppCleanerBean>) {
beanList.clear()
beanList.addAll(list)
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.base.datarecovery.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.base.datarecovery.R
import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.databinding.ItemMediaFileBinding
import com.base.datarecovery.databinding.ItemMediaSelectBinding
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.view.XmlEx.inflate
import com.bumptech.glide.Glide
import java.io.File
class WhatsAppMediaAdapter(
private val isList: Boolean = false,
private val click: (allSelect: Boolean) -> Unit
) : RecyclerView.Adapter<WhatsAppMediaAdapter.WhatMedia>() {
private val beanList = arrayListOf<MediaBean>()
class WhatMedia(view: View) : RecyclerView.ViewHolder(view)
override fun getItemViewType(position: Int): Int {
return if (isList) 0 else 1
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WhatMedia {
val layout = if (viewType == 0) R.layout.item_media_file else R.layout.item_media_select
return WhatMedia(layout.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
override fun onBindViewHolder(holder: WhatMedia, position: Int) {
}
override fun onBindViewHolder(holder: WhatMedia, position: Int, payloads: MutableList<Any>) {
val context = holder.itemView.context
val bean = beanList[position]
if (isList) {
val binding = ItemMediaFileBinding.bind(holder.itemView)
if (payloads.isEmpty()) {
binding.iv.setImageDrawable(ContextCompat.getDrawable(context, R.mipmap.audiomessages))
val file = File(bean.path)
binding.tvName.text = file.name
binding.tvSize.text = file.length().toFormatSize()
binding.ivSelector.isSelected = bean.isSelect
binding.root.setOnClickListener {
binding.ivSelector.isSelected = !binding.ivSelector.isSelected
bean.isSelect = binding.ivSelector.isSelected
notifyItemChanged(position, "sdd")
click.invoke(beanList.all { it.isSelect })
}
} else {
binding.ivSelector.isSelected = bean.isSelect
super.onBindViewHolder(holder, position, payloads)
}
} else {
val binding = ItemMediaSelectBinding.bind(holder.itemView)
if (payloads.isEmpty()) {
Glide.with(context).load(bean.path).centerCrop().into(binding.iv)
binding.ivSelector.isSelected = bean.isSelect
binding.root.setOnClickListener {
binding.ivSelector.isSelected = !binding.ivSelector.isSelected
bean.isSelect = binding.ivSelector.isSelected
notifyItemChanged(position, "sdd")
click.invoke(beanList.all { it.isSelect })
}
} else {
binding.ivSelector.isSelected = bean.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(pathList: List<MediaBean>) {
beanList.clear()
beanList.addAll(pathList)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(select: Boolean) {
beanList.forEach { it.isSelect = select }
notifyDataSetChanged()
}
fun getSelectData(): List<String> {
return beanList.filter { it.isSelect }.map { it.path }
}
fun getSelectDataSize(): Long {
return getSelectData().map { File(it) }.sumOf { it.length() }
}
}
\ No newline at end of file
package com.base.datarecovery.ads
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.os.CountDownTimer
import android.widget.Toast
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R
import com.base.datarecovery.ads.AdmobCommonUtils.isMultiClick
import com.base.datarecovery.ads.AdmobEvent.clickAd
import com.base.datarecovery.ads.AdmobEvent.pullAd
import com.base.datarecovery.ads.AdmobEvent.showAd
import com.base.datarecovery.help.BaseApplication
import com.base.datarecovery.help.ConfigHelper
import com.base.datarecovery.view.CustomDialog
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import org.json.JSONObject
import java.util.UUID
object AdmobInterstitialUtils {
private var interAd: InterstitialAd? = null
private var interLoadTime = Long.MAX_VALUE
private var adLastDisplayTime: Long = 0
private val mRequest = AdRequest.Builder().build()
@SuppressLint("StaticFieldLeak")
private var customDialog: CustomDialog? = null
private fun isAdExpired(): Boolean {
return System.currentTimeMillis() - interLoadTime > 1000 * 60 * 60
}
fun showInterstitialAd(
activity: Activity,
isLoadAdNow: Boolean = false,
isShowInterVal: Boolean = true,
onHidden: (() -> Unit)? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
val obj = JSONObject()
obj.put("ad_unit", "interAd")
// EventUtils.event("ad_prepare_show", ext = obj)
if (isAdExpired()) {
val obj = JSONObject()
obj.put("ad_unit", "interAd")
// EventUtils.event("ad_expire", ext = obj)
interAd = null
loadInterstitialAd(activity)
onHidden?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onHidden?.invoke()
return
}
if (interAd != null) {
showIntervalDialogAndShowAd(activity, isLoadAdNow, isShowInterVal, onHidden, 2)
} else {
showAdDialogAndLoadInterstitial(activity, isLoadAdNow, isShowInterVal, onHidden)
}
}
fun loadInterstitialAd(activity: Activity, onLoad: (() -> Unit)? = null) {
if (interAd != null) {
onLoad?.invoke()
return
}
if (!AdDisplayUtils.getInstance().shouldShowAd()) {
onLoad?.invoke()
return
}
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "interAd")
obj.put("from", activity.javaClass.simpleName)
// EventUtils.event("ad_pull_start", ext = obj)
InterstitialAd.load(
activity,
ConfigHelper.interAdmobId,
mRequest,
object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(p0: LoadAdError) {
interAd = null
onLoad?.invoke()
pullAd(p0.responseInfo, "interAd", p0.message, reqId = reqId)
if (BuildConfig.DEBUG) {
Toast.makeText(
BaseApplication.context,
"拉取失败" + p0.message,
Toast.LENGTH_SHORT
).show()
}
}
override fun onAdLoaded(ad: InterstitialAd) {
interAd = ad
onLoad?.invoke()
interLoadTime = System.currentTimeMillis()
pullAd(ad.responseInfo, "interAd", reqId = reqId)
ad.onPaidEventListener = AdmobEvent.EventOnPaidEventListener(ad)
}
})
}
private fun showIntervalDialogAndShowAd(
activity: Activity,
isLoadAdNow: Boolean,
isShowInterVal: Boolean,
onHidden: (() -> Unit)?,
interval: Int
) {
if (customDialog != null && customDialog?.isShowing == true) {
return // 如果对话框已经显示,则不再显示
}
customDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
customDialog?.setCountdownText(R.id.dialog_ad_loading_text)
val countdownTimer = object : CountDownTimer((interval * 1000).toLong(), 1000) {
override fun onTick(millisUntilFinished: Long) {
val seconds = (millisUntilFinished / 1000).toInt()
customDialog?.updateCountdownText("Advertising in preparation ($seconds" + "s)...")
}
override fun onFinish() {
displayInterstitialAd(activity, onHidden)
if (!activity.isDestroyed && !activity.isFinishing) {
customDialog?.dismiss()
}
customDialog = null
}
}
countdownTimer.start()
customDialog?.show()
}
private fun showAdDialogAndLoadInterstitial(
activity: Activity,
isLoadAdNow: Boolean,
isShowInterVal: Boolean,
onHidden: (() -> Unit)?
) {
var mDialog: Dialog? = null
if (!activity.isFinishing && !activity.isDestroyed) {
mDialog = CustomDialog(activity, R.layout.dialog_ad_loading)
// 设置对话框的样式和内容
mDialog.show()
}
loadInterstitialAd(activity) {
mDialog?.dismiss()
if (!isLoadAdNow) {
showInterstitialAd(activity, true, isShowInterVal) {
onHidden?.invoke()
}
}
}
if (isLoadAdNow) {
mDialog?.dismiss()
onHidden?.invoke()
}
}
private fun displayInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
val thisInterAd = interAd
interAd = null
thisInterAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
clickAd(thisInterAd?.responseInfo, "interAd")
AdDisplayUtils.getInstance().incrementAdClickCount()
isMultiClick(thisInterAd)
}
override fun onAdDismissedFullScreenContent() {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
interAd = null
onHidden?.invoke()
loadInterstitialAd(activity)
}
override fun onAdShowedFullScreenContent() {
showAd(thisInterAd?.responseInfo, "interAd", activity)
AdDisplayUtils.getInstance().incrementAdDisplayCount()
adLastDisplayTime = System.currentTimeMillis() / 1000
}
}
thisInterAd?.show(activity)
}
}
\ No newline at end of file
...@@ -35,4 +35,15 @@ object ConstObject { ...@@ -35,4 +35,15 @@ object ConstObject {
field = value field = value
SPUtils.getInstance().put("rememberRemove", value, true) SPUtils.getInstance().put("rememberRemove", value, true)
} }
var privacyPinPassword = ""
get() {
return SPUtils.getInstance().getString("privacyPinPassword", field)
}
set(value) {
field = value
SPUtils.getInstance().put("privacyPinPassword", value, true)
}
} }
\ No newline at end of file
...@@ -6,7 +6,7 @@ data class MediaBean( ...@@ -6,7 +6,7 @@ data class MediaBean(
val path: String = "", val path: String = "",
val uri: Uri = Uri.EMPTY, val uri: Uri = Uri.EMPTY,
val time: Long = 0, val time: Long = 0,
val mintype:String, val mimeType: String = "",
) { ) {
var isSelect: Boolean = false var isSelect: Boolean = false
} }
\ No newline at end of file
package com.base.datarecovery.bean
import java.io.File
data class ScreenshotBean(
val time: String,
val screenPhotoBean: ArrayList<ScreenPhotoBean>
){
var isSelect: Boolean = false
}
data class ScreenPhotoBean(val file: File) {
var isSelect: Boolean = false
}
\ No newline at end of file
package com.base.datarecovery.bean
data class WhatsAppCleanerBean(
val icon: Int,
val tittle: String,
var size: Long=0L,
var subFile: List<String> = listOf()
)
...@@ -7,11 +7,15 @@ import android.content.Intent ...@@ -7,11 +7,15 @@ import android.content.Intent
import android.view.View import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.AccelerateDecelerateInterpolator
import com.base.datarecovery.activity.FileScanActivity import com.base.datarecovery.activity.FileScanActivity
import com.base.datarecovery.activity.PrivacySpaceActivity import com.base.datarecovery.activity.ScreenShotActivity
import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.whatsapp.WhatsAppCleanerActivity
import com.base.datarecovery.ads.AdmobNativeUtils import com.base.datarecovery.ads.AdmobNativeUtils
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.FragmentHomeBinding import com.base.datarecovery.databinding.FragmentHomeBinding
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
...@@ -45,9 +49,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() { ...@@ -45,9 +49,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
}) })
} }
binding.cardPrivacySpace.setOnClickListener { binding.cardPrivacySpace.setOnClickListener {
startActivity(Intent(requireContext(), PrivacySpaceActivity::class.java).apply { if (privacyPinPassword.isNotEmpty()) {
startActivity(Intent(requireContext(), PrivacyPinOneActivity::class.java))
} else {
startActivity(Intent(requireContext(), PrivacySpaceActivity::class.java).apply {
}) })
}
}
binding.cardScreenshot.setOnClickListener {
startActivity(Intent(requireContext(), ScreenShotActivity::class.java))
} }
......
...@@ -2,7 +2,7 @@ package com.base.datarecovery.fragment ...@@ -2,7 +2,7 @@ package com.base.datarecovery.fragment
import android.annotation.SuppressLint import android.annotation.SuppressLint
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.PrivacyImportActivity import com.base.datarecovery.activity.privacyspace.PrivacyImportActivity
import com.base.datarecovery.adapter.MediaAdapter import com.base.datarecovery.adapter.MediaAdapter
import com.base.datarecovery.bean.MediaBean import com.base.datarecovery.bean.MediaBean
import com.base.datarecovery.bean.MediaTimeBean import com.base.datarecovery.bean.MediaTimeBean
......
...@@ -3,16 +3,18 @@ package com.base.datarecovery.fragment ...@@ -3,16 +3,18 @@ package com.base.datarecovery.fragment
import android.content.Intent import android.content.Intent
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.activity.PrivacyImportActivity import com.base.datarecovery.activity.privacyspace.PrivacyImportActivity
import com.base.datarecovery.activity.PrivacySpaceActivity import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.adapter.FileGridAdapter import com.base.datarecovery.adapter.FileGridAdapter
import com.base.datarecovery.databinding.FragmentPrivacyPageBinding import com.base.datarecovery.databinding.FragmentPrivacyPageBinding
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
import com.base.datarecovery.help.FileHelp.loadFileByFilter import com.base.datarecovery.help.FileHelp.loadFileByFilter
import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.LogEx import com.base.datarecovery.utils.LogEx
import com.base.datarecovery.view.DialogViews.showCameraSettingDialog import com.base.datarecovery.view.DialogViews.showCameraSettingDialog
import com.base.datarecovery.view.DialogViews.showGerPermission
import com.base.datarecovery.view.DialogViews.showImageImportDialog import com.base.datarecovery.view.DialogViews.showImageImportDialog
import java.io.File import java.io.File
import kotlin.random.Random import kotlin.random.Random
...@@ -32,7 +34,25 @@ class PrivacyPageFragment( ...@@ -32,7 +34,25 @@ class PrivacyPageFragment(
override fun setView() { override fun setView() {
adapter = FileGridAdapter() adapter = FileGridAdapter()
binding.rv.adapter = adapter binding.rv.adapter = adapter
initData()
if (requireContext().checkStorePermission()) {
initData()
} else {
val activity = (requireActivity() as PrivacySpaceActivity)
requireContext().showGerPermission(null, deny = {
activity.finishToMain()
}, allow = {
requireContext().requestStorePermission(activity.launcher, result = {
if (it) {
initData()
} else {
activity.finishToMain()
}
})
})
}
} }
override fun setListener() { override fun setListener() {
......
...@@ -30,7 +30,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() { ...@@ -30,7 +30,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
protected open fun initListener() {} protected open fun initListener() {}
protected fun finishToMain() { fun finishToMain() {
if (this !is MainActivity && !ActivityManagerUtils.getInstance().isActivityInStack(MainActivity::class.java)) { if (this !is MainActivity && !ActivityManagerUtils.getInstance().isActivityInStack(MainActivity::class.java)) {
startActivity(Intent(this, MainActivity::class.java)) startActivity(Intent(this, MainActivity::class.java))
} }
......
...@@ -78,4 +78,34 @@ object FileHelp { ...@@ -78,4 +78,34 @@ object FileHelp {
} }
return data return data
} }
fun getDirFiles(
folder: File,
): ArrayList<File> {
val result = arrayListOf<File>()
//添加第一层文件到链表
val linkList = LinkedList<File>()
folder.listFiles()?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
result.add(it)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
result.add(it)
}
}
}
return result
}
} }
\ No newline at end of file
...@@ -28,4 +28,13 @@ object KotlinExt { ...@@ -28,4 +28,13 @@ object KotlinExt {
fun Long.toFormatTime(): String { fun Long.toFormatTime(): String {
return SimpleDateFormat("MMM dd,yyyy", Locale.getDefault()).format(this) return SimpleDateFormat("MMM dd,yyyy", Locale.getDefault()).format(this)
} }
fun Array<String>.array2String(): String {
val stringBuilder = StringBuilder()
forEach {
stringBuilder.append(it)
}
return stringBuilder.toString()
}
} }
\ No newline at end of file
...@@ -7,7 +7,8 @@ object LogEx { ...@@ -7,7 +7,8 @@ object LogEx {
val isOpen = true val isOpen = true
val filterTAG = arrayOf( val filterTAG = arrayOf(
"FileScanActivity", "FileScanActivity",
"FileHexEx" "FileHexEx",
"FileGridAdapter"
) )
fun logDebug(tag: String, content: String, isMust: Boolean = false) { fun logDebug(tag: String, content: String, isMust: Boolean = false) {
......
package com.base.datarecovery.view;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import androidx.annotation.NonNull;
/**
* 必须制作单独的 java 文件,不懂为啥
*/
public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
@Override
public CharSequence getTransformation(CharSequence source, View view) {
return new PasswordCharSequence(source);
}
private static class PasswordCharSequence implements CharSequence {
private final CharSequence mSource;
public PasswordCharSequence(CharSequence source) {
mSource = source; // Store char sequence
}
public char charAt(int index) {
return '*'; // This is the important part
}
public int length() {
return mSource.length(); // Return default
}
@NonNull
public CharSequence subSequence(int start, int end) {
return mSource.subSequence(start, end); // Return default
}
}
}
package com.base.datarecovery.view
import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.View
import android.widget.TextView
class CustomDialog(context: Context, layoutId: Int) : Dialog(context) {
private var countdownText: TextView? = null
init {
setContentView(layoutId)
val window = window
window?.apply {
setGravity(Gravity.CENTER)
setBackgroundDrawableResource(android.R.color.transparent)
}
setCancelable(false)
}
fun setButtonClickListener(viewId: Int, listener: () -> Unit) {
val button = findViewById<View>(viewId) as? TextView
button?.setOnClickListener {
listener.invoke()
}
}
fun setCountdownText(viewId: Int) {
countdownText = findViewById(viewId)
}
fun updateCountdownText(seconds: String) {
countdownText?.text = seconds
}
}
...@@ -204,8 +204,13 @@ object DialogViews { ...@@ -204,8 +204,13 @@ object DialogViews {
dialog.dismiss() dialog.dismiss()
click.invoke(binding.ivSelector.isSelected, false) click.invoke(binding.ivSelector.isSelected, false)
} }
}
fun Context.showPinReEnterDialog(): CustomDialog {
val dialog = CustomDialog(this, R.layout.dialog_pin_re_enter)
dialog.window?.setDimAmount(0f)
dialog.show()
return dialog
} }
} }
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#355BEA" />
<corners android:radius="10dp" />
</shape>
\ 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="#BEBEBE" />
<corners android:radius="10dp" />
</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="@drawable/bg_pin_normal" android:state_selected="false" />
<item android:drawable="@drawable/bg_pin_enable" android:state_selected="true" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#FA020B" />
<corners android:radius="15dp" />
</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="@drawable/bg_355bea_10" android:state_enabled="true" />
<item android:drawable="@drawable/bg_bebebe_10" android:state_enabled="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#1CC6FA" />
<corners android:radius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#B8B7BD" />
<corners android:radius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360">
<shape
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="7.0">
<size
android:height="48dp"
android:width="48dp" />
<gradient
android:centerColor="#355bea"
android:endColor="#355bea"
android:startColor="#355bea"
android:type="sweep"
android:useLevel="false" />
<stroke
android:width="3dp"
android:color="#FFFFFF" />
<corners android:radius="3dp"/>
</shape>
</rotate>
...@@ -2,23 +2,23 @@ ...@@ -2,23 +2,23 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"> <item android:id="@android:id/background">
<shape> <shape>
<stroke <!-- <stroke-->
android:width="1px" <!-- android:width="1px"-->
android:color="#FF3835" /> <!-- android:color="#FF3835" />-->
<corners android:radius="6dp" /> <solid android:color="#E5E5E5" />
<corners android:radius="10dp" />
</shape> </shape>
</item> </item>
<item
android:id="@android:id/progress" <!-- android:bottom="3dp"-->
android:bottom="3dp" <!-- android:end="3dp"-->
android:end="3dp" <!-- android:start="3dp"-->
android:start="3dp" <!-- android:top="3dp"-->
android:top="3dp"> <item android:id="@android:id/progress">
<scale android:scaleWidth="100%"> <scale android:scaleWidth="100%">
<shape> <shape>
<corners android:radius="5dp" /> <corners android:radius="10dp" />
<solid android:color="#577DFD" />
<solid android:color="#FF3835" />
</shape> </shape>
</scale> </scale>
</item> </item>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#F4F4F6" android:background="#F4F4F6"
android:orientation="vertical" android:orientation="vertical"
tools:context=".activity.PrivacyImportActivity"> tools:context=".activity.privacyspace.PrivacyImportActivity">
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?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:orientation="vertical"
tools:context=".activity.privacyspace.PrivacyPinOneActivity">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/quit"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Please enter PlN"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/fl_1"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin">
<EditText
android:id="@+id/edit_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_2"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_3"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_4"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.privacyspace.PrivacyPinOneActivity">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/quit"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:id="@+id/ll_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Please confirm PIN"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/fl_1"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin">
<EditText
android:id="@+id/edit_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_2"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_3"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
<FrameLayout
android:id="@+id/fl_4"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="8dp"
android:background="@drawable/bg_border_pin"
android:clickable="true"
android:focusable="true">
<EditText
android:id="@+id/edit_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:gravity="center"
android:inputType="numberPassword"
android:maxLength="1"
android:textColor="@color/black"
android:textSize="20sp"
tools:ignore="Autofill,LabelFor"
tools:text="1" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/ll_remember_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/shezhimimaicon"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="48dp"
android:text="Remember your PIN"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center"
android:text="Secret space can't be opened again if you \nforget the PlN"
android:textColor="#666666"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#F2F2F4" android:background="#F2F2F4"
android:orientation="vertical" android:orientation="vertical"
tools:context=".activity.PrivacySpaceActivity"> tools:context=".activity.privacyspace.PrivacySpaceActivity">
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -26,55 +26,68 @@ ...@@ -26,55 +26,68 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
<FrameLayout
android:id="@+id/fl_tip" <LinearLayout
android:id="@+id/ll_tip"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#F5EEDE"
android:orientation="horizontal"
android:paddingVertical="16dp"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:src="@mipmap/tishi"
tools:ignore="ContentDescription,MissingPrefix" />
<LinearLayout <LinearLayout
android:id="@+id/ll_uninstall_tip" android:layout_width="0dp"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="85dp" android:layout_gravity="center_vertical"
android:layout_gravity="center" android:layout_marginStart="8dp"
android:background="#F5EEDE" android:layout_weight="1"
android:orientation="horizontal" android:orientation="vertical">
tools:ignore="UselessParent">
<ImageView <TextView
android:id="@+id/tv_pin_tip"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:text="Protect your private photos adnd videos by creating PIN"
android:layout_marginStart="20dp" tools:ignore="HardcodedText" />
android:src="@mipmap/tishi"
tools:ignore="ContentDescription,MissingPrefix" />
<TextView <TextView
android:layout_width="0dp" android:id="@+id/tv_uninstall_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:layout_weight="1"
android:text="If you uninstall the app or clear the app data, the content of Secret Space may be lost" android:text="If you uninstall the app or clear the app data, the content of Secret Space may be lost"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_go_it"
android:layout_width="85dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="24dp"
android:background="@drawable/bg_577dfd_17_5"
android:gravity="center"
android:text="Got it"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout> </LinearLayout>
</FrameLayout> <TextView
android:id="@+id/tv_go_or_setting"
android:layout_width="85dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="24dp"
android:background="@drawable/bg_577dfd_17_5"
android:gravity="center"
android:text="Got it"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F4F5F9"
android:orientation="vertical"
tools:ignore="UselessParent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="@id/tv_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_title">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
android:tint="@color/black"
tools:ignore="ContentDescription,UseAppTint" />
</FrameLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screenshot Cleaner"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.1"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_recycle_bin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="16dp"
android:padding="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3" />
<LinearLayout
android:id="@+id/ll_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="@id/tv_title"
app:layout_constraintStart_toStartOf="@id/tv_title"
app:layout_constraintTop_toBottomOf="@id/tv_title">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/theme_color"
android:textSize="40sp"
android:textStyle="bold"
tools:text="90.1" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:includeFontPadding="false"
android:textColor="@color/theme_color"
android:textSize="16sp"
tools:text="MB" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginBottom="30dp"
android:text="Screenshots totally"
android:textColor="#666666"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/tv_title"
app:layout_constraintStart_toStartOf="@id/tv_title"
app:layout_constraintTop_toBottomOf="@id/ll_size"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="80dp">
<LinearLayout
android:id="@+id/ll_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:minWidth="23dp"
android:minHeight="23dp"
android:src="@drawable/bg_square_selector"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select All"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_clean"
android:layout_width="266dp"
android:layout_height="50dp"
android:background="@drawable/bg_button_enable_selector"
android:enabled="false"
android:gravity="center"
android:text="CLEAN"
android:textColor="@color/white"
android:textSize="19sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ll_select_all"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
android:id="@+id/pb" android:id="@+id/pb"
style="@style/Widget.AppCompat.ProgressBar.Horizontal" style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="15dp" android:layout_height="10dp"
android:layout_marginHorizontal="32dp" android:layout_marginHorizontal="32dp"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:max="100" android:max="100"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="#F4F5F9"
android:orientation="vertical"
tools:context=".activity.whatsapp.WhatsAppCleanerActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:ignore="UselessParent">
<View
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
android:tint="@color/black"
tools:ignore="ContentDescription,UseAppTint" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="WhatsApp Cleaner"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginVertical="25dp"
android:orientation="vertical"
tools:ignore="UselessParent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#4772FF"
android:textSize="45sp"
android:textStyle="bold"
tools:text="108.7" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginStart="8dp"
android:textColor="#4772FF"
android:textSize="12sp"
android:textStyle="bold"
tools:text="KB" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="14dp"
android:text="Cleanable"
android:textColor="#666666"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:background="@color/white"
android:paddingVertical="8dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_whatsapp" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" />
<TextView
android:id="@+id/tv_tv_got_it"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="20dp"
android:gravity="center"
android:text="Got it"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
android:background="@drawable/bg_355bea_10"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
\ 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="#F4F5F9"
android:orientation="vertical"
tools:context=".activity.whatsapp.WhatsAppMessageCleanActivity">
<View
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
android:tint="@color/black"
tools:ignore="ContentDescription,UseAppTint" />
</FrameLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText"
tools:text="Image Messages" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginVertical="25dp"
android:orientation="vertical"
tools:ignore="UselessParent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#4772FF"
android:textSize="45sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_marginStart="8dp"
android:text="KB"
android:textColor="#4772FF"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="14dp"
android:text="Cleanable"
android:textColor="#666666"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:background="@color/white"
tools:listitem="@layout/item_media_select" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/white">
<LinearLayout
android:id="@+id/ll_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:minWidth="23dp"
android:minHeight="23dp"
android:src="@drawable/bg_square_selector"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select All"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_clean"
android:layout_width="266dp"
android:layout_height="50dp"
android:background="@drawable/bg_button_enable_selector"
android:enabled="false"
android:gravity="center"
android:text="CLEAN"
android:textColor="@color/white"
android:textSize="19sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ll_select_all"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="90dp"
android:background="@drawable/bg_ffffff_10"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:indeterminate="true"
android:indeterminateDrawable="@drawable/circle_progress_bar" />
<TextView
android:id="@+id/dialog_ad_loading_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:layout_marginEnd="18dp"
android:text="Advertising in preparation..."
android:textColor="#ff000000"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?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="250dp"
android:layout_height="80dp"
app:cardBackgroundColor="@color/black"
app:cardCornerRadius="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="20dp"
android:gravity="center"
android:text="Password does not match,\nplease re-enter"
android:textColor="@color/white"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</androidx.cardview.widget.CardView>
\ No newline at end of file
...@@ -171,6 +171,8 @@ ...@@ -171,6 +171,8 @@
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true"
android:focusable="true"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp"> app:cardElevation="0dp">
...@@ -254,10 +256,13 @@ ...@@ -254,10 +256,13 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_screenshot"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true"
android:focusable="true"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp"> app:cardElevation="0dp">
......
<?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_marginHorizontal="20dp"
android:layout_marginVertical="6dp">
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="50dp"
android:layout_height="50dp"
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"
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:singleLine="true"
android:textColor="#333333"
android:textSize="15sp"
tools:text="VID_20240210_200748.mp3" />
<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="14sp"
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
<?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="109dp"
android:layout_height="109dp"
android:layout_margin="8dp"
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="25dp"
android:layout_height="25dp"
android:layout_gravity="end"
android:layout_margin="10dp"
android:src="@drawable/bg_circle_selector"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?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="0dp"
android:layout_weight="1"
android:layout_columnWeight="1"
android:layout_height="109dp"
android:layout_margin="4dp"
app:cardCornerRadius="5dp">
<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="25dp"
android:layout_height="25dp"
android:layout_gravity="end"
android:layout_margin="5dp"
android:importantForAccessibility="no"
android:src="@drawable/bg_circle_selector" />
</androidx.cardview.widget.CardView>
<?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_margin="15dp"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UselessParent">
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText"
tools:text="3024/06" />
<TextView
android:id="@+id/tv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:text="SELECT ALL"
android:textColor="@color/theme_color"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</FrameLayout>
<GridLayout
android:id="@+id/group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:columnCount="3" />
</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="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="ContentDescription"
tools:src="@mipmap/audiomessages" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Video Messages"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_no_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="No video messages found."
android:textColor="#999999"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="0 KB"
android:textColor="#999999"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp"
android:src="@mipmap/jianotu_whatsapp"
tools:ignore="ContentDescription" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="55dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_iv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:visibility="gone">
<ImageView
android:id="@+id/iv_1"
android:layout_width="90dp"
android:layout_height="90dp"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_2"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="12dp"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_3"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="12dp"
tools:ignore="ContentDescription" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="16dp"
android:background="#EEEEEE" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -3,4 +3,6 @@ ...@@ -3,4 +3,6 @@
<color name="black">#FF000000</color> <color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="color_747474">#747474</color> <color name="color_747474">#747474</color>
<color name="color_fa020b">#FA020B</color>
<color name="theme_color">#50B3FA</color>
</resources> </resources>
\ No newline at end of file
<resources> <resources>
<string name="app_name">Data Recovery</string> <string name="app_name">File Recovery</string>
<!-- TODO: Remove or change this placeholder text --> <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
<string name="facebook_app_id">11</string> <string name="facebook_app_id">11</string>
......
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