Commit e6d131ed authored by wanglei's avatar wanglei

------------同步到主包5.15 22:05分线上版本------------

parent 686b488a
#Wed May 15 09:35:48 CST 2024
#Wed May 15 15:19:32 CST 2024
gradle.version=8.0
......@@ -140,4 +140,5 @@ dependencies {
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
implementation 'com.makeramen:roundedimageview:2.3.0'
implementation 'com.github.ihsg:PatternLocker:2.5.7'
}
......@@ -15,6 +15,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission
android:name="android.permission.DELETE_CACHE_FILES"
tools:ignore="ProtectedPermissions" />
......@@ -143,12 +144,6 @@
<activity
android:name=".ui.home.MainActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.JunkCleanActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.clean"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.RecentlyActivity"
android:exported="false"
......@@ -302,6 +297,23 @@
<activity
android:name=".ui.page.photocompress.photo.PreviewCompressionPhotoActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.applock.AppLockActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.applock.AppLockManagerActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.speed.SpeedActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.speed.SpeedFinishActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.speed.BatteryOptimizerActivity"
android:screenOrientation="portrait" />
<service android:name=".ui.page.applock.ProtectorService" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
......
......@@ -21,8 +21,11 @@ import com.zxhyis.toolss.ad.ComUtils
import com.zxhyis.toolss.ad.ComUtils.isMainProcess
import com.zxhyis.toolss.ad.ConfigHelper
import com.zxhyis.toolss.ad.EventHelper
import com.zxhyis.toolss.ad.FIRST_LAUNCH_TIME_KEY
import com.zxhyis.toolss.ad.GravitySensorManager
import com.zxhyis.toolss.ad.bean.EventParams
import com.zxhyis.toolss.ad.queryDataStoreBlock
import com.zxhyis.toolss.ad.saveDataStoreBlock
import com.zxhyis.toolss.common.notification.ActionBroadcast.Companion.initBroadcast
import com.zxhyis.toolss.common.notification.NotificationBroadcast
import com.zxhyis.toolss.common.notification.NotificationHelper
......@@ -97,6 +100,11 @@ class FileApp : Application() {
initBroadcast()
newInitBroadcast()
//第一次启动时间
val firstLaunchTime = queryDataStoreBlock(FIRST_LAUNCH_TIME_KEY, 0L)
if (firstLaunchTime == 0L) {
saveDataStoreBlock(FIRST_LAUNCH_TIME_KEY, System.currentTimeMillis())
}
}
......
......@@ -17,6 +17,14 @@ import com.zxhyis.toolss.ui.page.SplashActivity
object ConfigHelper {
var isOpenNotification = false
var ifAppLock = false
get() {
return SPUtils.getInstance().getBoolean("ifAppLock", field)
}
set(value) {
field = value
SPUtils.getInstance().put("ifAppLock", value, true)
}
var junkSizeClean = 0L
get() {
return SPUtils.getInstance().getLong("junkSizeClean", field)
......
......@@ -40,11 +40,14 @@ object PushManager {
* @param actionId 功能或者场景的id
*/
fun isPush(actionId: Int, eventParams: EventParams? = null): Boolean {
// 新用户是否显示
val pushManagement = ComUtils.getPushConfig()
if (!newUserPush(pushManagement.newuser_avoid_time)) {
LogEx.logDebug(TAG, "新用户不推送")
EventHelper.event("pushCircleOrder_isPush", "新用户不推送", eventParams = eventParams)
// 新用户是否显示
val newUserAvoidFlag = newUserPush(pushManagement.newuser_avoid_time)
val newUserLog = "新用户推送 newuser_avoid_time=${pushManagement.newuser_avoid_time} newUserFlag=$newUserAvoidFlag"
LogEx.logDebug(TAG, newUserLog)
if (!newUserAvoidFlag) {
EventHelper.event("pushCircleOrder_isPush", newUserLog, eventParams = eventParams)
return false
}
......@@ -58,9 +61,22 @@ object PushManager {
//是否上次推送间隔大于配置间隔
val isOganic = UserChancelEx.isOrganicUser()
val interval = if (isOganic) pushManagement.o_push_interval else pushManagement.all_push_interval
if (!canPushNextTime(interval)) {
LogEx.logDebug(TAG, "推送总间隔不推送")
EventHelper.event("pushCircleOrder_isPush", "推送总间隔不推送", eventParams = eventParams)
val intervalFlog = canPushNextTime(interval)
val intervalLog = "推送总间隔推送 interval=$interval intervalFlog=$intervalFlog"
LogEx.logDebug(TAG, intervalLog)
if (!intervalFlog) {
EventHelper.event("pushCircleOrder_isPush", intervalLog, eventParams = eventParams)
return false
}
//当前类型通知推送间隔是否大于配置间隔
val pushCfg: PushCfg? = ComUtils.getPushTypeData(actionId.toString())
val pushInterval = pushCfg?.push_interval ?: 0
val actionIdIntervalFlag = actionTypeCanPsh(actionId)
val log = "当前通知类型间隔推送 actionId=$actionId pushInterval=$pushInterval actionIdIntervalFlag=$actionIdIntervalFlag"
LogEx.logDebug(TAG, log)
if (!actionIdIntervalFlag) {
EventHelper.event("pushCircleOrder_isPush", log, eventParams = eventParams)
return false
}
......@@ -71,14 +87,15 @@ object PushManager {
return false
}
//进程是否是活的
// Log.d("MXL", "postNotification")
if (!TextUtils.isEmpty(JinChengCheck.getAliveProcessName(FileApp.fContext))) {
LogEx.logDebug(TAG, "app当前进程未拉起不推送")
EventHelper.event("pushCircleOrder_isPush", "app当前进程未拉起不推送", eventParams = eventParams)
return false
}
return true
}
......
......@@ -19,7 +19,7 @@ class PushCfg(
const val ID_JUNK_CLEAN_PUSH = 11001 //清理垃圾
const val ID_BOOST_PUSH = 11002 //性能优化
const val ID_VIRUS_PUSH = 11003//扫描病毒
const val ID_BATTERY_PUSH = 11004// 电量优化
const val ID_BATTERY_PUSH = 11004// 电量信息
const val ID_COOL_PUSH = 11005//手机降温
const val ID_BIGFILE_PUSH = 11006// 大文件清理
const val ID_DUPLICATE_FILE_PUSH = 11007//文件备份,重复文件,相似文件
......@@ -32,6 +32,7 @@ class PushCfg(
const val ID_RECENT_USE_APP = 11014//最近使用APP
const val ID_SIMILAR_IMAGE = 11015//清理相似图片
const val ID_CLEAN_SPEAKER = 11016//清理扬声器
const val ID_BATTERY_OPTIMIZATION=11017//电池优化
//场景触发push actionId 被动发送
const val ID_WIFI_PUSH = 22001//连接wifi时
......@@ -40,7 +41,7 @@ class PushCfg(
const val ID_CHARGE = 22004//充电
const val ID_LOW_BATTERY_PUSH = 22005//电量低于阈值时
const val ID_LOW_RAM_PUSH = 22007//内存低于阈值
const val ID_PHONE_ACCELERATE=22011//手机加速
}
}
......
......@@ -22,6 +22,8 @@ import com.zxhyis.toolss.ui.page.notifaction.NotificationCleanActivity
import com.zxhyis.toolss.ui.page.notifaction.NotificationGuestActivity
import com.zxhyis.toolss.ui.page.photocompress.photo.StartCompressionPhotoActivity
import com.zxhyis.toolss.ui.page.recentusage.RecentAppActivity
import com.zxhyis.toolss.ui.page.speed.BatteryOptimizerActivity
import com.zxhyis.toolss.ui.page.speed.SpeedActivity
/**
......@@ -94,6 +96,10 @@ class NotificationBroadcast : BroadcastReceiver() {
cancelNotification(context)
}
PushCfg.ID_BATTERY_OPTIMIZATION -> {
context.startActivity<BatteryOptimizerActivity>(flag = FLAG_ACTIVITY_NEW_TASK)
cancelNotification(context)
}
//================================被动广播=========================================
......@@ -117,8 +123,8 @@ class NotificationBroadcast : BroadcastReceiver() {
cancelNotification(context)
}
PushCfg.ID_LOW_RAM_PUSH -> {
context.startActivity<RecentAppActivity>(flag = FLAG_ACTIVITY_NEW_TASK)
PushCfg.ID_PHONE_ACCELERATE -> {
context.startActivity<SpeedActivity>(flag = FLAG_ACTIVITY_NEW_TASK)
cancelNotification(context)
}
}
......@@ -127,14 +133,14 @@ class NotificationBroadcast : BroadcastReceiver() {
}
}
private fun cancelNotification(context: Context) {
companion object {
const val action = "com.file.notification.NotificationBroadcast"
fun cancelNotification(context: Context) {
val id = NotificationHelper.notificationId
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.cancel(id)
}
companion object {
const val action = "com.file.notification.NotificationBroadcast"
}
}
\ No newline at end of file
......@@ -27,6 +27,7 @@ import com.zxhyis.toolss.ad.ComUtils
import com.zxhyis.toolss.ad.EventHelper
import com.zxhyis.toolss.ad.bean.EventParams
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_APP_MANAGER
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_BATTERY_OPTIMIZATION
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_BATTERY_PUSH
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_BIGFILE_PUSH
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_CHARGE
......@@ -37,6 +38,7 @@ import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_JUNK_CLEAN_PUSH
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_LOW_BATTERY_PUSH
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_LOW_RAM_PUSH
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_NETWORK_TRAFFIC
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_PHONE_ACCELERATE
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_PHOTO_COMPRESS
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_RECENT_USE_APP
import com.zxhyis.toolss.ad.bean.PushCfg.Companion.ID_SIMILAR_IMAGE
......@@ -74,7 +76,6 @@ object NotificationHelper {
val supportNotification = arrayListOf(
ID_JUNK_CLEAN_PUSH,
ID_VIRUS_PUSH,
ID_BATTERY_PUSH,
ID_BIGFILE_PUSH,
ID_PHOTO_COMPRESS,
ID_APP_MANAGER,
......@@ -82,7 +83,8 @@ object NotificationHelper {
ID_CLEAN_NOTIFICATION,
ID_RECENT_USE_APP,
ID_SIMILAR_IMAGE,
ID_CLEAN_SPEAKER
ID_CLEAN_SPEAKER,
ID_BATTERY_OPTIMIZATION,
)
/**
......@@ -115,6 +117,7 @@ object NotificationHelper {
*/
fun getPresentPushId(): Int {
val pushCircleOrder = ComUtils.getPushConfig().push_circle_order
LogEx.logDebug(TAG, "push_circle_order=$pushCircleOrder")
val tempList = arrayListOf<Int>()
val json =
......@@ -171,11 +174,11 @@ object NotificationHelper {
remoteViews.setTextViewText(R.id.tv_btn, "Scan")
}
ID_BATTERY_PUSH -> {
ID_BATTERY_OPTIMIZATION -> {
remoteViews.setImageViewResource(R.id.iv_icon, R.mipmap.dianchi_notifi)
remoteViews.setTextViewText(R.id.tv_desc, "View phone battery consumption recently")
remoteViews.setTextViewText(R.id.tv_btn, "View")
val random = Random.nextInt(0, 50)
remoteViews.setTextViewText(R.id.tv_desc, "$random Apps are consuming photo power")
remoteViews.setTextViewText(R.id.tv_btn, "Optimize")
}
ID_BIGFILE_PUSH -> {
......@@ -252,7 +255,7 @@ object NotificationHelper {
remoteViews.setTextViewText(R.id.tv_btn, "View")
}
ID_LOW_RAM_PUSH -> {
ID_PHONE_ACCELERATE -> {
remoteViews.setImageViewResource(R.id.iv_icon, R.mipmap.neicundi)
remoteViews.setTextViewText(R.id.tv_desc, "Ram usage reached $extra%, optimize now!")
remoteViews.setTextViewText(R.id.tv_btn, "Optimize")
......@@ -274,23 +277,20 @@ object NotificationHelper {
val cancelPendingIntent = PendingIntent.getBroadcast(FileApp.fContext, cancelRequestCode, cancelIntent, flag)
remoteViews.setOnClickPendingIntent(R.id.fl_cancel, cancelPendingIntent)
//按钮事件
val btnIntent = Intent(NotificationBroadcast.action).apply {
putExtra("actionId", actionId)
}
val btnRequestCode = Random.nextInt(0, 1000)
val btnPendingIntent = PendingIntent.getBroadcast(FileApp.fContext, btnRequestCode, btnIntent, flag)
remoteViews.setOnClickPendingIntent(R.id.fl_btn, btnPendingIntent)
val intent = Intent(applicationContext, SplashActivity::class.java)
val title: String = ""
val desc: String = ""
var myValue = 0
myValue = actionId
val customKey = "type"
intent.putExtra("title", title)
intent.putExtra("desc", desc)
intent.putExtra(customKey, myValue)
val customKey = "type"
intent.putExtra(customKey, actionId)
//按钮事件
val btnRequestCode = Random.nextInt(0, 1000)
val btnPendingIntent = PendingIntent.getActivity(FileApp.fContext, btnRequestCode, intent, flag)
remoteViews.setOnClickPendingIntent(R.id.fl_btn, btnPendingIntent)
//每种类型保存值
FileApp.fContext.saveDataStoreBlock(createByActionId(actionId), System.currentTimeMillis())
//大间隔所需值
......@@ -367,3 +367,4 @@ object NotificationHelper {
notificationManager.notify(notificationId, notification)
}
}
......@@ -29,13 +29,9 @@ class NotificationTimerTask(val eventParams: EventParams?) : TimerTask() {
fun oneShotNotification(noLimit: Boolean = false) {
//内存低于阀值推送
val flag = postRamLower60()
//是否推送手机加速
val flag = isPostPhoneAccelerate()
if (flag) {
val log = "postRamLower60 isPush=$flag"
EventHelper.event("pushCircleOrder_isPush", log, eventParams = eventParams)
val extra = RamMemoryEx.getMemoryUsage(FileApp.fContext).toInt()
FileApp.fContext.postActionNotification(ID_LOW_RAM_PUSH, eventParams, extra)
return
}
......@@ -49,16 +45,31 @@ class NotificationTimerTask(val eventParams: EventParams?) : TimerTask() {
}
}
private fun postRamLower60(): Boolean {
val ss = RamMemoryEx.getMemoryUsage(FileApp.fContext)
val memoryPushTime = FileApp.fContext.queryDataStoreBlock(createByActionId(PushCfg.ID_LOW_RAM_PUSH), 0)
val flag = System.currentTimeMillis() - memoryPushTime > 20.minutes.toLong(DurationUnit.MILLISECONDS)
val isPush = PushManager.isPush(ID_LOW_RAM_PUSH)
if (ss > 60 && flag && isPush) {
FileApp.fContext.postActionNotification(PushCfg.ID_LOW_RAM_PUSH)
return true
private fun isPostPhoneAccelerate(): Boolean {
val extra = RamMemoryEx.getMemoryUsage(FileApp.fContext)
var log: String = ""
if (extra < 60) {
log = "isPostPhoneAccelerate ram<60 ram=$extra"
EventHelper.event("pushCircleOrder_isPush ", log, eventParams = eventParams)
return false
}
val memoryPushTime = FileApp.fContext.queryDataStoreBlock(createByActionId(PushCfg.ID_PHONE_ACCELERATE), 0)
val interval = System.currentTimeMillis() - memoryPushTime
val flag = interval > 20.minutes.toLong(DurationUnit.MILLISECONDS)
if (!flag) {
log = "isPostPhoneAccelerate interval < 20minus interval=$interval"
EventHelper.event("pushCircleOrder_isPush ", log, eventParams = eventParams)
return false
}
val isPush = PushManager.isPush(PushCfg.ID_PHONE_ACCELERATE)
if (!isPush) {
return false
}
return flag
FileApp.fContext.postActionNotification(PushCfg.ID_PHONE_ACCELERATE, eventParams, extra.toInt())
return true
}
}
\ No newline at end of file
......@@ -54,35 +54,4 @@ class PackageBroadcast : BroadcastReceiver() {
}
}
}
fun lowJunkPush(context: Context) {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
val availableMemory = memoryInfo.availMem
val totalMemory = memoryInfo.totalMem
val num = totalMemory - availableMemory
val entity = ComUtils.getPushTypeData("22005")
if (num >= (entity?.feature_ex1 ?: 0)) {
// 展示性能变差推送
val flag = PushManager.isPush(PushCfg.ID_LOW_RAM_PUSH)
if (flag) {
FileApp.fContext.postActionNotification(PushCfg.ID_LOW_RAM_PUSH)
}
}
}
fun charging(intent: Intent?) {
//电量发生变化
val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1
val scale: Int? = intent?.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
//低电量阀值推送
val config = ComUtils.getPushTypeData(ID_LOW_BATTERY_PUSH.toString())
val flag = PushManager.isPush(ID_LOW_BATTERY_PUSH)
val lowValue = config?.feature_ex1 ?: 0
if (flag && (level < lowValue)) {
FileApp.fContext.postActionNotification(ID_LOW_BATTERY_PUSH)
}
}
}
\ No newline at end of file
......@@ -12,7 +12,7 @@ object RamMemoryEx {
val totalMemory: Long = memoryInfo.totalMem
val availableMemory: Long = memoryInfo.availMem
val usedMemory = (totalMemory - availableMemory).toDouble()
return DecimalFormat("##.#").format(usedMemory / totalMemory * 100).toFloat()
return ((usedMemory / totalMemory) * 100).toFloat()
}
}
......@@ -13,5 +13,8 @@ object AFunOb {
const val SIMILAR_PHOTOS = "Similar Photos"
const val SPEAK_CLEANER = "Speaker Cleaner"
const val PHOTO_COMPRESS = "Photo Compress"
const val APPP_LOCK = "App Lock"
const val APPP_SPEED = "App Speed"
const val BATTERY_OPTIMIZER = "Battery Optimizer"
}
\ No newline at end of file
......@@ -7,6 +7,7 @@ import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater
import com.blankj.utilcode.util.ClickUtils
import com.zxhyis.toolss.databinding.DialogLayoutFlowTypeBinding
import com.zxhyis.toolss.databinding.DialogLayoutLastStepBinding
import com.zxhyis.toolss.databinding.DialogPermissonOpenBinding
object DialogViews {
......@@ -57,4 +58,22 @@ object DialogViews {
dialog.show()
}
fun showLastStep(context: Context, onClick: () -> Unit) {
val dialog = Dialog(context)
val binding = DialogLayoutLastStepBinding.inflate(LayoutInflater.from(context))
dialog.requestWindowFeature(1)
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.window!!.setLayout(-1, -2)
dialog.setCanceledOnTouchOutside(false)
dialog.setCancelable(false)
dialog.setContentView(binding.root)
binding.idTvOk.setOnClickListener {
onClick.invoke()
dialog.dismiss()
}
dialog.show()
}
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ class RateStarPop(private val activity: Activity) : PopupWindow() {
if (SPUtils.getInstance().getBoolean("isRated", false)) {
return
}
if (n > 0 && n % 5 == 0) {
if (n > 0 && n % 8 == 0) {
RateStarPop(activity).show()
} else {
return
......
......@@ -36,6 +36,7 @@ import com.zxhyis.toolss.ui.page.PrepareScanActivity
import com.zxhyis.toolss.ui.page.RepeaterdPhotoActivity
import com.zxhyis.toolss.ui.page.SpeakerCleanerActivity
import com.zxhyis.toolss.ui.page.VirusActivity
import com.zxhyis.toolss.ui.page.applock.AppLockManagerActivity
import com.zxhyis.toolss.ui.page.appmanager.AppManager2Activity
import com.zxhyis.toolss.ui.page.bigfileclean.BigFileCleanActivity
import com.zxhyis.toolss.ui.page.notifaction.NotificationCleanActivity
......@@ -130,6 +131,9 @@ class NewHomeFragment : TopFragment<FragmentHome2Binding>() {
mK.idLargeFile.setOnClick(javaClass.simpleName) {
startActivity(Intent(requireActivity(), BigFileCleanActivity::class.java))
}
mK.idAppLock.setOnClick(javaClass.simpleName){
startActivity(Intent(requireActivity(), AppLockManagerActivity::class.java))
}
mK.idImgSl.setOnClick(javaClass.simpleName) {
mK.idScrollView.fullScroll(ScrollView.FOCUS_DOWN)
}
......
package com.zxhyis.toolss.ui.home
import android.Manifest
import android.annotation.SuppressLint
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.provider.Settings
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopFragment
import com.zxhyis.toolss.databinding.FragmentToolBinding
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.ImageAndVideoBean
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.ui.adapter.HomeAdapter
import com.zxhyis.toolss.ui.page.AllFilesActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class ToolFragment : TopFragment<FragmentToolBinding>() {
private lateinit var homeAdapter: HomeAdapter
private val dataList = ArrayList<ImageAndVideoBean>()
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
override fun createBinding(
inflater: LayoutInflater,
container: ViewGroup?
): FragmentToolBinding {
return FragmentToolBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init()
}
private fun init() {
val activityManager =
requireActivity().getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
val totalMemory = memoryInfo.totalMem
val availableMemory = memoryInfo.availMem
val usedMemory = totalMemory - availableMemory
val usedPercentage = usedMemory.toFloat() / totalMemory * 100
mK.pb.progress = usedPercentage.toInt()
mK.tvProgress.text = "${usedPercentage.toInt()}"
mK.tvFreeSize.text = Formatter.formatFileSize(requireActivity(), availableMemory)
mK.tvUsedSize.text = Formatter.formatFileSize(requireActivity(), usedMemory)
mK.clsPicture.setOnClick(javaClass.simpleName) {
mK.clsPicture.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.images)
//requireActivity().startActivity<PictureActivity>()
}
mK.clsVideo.setOnClick(javaClass.simpleName) {
mK.clsVideo.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.videos)
}
mK.clsAudio.setOnClick(javaClass.simpleName) {
mK.clsAudio.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.audio)
}
mK.clsApk.setOnClick(javaClass.simpleName) {
mK.clsApk.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.apks)
}
mK.clsEmpty.setOnClick(javaClass.simpleName) {
mK.clsEmpty.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.empty)
}
mK.clsLarge.setOnClick(javaClass.simpleName) {
mK.clsLarge.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.large)
}
mK.clsZip.setOnClick(javaClass.simpleName) {
mK.clsZip.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.zip)
}
mK.clsDoc.setOnClick(javaClass.simpleName) {
mK.clsDoc.setBackgroundResource(R.drawable.bg_shape_home_item_click)
AllFilesActivity.launch(requireActivity(), AllFilesActivity.doc)
// requireActivity().startActivity<DocumentsActivity>()
}
mK.btPer.setOnClick(javaClass.simpleName) {
mK.btPer.setBackgroundResource(R.drawable.bg_shape_set_click)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
result.launch(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION))
} else {
ActivityCompat.requestPermissions(
requireActivity(),
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
mK.tvMore.setOnClick(javaClass.simpleName) {
// requireActivity().startActivity<RecentlyActivity>()
AllFilesActivity.launch(requireActivity(),AllFilesActivity.images)
}
// MaxAdUtils.showMaxNativeAd(requireActivity(), mK.flAd, showBefore = { mK.flAd.isVisible = true })
// AdmobUtils.showNativeAd(requireActivity(),mK.flAd)
}
override fun onResume() {
super.onResume()
requireActivity().window.statusBarColor =
ContextCompat.getColor(requireActivity(), R.color.home_top)
setStatusBarTextDark(requireActivity())
dataList.clear()
updateUI()
setBa()
}
private fun updateUI() {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// if (Environment.isExternalStorageManager()) {
//
// } else {
// mK.rvRecent.visibility = View.GONE
// mK.btPer.visibility = View.VISIBLE
// }
// } else {
// if (ContextCompat.checkSelfPermission(
// requireActivity(),
// Manifest.permission.WRITE_EXTERNAL_STORAGE
// ) != PackageManager.PERMISSION_GRANTED
// ) {
// mK.rvRecent.visibility = View.GONE
// mK.btPer.visibility = View.VISIBLE
// } else {
// mK.rvRecent.visibility = View.VISIBLE
// initRv()
// mK.btPer.visibility = View.GONE
// }
// }
// (requireActivity() as MainActivity).checkPermission()
// MaxAdUtils.showMaxNativeAd(requireActivity(), mK.flAd, showBefore = { mK.flAd.isVisible = true })
AdmobUtils.showNativeAd(requireActivity(),mK.flAd)
}
@SuppressLint("Recycle")
private fun initRv() {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
val contentResolver = requireActivity().contentResolver
val imagesUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val videosUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val projection =
arrayOf(MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED)
val sortOrder = "${MediaStore.MediaColumns.DATE_ADDED} DESC"
val cursorImages = contentResolver.query(imagesUri, projection, null, null, sortOrder)
val cursorVideos = contentResolver.query(videosUri, projection, null, null, sortOrder)
cursorImages?.use { cursor ->
val columnIndexData = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
while (cursor.moveToNext()) {
val imagePath = cursor.getString(columnIndexData)
val file = File(imagePath)
dataList.add(
ImageAndVideoBean(
imagePath,
file,
1,
null,
0L,
""
)
)
}
}
cursorVideos?.use { cursor ->
val columnIndexData = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
while (cursor.moveToNext()) {
val videoPath = cursor.getString(columnIndexData)
val file = File(videoPath)
dataList.add(
ImageAndVideoBean(
videoPath,
file,
2,
null,
0L,
""
)
)
}
}
cursorImages?.close()
cursorVideos?.close()
homeAdapter = HomeAdapter(dataList)
launch(Dispatchers.Main) {
if (dataList.size > 0) {
val linearLayoutManager = LinearLayoutManager(
requireActivity(),
LinearLayoutManager.HORIZONTAL,
false
)
linearLayoutManager.initialPrefetchItemCount = 3
mK.rvRecent.apply {
layoutManager = linearLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = homeAdapter
}
mK.btPer.visibility = View.GONE
mK.rvRecent.visibility = View.VISIBLE
mK.noFile.visibility = View.GONE
} else {
mK.btPer.visibility = View.GONE
mK.rvRecent.visibility = View.GONE
mK.noFile.visibility = View.VISIBLE
}
}
}
}
private fun setBa() {
mK.clsPicture.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsVideo.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsAudio.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsApk.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsZip.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsEmpty.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsLarge.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.clsDoc.setBackgroundResource(R.drawable.bg_shape_home_item)
mK.btPer.setBackgroundResource(R.drawable.bg_shape_set)
}
fun getRenctImg(){
mK.rvRecent.visibility = View.VISIBLE
mK.btPer.visibility = View.GONE
initRv()
}
fun noPersion(){
mK.rvRecent.visibility = View.GONE
mK.btPer.visibility = View.VISIBLE
}
}
......@@ -25,6 +25,7 @@ import com.zxhyis.toolss.ui.page.notifaction.NotificationCleanActivity
import com.zxhyis.toolss.ui.page.notifaction.NotificationGuestActivity
import com.zxhyis.toolss.ui.page.photocompress.photo.StartCompressionPhotoActivity
import com.zxhyis.toolss.ui.page.recentusage.RecentAppActivity
import com.zxhyis.toolss.ui.page.speed.BatteryOptimizerActivity
/**
*
......@@ -100,9 +101,14 @@ class Tools2Fragment : Fragment() {
AFunOb.SPEAK_CLEANER -> {
startActivity(Intent(requireActivity(), SpeakerCleanerActivity::class.java))
}
AFunOb.PHOTO_COMPRESS->{
AFunOb.PHOTO_COMPRESS -> {
startActivity(Intent(requireActivity(), StartCompressionPhotoActivity::class.java))
}
AFunOb.APPP_LOCK -> {
startActivity(Intent(requireActivity(), BatteryOptimizerActivity::class.java))
}
}
}
binding.rvTools.adapter = adapter
......
......@@ -41,6 +41,8 @@ class ToolsAdapter(
ToolUI(SIMILAR_PHOTOS, context.getString(R.string.similar_photos), R.mipmap.similar),
ToolUI(SPEAK_CLEANER, context.getString(R.string.speaker_cleaner), R.mipmap.speaker21422),
ToolUI(PHOTO_COMPRESS, context.getString(R.string.photo_compress), R.mipmap.photo97612),
// ToolUI(APPP_LOCK, context.getString(R.string.app_lock), R.mipmap.applock),
)
),
ToolsUI(isAd = true)
......
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.text.SpannableString
import android.text.Spanned
import android.text.style.UnderlineSpan
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isVisible
import com.blankj.utilcode.util.AppUtils
......@@ -18,6 +22,7 @@ import com.zxhyis.toolss.ad.ConfigHelper
import com.zxhyis.toolss.ad.bean.PushCfg
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.common.notification.AppService
import com.zxhyis.toolss.common.notification.NotificationBroadcast
import com.zxhyis.toolss.databinding.ActivityLayoutSplashBinding
import com.zxhyis.toolss.logic.LogEx
import com.zxhyis.toolss.logic.setOnClick
......@@ -30,6 +35,8 @@ import com.zxhyis.toolss.ui.page.notifaction.NotificationGuestActivity
import com.zxhyis.toolss.ui.page.photocompress.photo.CompressioningActivity
import com.zxhyis.toolss.ui.page.photocompress.photo.StartCompressionPhotoActivity
import com.zxhyis.toolss.ui.page.recentusage.RecentAppActivity
import com.zxhyis.toolss.ui.page.speed.BatteryOptimizerActivity
import com.zxhyis.toolss.ui.page.speed.SpeedActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
......@@ -37,6 +44,7 @@ import kotlinx.coroutines.launch
import kotlin.concurrent.timer
import kotlin.random.Random
@SuppressLint("CustomSplashScreen")
class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
private val TAG = "SplashActivity"
private var isgouxuan = true
......@@ -68,6 +76,11 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
}
override fun init() {
val type = intent.getIntExtra("type", -1)
if (type != -1) {
NotificationBroadcast.cancelNotification(this)
}
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
if (Build.VERSION.SDK_INT >= 33) {
......@@ -87,7 +100,7 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
}
vb.idTvStart.setOnClick(javaClass.simpleName) {
if (isgouxuan) {
if (true) {
vb.idTvStart.isVisible = false
vb.idLlJindu.isVisible = true
vb.idLlYinsi.isVisible = false
......@@ -115,6 +128,11 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
)
startActivity(intent)
}
val spannableString = SpannableString("Privacy Policy")
spannableString.setSpan(UnderlineSpan(), 0, spannableString.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
vb.idTvPrivacyPolic.text = spannableString
vb.idTvPrivacyPolic.setOnClick(javaClass.simpleName) {
val intent = Intent(
Intent.ACTION_VIEW,
......@@ -227,6 +245,9 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
startActivity<SpeakerCleanerActivity>()
}
PushCfg.ID_BATTERY_OPTIMIZATION -> {
startActivity<BatteryOptimizerActivity>()
}
//================================被动广播=========================================
......@@ -246,8 +267,8 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
startActivity<BatteryInfoActivity>()
}
PushCfg.ID_LOW_RAM_PUSH -> {
startActivity<RecentAppActivity>()
PushCfg.ID_PHONE_ACCELERATE -> {
startActivity<SpeedActivity>()
}
else -> {
......@@ -258,6 +279,7 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
}
}
}
finish()
}
}
......@@ -133,7 +133,7 @@ class AppListFragment(
fun refreshFragmentData(dataList: List<AppBean>, isRefresh: Boolean = false) {
isRefreshData = true
if (isRefresh) {
if (isRefresh && isVisible) {
LogEx.logDebug(TAG, "isRefresh=$isRefresh")
binding.flPermission.visibility = View.GONE
binding.progressbar.visibility = View.GONE
......
......@@ -42,7 +42,9 @@ class BottomSheetManager : BottomSheetBehavior.BottomSheetCallback, OnClickListe
val mList = ImagesMediaUtils.getAlbums(mContext)
val mAdapter = AlbumListAdapter(mList, this)
mRecycleView.adapter = mAdapter
onItemClick(0,mList[0])
if (mList.isNotEmpty()) {
onItemClick(0, mList[0])
}
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
......
......@@ -31,9 +31,12 @@ public class PhotoCache {
}
public void clearCache() {
if(!mPhotoList.isEmpty()){
mPhotoList.clear();
}
}
public List<PhotoBean> getPhotoList() {
return mPhotoList;
}
......
......@@ -5,6 +5,7 @@ import android.graphics.Color
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ToastUtils
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityStartCompressionPhotoBinding
......@@ -34,7 +35,7 @@ class StartCompressionPhotoActivity : TopActivity<ActivityStartCompressionPhotoB
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
vb.root.updatePadding(top = BarUtils.getStatusBarHeight())
vb.fanhui.setOnClick(javaClass.simpleName){
vb.fanhui.setOnClick(javaClass.simpleName) {
onBackPressedDispatcher.onBackPressed()
}
......@@ -43,15 +44,19 @@ class StartCompressionPhotoActivity : TopActivity<ActivityStartCompressionPhotoB
finishToMain()
}
})
vb.btnStarted.setOnClick(javaClass.simpleName){
AdmobUtils.showInterstitialAd(this){
vb.btnStarted.setOnClick(javaClass.simpleName) {
AdmobUtils.showInterstitialAd(this) {
val mList = ImagesMediaUtils.getAlbums(this)
if (mList.isNotEmpty()) {
startActivity(Intent(this, CompressionPhotoListActivity::class.java))
finish()
} else {
ToastUtils.showShort("Album photos not detected, no compression required.")
}
}
}
}
}
......@@ -13,6 +13,7 @@ import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.cx.FileHelps.toFormatSize
import com.zxhyis.toolss.databinding.ActivityResultBinding
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.ui.AFunOb
import com.zxhyis.toolss.ui.AFunOb.APP_MANAGER
import com.zxhyis.toolss.ui.AFunOb.Antivirus
import com.zxhyis.toolss.ui.AFunOb.BATTERY_INFO
......@@ -24,6 +25,7 @@ import com.zxhyis.toolss.ui.AFunOb.NOTIFICATION_CLEANER
import com.zxhyis.toolss.ui.AFunOb.PHOTO_COMPRESS
import com.zxhyis.toolss.ui.AFunOb.RECENT_APP_USAGE
import com.zxhyis.toolss.ui.AFunOb.SIMILAR_PHOTOS
import com.zxhyis.toolss.ui.AFunOb.BATTERY_OPTIMIZER
import com.zxhyis.toolss.ui.page.BatteryInfoActivity
import com.zxhyis.toolss.ui.page.EmptyFileActivity
import com.zxhyis.toolss.ui.page.NetWorkActivity
......@@ -178,6 +180,12 @@ class ResultActivity : TopActivity<ActivityResultBinding>() {
).toFormatSize(1)
} space freed"
}
BATTERY_OPTIMIZER->{
vb.tvInfo.text = "Optimization completed"
}
AFunOb.APPP_SPEED -> {
vb.tvInfo.text = "Optimization completed"
}
else -> {}
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</RelativeLayout>
\ No newline at end of file
......@@ -68,21 +68,6 @@
android:textSize="15sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.noober.background.view.BLTextView
android:id="@+id/id_tv_start"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginHorizontal="40dp"
android:layout_marginBottom="49dp"
android:gravity="center"
android:text="START"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="visible"
app:bl_corners_radius="24dp"
app:bl_solid_color="#4772FF" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/id_ll_yinsi"
android:layout_width="match_parent"
......@@ -95,16 +80,17 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="2dp"
android:src="@mipmap/gouxuan" />
android:src="@mipmap/gouxuan"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp"
android:text="Agree to "
android:text="By continuing you are agreeing to the"
android:textColor="#000000"
android:textSize="12sp" />
android:textSize="14sp" />
<TextView
android:id="@+id/id_use_terms"
......@@ -112,19 +98,38 @@
android:layout_height="wrap_content"
android:text="Terms of use "
android:textColor="#4773FF"
android:textSize="12sp" />
android:textSize="14sp"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" &amp; " />
android:text=" &amp; "
android:visibility="gone" />
<TextView
android:id="@+id/id_tv_privacy_polic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Privacy Polic"
android:text="Privacy Policy"
android:textColor="#4773FF"
android:textSize="12sp" />
android:textSize="14sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.noober.background.view.BLTextView
android:id="@+id/id_tv_start"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginHorizontal="40dp"
android:layout_marginBottom="49dp"
android:gravity="center"
android:text="START"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="visible"
app:bl_corners_radius="5dp"
app:bl_solid_color="#4772FF" />
</androidx.appcompat.widget.LinearLayoutCompat>
\ No newline at end of file
......@@ -691,6 +691,39 @@
android:src="@mipmap/jiantou" />
</com.noober.background.view.BLLinearLayout>
<com.noober.background.view.BLLinearLayout
android:id="@+id/id_app_lock"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="14dp"
android:layout_marginBottom="8dp"
android:gravity="center_vertical"
android:paddingHorizontal="12dp"
android:visibility="gone"
android:paddingVertical="16dp"
app:bl_corners_radius="10dp"
app:bl_solid_color="#F6F7FB">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/xiangsi" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:text="App Lock"
android:textColor="#000000"
android:textSize="13sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/jiantou" />
</com.noober.background.view.BLLinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
......
......@@ -263,6 +263,7 @@
<string name="similar_photos">Similar Photos</string>
<string name="speaker_cleaner">Speaker Cleaner</string>
<string name="photo_compress">Photo Compress</string>
<string name="app_lock">App Lock</string>
<string name="tools">Tools</string>
<string name="google_play">Google Play</string>
<string name="delete">DELETE</string>
......
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
<base-config cleartextTrafficPermitted="false" />
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1
</domain>
......
......@@ -27,5 +27,5 @@ dependencyResolutionManagement {
}
}
rootProject.name = "File Manager Select"
rootProject.name = "Clean Master"
include ':app'
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