Commit ea161f3e authored by wanglei's avatar wanglei

...

parent f60cbf70
package com.base.filerecoveryrecyclebin.activity
import android.content.Intent
import android.graphics.Color
import android.graphics.Typeface
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
......@@ -13,8 +15,10 @@ import com.base.filerecoveryrecyclebin.fragment.HomeFragment
import com.base.filerecoveryrecyclebin.fragment.RecycleBinFragment
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.PermissionHelp.checkStorePermission
import com.base.filerecoveryrecyclebin.service.StayNotificationService
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.DialogViews.showExitDialog
import com.base.filerecoveryrecyclebin.view.PermissionDialog.showPermissionBottomSheet
import com.base.filerecoveryrecyclebin.view.RateStarPop.showRateStarPopDialog
import kotlinx.coroutines.Dispatchers
......@@ -40,11 +44,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun initView() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
BarUtils.setStatusBarColor(this, Color.parseColor("#F2F3F7"))
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
// showRateStarPopDialog()
// showExitFunctionDialog()
binding.viewpager2.run {
adapter = object : FragmentStateAdapter(this@MainActivity) {
......@@ -67,11 +68,25 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.ll1.setOnClickListener {
binding.viewpager2.currentItem = 0
BarUtils.setStatusBarColor(this, Color.parseColor("#F2F3F7"))
}
binding.ll2.setOnClickListener {
binding.viewpager2.currentItem = 1
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
}
}
private fun initStayServiceObserver() {
startService(Intent(this, StayNotificationService::class.java).apply {
this.action = StayNotificationService.MEDIA_OBSERVER_ACTION
})
startService(Intent(this, StayNotificationService::class.java).apply {
this.action = StayNotificationService.FILE_OBSERVER_ACTION
putExtra("isStart", true)
})
}
private fun setPage(p: Int) {
......@@ -94,7 +109,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun initListener() {
super.initListener()
onBackPressedDispatcher.addCallback {
showExitDialog()
}
}
override fun onResume() {
......@@ -103,6 +120,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
if (dialog == null) {
dialog = showPermissionBottomSheet(launcher)
}
} else {
initStayServiceObserver()
}
lifecycleScope.launch(Dispatchers.Main) {
......
......@@ -5,6 +5,7 @@ import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
......@@ -51,10 +52,14 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
finishToMain()
AdmobMaxHelper.admobMaxShowInterstitialAd(this@FileRecoveredActivity) {
finishToMain()
}
}
binding.tvContinue.setOnClickListener {
finish()
AdmobMaxHelper.admobMaxShowInterstitialAd(this) {
finish()
}
}
binding.tvFinish.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
......
......@@ -114,9 +114,11 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
filterDismiss(bean)
}
binding.rvFilter.adapter = filterAdapter
}
override fun onResume() {
super.onResume()
initData()
}
override fun initListener() {
......@@ -168,7 +170,6 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>() {
showRecoveringDialog(lifecycleScope, list, dir, copyProgressAction = {
}, finish = {
adapter.toggleAllSelect(false)
startActivity(Intent(this, FileRecoveredActivity::class.java).apply {
putExtra("Number", list.size)
putExtra("ScanType", scanType)
......
......@@ -12,7 +12,9 @@ import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.gson.Gson
import java.io.File
/**
* Observer MediaContent add
*/
class MediaContentObserver(val context: Context, val handler: Handler? = null) : ContentObserver(null) {
private val TAG = "MediaContentObserver"
......@@ -21,9 +23,16 @@ class MediaContentObserver(val context: Context, val handler: Handler? = null) :
override fun onChange(selfChange: Boolean, uri: Uri?) {
super.onChange(selfChange, uri)
LogEx.logDebug(TAG, "uri=${uri.toString()}")
if (uri.toString().contains("images")) {
}
if (uri.toString().contains("video")) {
}
uri?.let { queryNewMediaFiles(it) }
}
@SuppressLint("Range")
private fun queryNewMediaFiles(uri: Uri) {
// 查询新添加的媒体文件
......
......@@ -82,6 +82,11 @@ object AdMaxInterstitialUtils {
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
LogEx.logDebug(TAG, "onAdDisplayFailed")
val obj2 = JSONObject()
obj2.put("code", p1.code)
obj2.put("reason", p1.message)
obj2.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj2)
}
})
}
......
......@@ -65,6 +65,7 @@ object AdMaxOpenUtils {
onHidden?.invoke()
appOpenAd?.loadAd()
val obj = JSONObject()
obj.put("code", p1.code)
obj.put("reason", p1.message)
obj.put("ad_unit", "openAd")
EventUtils.event("ad_show_error", ext = obj)
......
......@@ -2,9 +2,7 @@ package com.base.filerecoveryrecyclebin.fragment
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.view.View
import androidx.annotation.RequiresApi
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
......@@ -52,13 +50,7 @@ class RecycleBinFragment : BaseFragment<FragmentRecycleBinBinding>() {
}
StayNotificationService.mainHandler = handler
requireActivity().startService(Intent(requireActivity(), StayNotificationService::class.java).apply {
this.action = StayNotificationService.MEDIA_OBSERVER_ACTION
})
requireActivity().startService(Intent(requireContext(), StayNotificationService::class.java).apply {
this.action = StayNotificationService.FILE_OBSERVER_ACTION
putExtra("isStart", true)
})
recycleBinAdapter = RecycleBinAdapter { bean ->
startActivity(Intent(requireContext(), RecycleBinDetailActivity::class.java).apply {
putExtra("Json", Gson().toJson(bean))
......@@ -80,6 +72,7 @@ class RecycleBinFragment : BaseFragment<FragmentRecycleBinBinding>() {
}
}
@RequiresApi(Build.VERSION_CODES.Q)
override fun setListener() {
super.setListener()
binding.flGengduo.setOnClickListener {
......
......@@ -18,9 +18,9 @@ object ConfigHelper {
const val nativeAdmobId = "ca-app-pub-3940256099942544/2247696110"
const val openAdmobId = "/6499/example/app-open"
const val interAdMaxId = "ca-app-pub-3940256099942544/1033173712"
const val interAdMaxId = "YOUR_AD_UNIT_ID"
const val nativeAdMaxId = "YOUR_AD_UNIT_ID"
const val openAdMaxId = "/6499/example/app-open"
const val openAdMaxId = "YOUR_AD_UNIT_ID"
//一定展示大图广告
var mustShowNativeAd: Boolean = false
......
......@@ -73,20 +73,14 @@ class StayNotificationService : Service() {
}
if (action == FILE_OBSERVER_ACTION) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val flag = intent.extras?.getBoolean("isStart") ?: false
LogEx.logDebug(TAG, "action=$action flag=$flag")
startMyFileObserver(flag)
startMyFileObserver()
}
}
if (isRunning) {
stopSelf()
return START_NOT_STICKY
if (!isRunning) {
val notification = createPermanentNotification(applicationContext)
startForeground(1, notification)
isRunning = true
}
val notification = createPermanentNotification(applicationContext)
startForeground(1, notification)
return START_STICKY
}
......@@ -94,12 +88,18 @@ class StayNotificationService : Service() {
private fun observerMediaContentObserver() {
if (mediaContentObserver == null) {
mediaContentObserver = MediaContentObserver(this,mainHandler)
LogEx.logDebug(TAG, "observerMediaContentObserver")
mediaContentObserver = MediaContentObserver(this, mainHandler)
mediaContentObserver?.let {
this.contentResolver.registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, it
)
this.contentResolver.registerContentObserver(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, it
)
}
}
}
......@@ -107,23 +107,25 @@ class StayNotificationService : Service() {
private var myFileObserver: MyFileObserver? = null
@RequiresApi(Build.VERSION_CODES.Q)
fun startMyFileObserver(isStart: Boolean) {
fun startMyFileObserver() {
if (myFileObserver == null) {
LogEx.logDebug(TAG, "startMyFileObserver")
val dcimList = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM))
val pictureList = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES))
val downloadList = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS))
val videoList = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES))
val watchList = arrayListOf<File>()
watchList.addAll(dcimList)
watchList.addAll(pictureList)
watchList.addAll(downloadList)
watchList.addAll(videoList)
watchList.forEach {
LogEx.logDebug(TAG, "watchList=${it.absolutePath}")
}
myFileObserver = MyFileObserver(handler = mainHandler, watchList)
LogEx.logDebug(TAG, "watchList=${dcimList.size}")
}
if (isStart) {
myFileObserver?.startWatching()
} else {
myFileObserver?.stopWatching()
}
}
......
package com.base.filerecoveryrecyclebin.view
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.databinding.DialogCameraSettingBinding
import com.base.filerecoveryrecyclebin.databinding.DialogDeletePermanentlyBinding
import com.base.filerecoveryrecyclebin.databinding.DialogExitAppBinding
import com.base.filerecoveryrecyclebin.databinding.DialogExitFunctionBinding
import com.base.filerecoveryrecyclebin.databinding.DialogImageTakeBinding
import com.base.filerecoveryrecyclebin.databinding.DialogPermissonOpenBinding
......@@ -24,7 +29,6 @@ import com.base.filerecoveryrecyclebin.databinding.DialogRemoveFileTipBinding
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatTime
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.DialogViews.showDeletePermanentlyDialog
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.coroutines.Dispatchers
......@@ -38,6 +42,7 @@ import kotlinx.coroutines.launch
import java.io.File
import kotlin.random.Random
object DialogViews {
private val TAG = "DialogViews"
......@@ -312,5 +317,39 @@ object DialogViews {
}
}
fun Activity.showExitDialog() {
val dialog = BottomSheetDialog(this)
val binding = DialogExitAppBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.setCancelable(false)
dialog.show()
// dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
// dialog.window?.findViewById<View?>(com.google.android.material.R.id.design_bottom_sheet)
// ?.setBackgroundResource(android.R.color.transparent)
// (binding.root.parent as ViewGroup).background =
// ColorDrawable(Color.TRANSPARENT)
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val lp: WindowManager.LayoutParams? = dialog.window?.attributes
lp?.alpha = 0f
lp?.dimAmount = 0.0f
window.setAttributes(lp)
// val parentView = binding.root.parent as View
// BottomSheetBehavior.from(parentView).state = BottomSheetBehavior.STATE_EXPANDED
binding.tvY.setOnClickListener {
startActivity(Intent(this, ScanJunkActivity::class.java))
}
binding.tvExit.setOnClickListener {
this.finish()
}
}
}
......@@ -3,6 +3,7 @@ package com.base.filerecoveryrecyclebin.view
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import com.base.filerecoveryrecyclebin.activity.MainActivity
import com.base.filerecoveryrecyclebin.databinding.DialogPermissionBottomsheetBinding
import com.base.filerecoveryrecyclebin.help.ActivityLauncher
import com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:background="@drawable/bg_ffffff_tlr20"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_tittle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="25dp"
android:layout_marginTop="100dp"
android:text="Junk files are slowing down your phone"
android:textColor="@android:color/black"
android:textSize="22sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="25dp"
android:layout_marginTop="30dp"
android:text="Remove them now and release your phone space with one click!"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_y"
android:layout_width="300dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:background="@drawable/bg_4773ff_22"
android:gravity="center"
android:text="Remove now"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_exit"
android:layout_width="300dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="15dp"
android:gravity="center"
android:text="Exit"
android:textColor="#999999"
android:textSize="17sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<ImageView
android:id="@+id/iv"
android:layout_width="95dp"
android:layout_height="95dp"
android:layout_marginStart="30dp"
android:layout_marginBottom="-30dp"
android:src="@mipmap/junk_exit"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -103,87 +103,6 @@
android:visibility="gone"
tools:text="Scanned junk files 29.69MB" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="File"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:orientation="horizontal"
tools:ignore="DisableBaselineAlignment">
<androidx.cardview.widget.CardView
android:id="@+id/card_screenshot"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="@mipmap/photo"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Screenshot\nCleaner"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/h_screenshot"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/card_repeat_photos"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="@mipmap/videos"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Duplicate\nPhotos"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/h_similar" />
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
......@@ -439,6 +358,90 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:text="File"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp"
android:orientation="horizontal"
tools:ignore="DisableBaselineAlignment">
<androidx.cardview.widget.CardView
android:id="@+id/card_screenshot"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="@mipmap/photo"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Screenshot\nCleaner"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/h_screenshot"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/card_repeat_photos"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="@mipmap/videos"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Duplicate\nPhotos"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/h_similar"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
......
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