Commit e8e27197 authored by wanglei's avatar wanglei

去除无用activity

parent d78325f3
......@@ -27,29 +27,14 @@
android:name="android.permission.DELETE_PACKAGES"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<!-- <uses-permission-->
<!-- android:name="android.permission.READ_MEDIA_IMAGES"-->
<!-- tools:ignore="SelectedPhotoAccess" /> &lt;!&ndash; 广播监听相关的权限 &ndash;&gt;-->
<!-- <uses-permission-->
<!-- android:name="android.permission.DEVICE_POWER"-->
<!-- tools:ignore="ProtectedPermissions" />-->
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<!-- <uses-permission-->
<!-- android:name="android.permission.WRITE_SETTINGS"-->
<!-- tools:ignore="ProtectedPermissions" />-->
<!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />-->
<!-- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />-->
<!-- <uses-permission-->
<!-- android:name="android.permission.BATTERY_STATS"-->
<!-- tools:ignore="ProtectedPermissions" />-->
<!-- <uses-permission android:name="android.permission.BLUETOOTH" />-->
<uses-permission
android:name="android.permission.BROADCAST_PACKAGE_REMOVED"
tools:ignore="ProtectedPermissions" /> <!-- 通知 -->
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> <!-- 允许追踪使用情况,应用大小和最后使用情况 -->
tools:ignore="QueryAllPackagesPermission" />
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
......@@ -57,7 +42,6 @@
android:name="android.permission.READ_NETWORK_USAGE_HISTORY"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<!-- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />-->
<application
android:name=".FileApp"
......@@ -74,13 +58,15 @@
android:supportsRtl="true"
android:theme="@style/Theme.FileManagerSelect"
tools:ignore="SelectedPhotoAccess"
tools:replace="android:allowBackup">
tools:replace="android:allowBackup"
tools:targetApi="s">
<activity
android:name=".ui.page.SplashActivity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait">
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
......@@ -92,25 +78,29 @@
android:name=".ui.page.bigfileclean.BigFileCleanActivity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.recentusage.RecentAppActivity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.permission.PermissionManagerActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.appmanager.AppManager2Activity"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<!-- <receiver -->
......@@ -127,105 +117,55 @@
android:name=".ui.start.TransparentActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.start.StartPageActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.AppManagerActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.clean"
tools:ignore="LockedOrientationActivity" /> <!-- <meta-data -->
<!-- android:name="applovin.sdk.key" -->
<!-- android:value="GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW" /> -->
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.home.MainActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.RecentlyActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.StorageInfoActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.GarbageActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.BatteryInfoActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.recyclebin.RecycleBinActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.EmptyFileActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.DocumentsActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.ZipFileActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.result.ResultActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.result"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.PictureDetailActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.ApkListActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.AudioActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.VideoActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
<activity
android:name=".ui.page.PictureActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/Theme.top"
tools:ignore="LockedOrientationActivity" />
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<!-- <activity -->
<!-- android:name=".ui.start.StartActivity" -->
<!-- android:exported="true" -->
......@@ -233,91 +173,105 @@
<!-- android:theme="@style/Theme.clean" -->
<!-- tools:ignore="LockedOrientationActivity"> -->
<!-- </activity> -->
<activity
android:name=".ui.page.GuestActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.CleanGuestActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.AllFilesActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.VirusActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.page.VirusAppActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.PrepareScanActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.JunksActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.CleaningActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.NetWorkActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.notifaction.NotificationCleanActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.notifaction.NotificationGuestActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.notifaction.NotifSettingActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.RepeaterdPhotoActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.SimilarPhotosActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.SpeakerCleanerActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.SpeakCleaningActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.photocompress.photo.StartCompressionPhotoActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.photocompress.photo.CompressionSuccessActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.photocompress.photo.CompressioningActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.photocompress.photo.CompressionPhotoListActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.photocompress.photo.PreviewCompressionPhotoActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.applock.AppLockActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.applock.AppLockManagerActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.speed.SpeedActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.speed.SpeedFinishActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.page.speed.BatteryOptimizerActivity"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<service android:name=".ui.page.applock.ProtectorService" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" /> <!-- 广告验证器 -->
android:value="@string/facebook_app_id" />
<meta-data
android:name="com.google.android.gms.ads.flag.NATIVE_AD_DEBUGGER_ENABLED"
android:value="false" />
......@@ -340,7 +294,8 @@
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:grantUriPermissions="true">
android:grantUriPermissions="true"
tools:ignore="ExportedContentProvider">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
......@@ -350,10 +305,12 @@
android:name=".common.notification.AppService"
android:enabled="true"
android:exported="true"
android:foregroundServiceType="phoneCall|mediaPlayback|dataSync|mediaProjection|connectedDevice|location" />
android:foregroundServiceType="phoneCall|mediaPlayback|dataSync|mediaProjection|connectedDevice|location"
tools:ignore="ExportedService" />
<service
android:name=".ui.start.FlashlightService"
android:exported="true" />
android:exported="true"
tools:ignore="ExportedService" />
<service
android:name=".ui.page.notifaction.AppNotificationListenerService"
android:exported="true"
......
......@@ -10,7 +10,6 @@ import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.SPUtils
import com.trustlook.sdk.data.AppInfo
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ui.page.AllFilesActivity
import com.zxhyis.toolss.ui.page.SpeakCleaningActivity
import com.zxhyis.toolss.ui.page.SplashActivity
......@@ -71,7 +70,6 @@ object ConfigHelper {
"adActivity",
SplashActivity::class.java.simpleName,
SpeakCleaningActivity::class.java.simpleName,
AllFilesActivity::class.java.simpleName
// 返回前台时不跳转启动页的 activity
)
......
......@@ -16,7 +16,6 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ui.home.MainActivity
import com.zxhyis.toolss.ui.page.AppManagerActivity
import com.zxhyis.toolss.ui.page.BatteryInfoActivity
import com.zxhyis.toolss.ui.page.PrepareScanActivity
import com.zxhyis.toolss.ui.page.VirusActivity
......
package com.zxhyis.toolss.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.text.format.Formatter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhyis.toolss.R
import com.zxhyis.toolss.logic.AudioBean
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
@SuppressLint("NotifyDataSetChanged")
class AudioAdapter(
private val dataList: ArrayList<AudioBean>,
private val context: Context,
private val logic: Logic
) : RecyclerView.Adapter<AudioAdapter.ApkViewHolder>() {
inner class ApkViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val apkIcon: AppCompatImageView = itemView.findViewById(R.id.apk_icon)
val apkName: AppCompatTextView = itemView.findViewById(R.id.apk_name)
val apkTime: AppCompatTextView = itemView.findViewById(R.id.apk_time)
val apkSize: AppCompatTextView = itemView.findViewById(R.id.apk_size)
val apkSelect: AppCompatImageView = itemView.findViewById(R.id.apk_select)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApkViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_apk, parent, false)
return ApkViewHolder(view)
}
override fun getItemCount(): Int = dataList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ApkViewHolder, position: Int) {
val type = dataList[position]
holder.apkIcon.setImageResource(R.drawable.home_audio)
holder.apkName.text = type.audioName
holder.apkSize.text = " --- ${Formatter.formatFileSize(context, type.apkSize)}"
holder.apkTime.text = type.apkTime
holder.apkSelect.isSelected = type.isSelected
if (type.isShow) {
holder.apkSelect.visibility = View.VISIBLE
} else {
holder.apkSelect.visibility = View.GONE
}
holder.apkSelect.setOnClick(javaClass.simpleName) {
dataList[position].isSelected = !dataList[position].isSelected
logic.doLogic()
notifyItemChanged(position)
}
}
//select all
fun selectAll() {
dataList.forEach {
it.isSelected = true
}
notifyDataSetChanged()
}
fun deselectAll() {
dataList.forEach {
it.isSelected = false
}
notifyDataSetChanged()
}
fun setShow() {
dataList.forEach {
it.isShow = true
}
notifyDataSetChanged()
}
}
\ No newline at end of file
//package com.zxhyis.toolss.ui.home
//
//
//import android.annotation.SuppressLint
//import android.content.Intent
//import android.os.Bundle
//import android.os.Environment
//import android.os.StatFs
//import android.view.LayoutInflater
//import android.view.View
//import android.view.ViewGroup
//import androidx.core.content.ContextCompat
//import com.bumptech.glide.Glide
//import com.zxhyis.toolss.R
//import com.zxhyis.toolss.ad.AdmobUtils
//import com.zxhyis.toolss.base.TopFragment
//import com.zxhyis.toolss.cx.FileHelps.toFormatSize
//import com.zxhyis.toolss.databinding.FragmentHomeBinding
//import com.zxhyis.toolss.logic.setOnClick
//import com.zxhyis.toolss.logic.setStatusBarTextLight
//import com.zxhyis.toolss.logic.startActivity
//import com.zxhyis.toolss.ui.page.AllFilesActivity
//import com.zxhyis.toolss.ui.page.AppManagerActivity
//import com.zxhyis.toolss.ui.page.BatteryInfoActivity
//import com.zxhyis.toolss.ui.page.JunksActivity
//import com.zxhyis.toolss.ui.page.StorageInfoActivity
//import com.zxhyis.toolss.ui.page.VirusActivity
//
//
//@SuppressLint("SetTextI18n")
//class HomeFragment : TopFragment<FragmentHomeBinding>() {
//
// override fun createBinding(
// inflater: LayoutInflater,
// container: ViewGroup?
// ): FragmentHomeBinding {
// return FragmentHomeBinding.inflate(inflater, container, false)
// }
//
// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// super.onViewCreated(view, savedInstanceState)
// init()
// }
//
// private fun init() {
//
// Glide.with(this)
// .asGif()
// .load(R.drawable.start)
// .into(mK.ivStart)
//
// Glide.with(this)
// .asGif()
// .load(R.drawable.end)
// .into(mK.ivEnd)
//
//
// mK.ivBg.setOnClick(javaClass.simpleName) {
// requireActivity().startActivity<StorageInfoActivity>()
//// AdmobUtils.showInterstitialAd(requireActivity()){
////
//// }
//
// }
//
// mK.tvCleanSpace.setOnClick(javaClass.simpleName) {
// mK.tvCleanSpace.setBackgroundResource(R.drawable.bg_shape_set_click)
// requireActivity().startActivity<JunkCleanActivity>()
// startActivity(Intent(requireActivity(), JunksActivity::class.java))
//// AdmobUtils.showInterstitialAd(requireActivity()){
////
//// }
//
// }
// mK.clBattery.setOnClick(javaClass.simpleName) {
// mK.clBattery.setBackgroundResource(R.drawable.bg_shape_home_item1_click)
// requireActivity().startActivity<BatteryInfoActivity>()
//// AdmobUtils.showInterstitialAd(requireActivity()){
////
//// }
//
// }
//
// mK.clBin.setOnClick(javaClass.simpleName) {
// mK.clBin.setBackgroundResource(R.drawable.bg_shape_home_item1_click)
// requireActivity().startActivity<AppManagerActivity>()
// }
//
// mK.clLargeFile.setOnClick(javaClass.simpleName) {
//
// mK.clLargeFile.setBackgroundResource(R.drawable.bg_shape_home_item1_click)
// AllFilesActivity.launch(requireActivity(), AllFilesActivity.large)
//// AdmobUtils.showInterstitialAd(requireActivity()){
////
//// }
//
// }
// mK.virusSacn.setOnClick(javaClass.simpleName) {
// startActivity(Intent(requireActivity(), VirusActivity::class.java))
//// AdmobUtils.showInterstitialAd(requireActivity()){
////
//// }
//
// }
// AdmobUtils.showNativeAd(requireActivity(), mK.flAd)
// }
//
// override fun onResume() {
// super.onResume()
// requireActivity().window.statusBarColor =
// ContextCompat.getColor(requireActivity(), R.color.tool_top)
// setStatusBarTextLight(requireActivity())
// initStorage()
// updateUi()
// }
//
// private fun updateUi() {
// mK.tvCleanSpace.setBackgroundResource(R.drawable.bg_shape_set)
// mK.clBattery.setBackgroundResource(R.drawable.bg_shape_home_item1)
// mK.clBin.setBackgroundResource(R.drawable.bg_shape_home_item1)
// mK.clLargeFile.setBackgroundResource(R.drawable.bg_shape_home_item1)
// }
//
// private fun initStorage() {
// val stat = StatFs(Environment.getExternalStorageDirectory().path)
// val totalSize = f()
// val availableSize = b()
// val usedSize = totalSize - availableSize
// val usedPercentage = usedSize.toFloat() / totalSize * 100
// mK.pbTool.progress = usedPercentage.toInt()
// mK.tvPercent.text = "${usedPercentage.toInt()}"
// mK.tvStorage.text = "${usedSize.toFormatSize()}/ ${totalSize.toFormatSize()}"
// }
//
//
// fun b(): Long {
// try {
// val statFs = StatFs(Environment.getExternalStorageDirectory().path)
// val statFs2 = StatFs(Environment.getRootDirectory().path)
// val blackSize =
// statFs2.blockSizeLong * statFs2.availableBlocksLong + statFs.blockSizeLong * statFs.availableBlocksLong
// return a(blackSize)
// } catch (e10: Exception) {
// return 0L
// }
// }
//
// var totalsize = 0L
// fun f(): Long {
// return if (totalsize > 0) {
// totalsize
// } else try {
// val statFs = StatFs(Environment.getExternalStorageDirectory().path)
// val statFs2 = StatFs(Environment.getRootDirectory().path)
// val blockSizeLong =
// statFs2.blockSizeLong * statFs2.blockCountLong + statFs.blockSizeLong * statFs.blockCountLong
// totalsize = blockSizeLong
// blockSizeLong
// } catch (e10: java.lang.Exception) {
// 0L
// }
// }
//
// fun a(j10: Long): Long {
// var j10 = j10
// var i7 = 0
// while (true) {
// val j11: Long = 1000
// if (j10 < j11) {
// break
// }
// j10 /= j11
// i7++
// }
// for (i10 in 0 until i7) {
// j10 *= 1024
// }
// return j10
// }
//
//}
package com.zxhyis.toolss.ui.page
import android.app.Activity
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.view.animation.LinearInterpolator
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.ToastUtils
import com.bumptech.glide.Glide
import com.zxhyis.toolss.FileApp
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.cx.FileBean
import com.zxhyis.toolss.cx.FileHelps
import com.zxhyis.toolss.cx.FileHelps.toFormatSize
import com.zxhyis.toolss.cx.FileHelps.toFormatTime
import com.zxhyis.toolss.databinding.ActivityAllFilesBinding
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.startActivity
class AllFilesActivity : TopActivity<ActivityAllFilesBinding>() {
var isEdit = false
private var isSelectAll = false
override fun getViewBinding1(): ActivityAllFilesBinding {
return ActivityAllFilesBinding.inflate(layoutInflater)
}
companion object {
const val images = 0
const val videos = 1
const val audio = 2
const val empty = 3
const val apks = 4
const val doc = 5
const val zip = 6
const val large = 7
fun launch(activity: Activity, type: Int) {
activity.startActivity(Intent(activity, AllFilesActivity::class.java).apply {
putExtra("type", type)
})
}
}
private val type by lazy {
intent.getIntExtra("type", 7)
}
private val mData = mutableListOf<FileBean>()
override fun init() {
// checkPermission()
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
vb.root.updatePadding(top = BarUtils.getStatusBarHeight())
vb.idDelete.isEnabled = false
vb.idTitle.text = when (type) {
large -> "Large Files"
empty -> "Empty File"
doc -> "Documents"
images -> "Picture"
videos -> "Video"
audio -> "Audio"
zip -> "ZIP"
apks -> "APK"
else -> ""
}
vb.idRlList.run {
layoutManager = if (type in listOf(images, videos)) {
GridLayoutManager(context, 3)
} else {
LinearLayoutManager(context)
}
adapter = mAdapter
}
initClick()
}
private fun initClick() {
vb.idBack.setOnClick(javaClass.simpleName) {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishToMain()
}
})
vb.tvMenu.setOnClick(javaClass.simpleName) {
isEdit = true
vb.tvMenu.isVisible = false
vb.idImgSelAll.isVisible = true
vb.tvAll.isVisible = true
vb.idClose.isVisible = true
vb.idBack.isVisible = false
vb.idDelete.isVisible = true
mData.forEach { it.isSelect = false }
mAdapter.notifyItemRangeChanged(0, mData.size, 1)
}
vb.idClose.setOnClick(javaClass.simpleName) {
isEdit = false
vb.tvMenu.isVisible = true
vb.idBack.isVisible = true
vb.idImgSelAll.isVisible = false
vb.tvAll.isVisible = false
vb.idClose.isVisible = false
vb.idDelete.isVisible = false
mData.forEach { it.isSelect = false }
mAdapter.notifyItemRangeChanged(0, mData.size, 1)
}
vb.idImgSelAll.setOnClick(javaClass.simpleName) {
if (mData.size > 0) {
if (isSelectAll) {
isSelectAll = false
vb.idImgSelAll.setImageResource(R.drawable.iamge_unselected_all)
} else {
isSelectAll = true
vb.idImgSelAll.setImageResource(R.drawable.image_selected_all)
}
mData.forEach { it.isSelect = isSelectAll }
mAdapter.notifyItemRangeChanged(0, mData.size, 1)
setTvStatus()
}
}
vb.idDelete.setOnClick(javaClass.simpleName) {
val ani = AnimationUtils.loadAnimation(this, R.anim.ad_ss)
ani.interpolator = LinearInterpolator()
vb.idImgLoad.startAnimation(ani)
vb.idLlAdLoading.isVisible = true
vb.idLlAdLoading.postDelayed({
AdmobUtils.showInterstitialAd(this) {
vb.idLlAdLoading.isVisible = false
val list = FileHelps.fileList.toList().filter { it.isSelect }
if (list.isNotEmpty() && list.all { FileUtils.delete(it.path) }) {
FileHelps.fileList.removeAll(list)
mData.removeAll(list)
mAdapter.notifyDataSetChanged()
setTvStatus()
ToastUtils.showShort("Delete Successful")
} else {
ToastUtils.showShort("Delete failed.")
}
}
// MaxAdUtils.showMaxInterstitialAd(this, "interstitial_slot") {
//
// }
}, 2000)
}
vb.tvSet.setOnClick(javaClass.simpleName) {
checkPermission(true)
}
}
private fun setTvStatus() {
val it = mData.filter { it.isSelect }
vb.idDelete.isEnabled = it.isNotEmpty()
}
override fun onStart() {
super.onStart()
//Log.e("MXL", "onStart: ")
checkPermission()
}
var isPause = false
override fun onPause() {
super.onPause()
isPause = false
// Log.e("MXL", "onPause: ")
}
override fun onResume() {
super.onResume()
// Log.e("MXL", "onResume: ")
}
override fun onStop() {
super.onStop()
// Log.e("MXL", "onStop: ")
isPause = true
}
override fun onPermissionsResult(isGranted: Boolean) {
if (isGranted) {
vb.idLlNoPermisson.isVisible = false
initList()
if (!ifshowAd) {
ifshowAd = true
vb.root.postDelayed({
AdmobUtils.showInterstitialAd(this)
}, kotlin.random.Random.nextLong(800, 1200))
}
} else {
vb.idProcebar.isVisible = false
vb.idLlNoPermisson.isVisible = true
}
}
var ifshowAd = false
private fun initList() {
FileHelps.getFileList({
FileHelps.fileList.toList().filter {
if (it == null) {
true
}
when (type) {
images -> it.isImage()
videos -> it.isVideo()
doc -> it.isDoc()
audio -> it.isAudio()
empty -> it.isEmptyDir()
apks -> it.isApk()
zip -> it.isZip()
large -> it.isLargeFile()
else -> true
} && it !in mData
}.onEach { it.isSelect = false }.let {
if (it.isNotEmpty()) {
vb.idProcebar.isVisible = false
mData.addAll(it)
mAdapter.notifyItemRangeInserted(mData.size, it.size)
}
}
}, {
// if (type !in listOf(images, videos)) {
//
// AdmobUtils.showInterstitialAd(this)
//
//
// }
if (mData.isEmpty()) {
vb.idProcebar.isVisible = false
vb.idTvNoFile.isVisible = true
}
})
}
private val mAdapter by lazy {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val ivImage: ImageView
val tvName: TextView?
val tvTime: TextView?
val tvSize: TextView?
val ivSelect: ImageView
val ivPlay: View?
init {
ivImage = view.findViewById(R.id.iv_image)
tvName = view.findViewById(R.id.id_file_name)
tvTime = view.findViewById(R.id.id_file_time)
tvSize = view.findViewById(R.id.id_file_size)
ivSelect = view.findViewById(R.id.id_img_sel)
ivPlay = view.findViewById(R.id.id_play)
}
}
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(this@AllFilesActivity).inflate(
if (type in listOf(images, videos)) {
R.layout.item_meiti
} else {
R.layout.item_files
}, parent, false
)
return ViewHolder(view)
}
override fun getItemCount() = mData.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = mData[position]
if (item.isImage() || item.isVideo()) {
Glide.with(FileApp.fContext).load(item.path).into(holder.ivImage)
} else {
holder.ivImage.setImageResource(
when {
item.isAudio() -> R.drawable.home_audio
item.isZip() -> R.drawable.home_zip
item.isApk() -> R.drawable.home_apk
item.isEmptyDir() -> R.drawable.home_empty_file
item.isLargeFile() -> R.drawable.home_largefiles
item.isDoc() -> R.drawable.home_documents
else -> R.drawable.home_audio
}
)
}
holder.tvName?.text = item.name
holder.tvTime?.text = item.time.toFormatTime()
holder.tvSize?.text = item.size.toFormatSize()
holder.ivPlay?.isVisible = item.isVideo()
holder.itemView.setOnClickListener {
if (isEdit) {
item.isSelect = !item.isSelect
notifyItemChanged(position, 1)
if (mData.all { it.isSelect }) {
isSelectAll = true
vb.idImgSelAll.setImageResource(R.drawable.image_selected_all)
} else {
isSelectAll = false
vb.idImgSelAll.setImageResource(R.drawable.iamge_unselected_all)
}
setTvStatus()
} else {
if (type == images) {
startActivity<PictureDetailActivity>("image_path" to item.path)
} else if (type == videos) {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.setDataAndType(Uri.parse(item.path), "video/*")
startActivity(intent)
}
// FileInfoActivity.launch(this@AllFilesActivity, type, item.path)
}
}
holder.ivPlay?.setOnClickListener {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.setDataAndType(Uri.parse(item.path), "video/*")
startActivity(intent)
}
}
override fun onBindViewHolder(
holder: ViewHolder,
position: Int,
payloads: MutableList<Any>
) {
super.onBindViewHolder(holder, position, payloads)
holder.ivSelect.isVisible = isEdit
val item = mData[position]
val isImage = type in listOf(images, videos)
holder.ivSelect.setImageResource(
if (item.isSelect) {
if (isImage) R.drawable.image_selected else R.drawable.image_selected_all
} else {
if (isImage) R.drawable.image_unselected else R.drawable.iamge_unselected_all
}
)
}
}
}
}
package com.zxhyis.toolss.ui.page
import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.graphics.Color
import android.net.Uri
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityAppManagerBinding
import com.zxhyis.toolss.logic.AppBean
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.ui.adapter.AppAdapter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class AppManagerActivity : TopActivity<ActivityAppManagerBinding>() {
private lateinit var appAdapter: AppAdapter
private val dataList = ArrayList<AppBean>()
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
updateBt()
}
override fun getViewBinding1(): ActivityAppManagerBinding {
return ActivityAppManagerBinding.inflate(layoutInflater)
}
override fun init() {
vb.inApp.tvTitle.text = getString(R.string.app_manager)
vb.lvScan.playAnimation()
vb.inApp.ivBack.setOnClick(javaClass.simpleName) {
onBackPressedDispatcher.onBackPressed()
}
vb.btUninstall.setOnClick(javaClass.simpleName) {
if (isCanUninstall()) {
uninstallApp()
} else {
"Please choose one at least".showToast()
}
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!vb.lvScan.isAnimating) {
finishToMain()
}
}
})
vb.lvScan.addAnimatorListener(object : AnimatorListener {
override fun onAnimationStart(animation: Animator) {
}
override fun onAnimationEnd(animation: Animator) {
AdmobUtils.showInterstitialAd(this@AppManagerActivity){
vb.clsApp.setBackgroundColor(Color.WHITE)
vb.lvScan.visibility = View.GONE
vb.appScan.visibility = View.GONE
vb.rvDelete.visibility = View.VISIBLE
vb.btUninstall.visibility = View.VISIBLE
}
// MaxAdUtils.showMaxInterstitialAd(this@AppManagerActivity,"interstitial_slot"){
//
// }
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
}
private fun initRv() {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
val pm = packageManager
val packages = pm.getInstalledPackages(0)
for (app in packages) {
if ((app.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) < 1 && app.applicationInfo.packageName != packageName) {
dataList.add(
AppBean(
app.applicationInfo.loadIcon(pm),
app.applicationInfo.loadLabel(pm).toString(),
app.applicationInfo.packageName,
false
)
)
}
}
appAdapter = AppAdapter(dataList, object : Logic {
override fun doLogic() {
updateBt()
}
})
launch(Dispatchers.Main) {
vb.rvDelete.apply {
layoutManager = LinearLayoutManager(this@AppManagerActivity)
adapter = appAdapter
}
}
}
}
private fun updateBt() {
if (isCanUninstall()) {
vb.btUninstall.setBackgroundResource(R.drawable.bg_shape_set)
} else {
vb.btUninstall.setBackgroundResource(R.drawable.bg_shape_delete_no)
}
}
private fun isCanUninstall(): Boolean {
for (app in dataList) {
if (app.isSelected) {
return true
}
}
return false
}
private fun uninstallApp() {
for (app in dataList) {
if (app.isSelected) {
val intent = Intent(Intent.ACTION_DELETE, Uri.parse("package:${app.pkg}"))
result.launch(intent)
}
}
}
override fun onResume() {
super.onResume()
dataList.clear()
initRv()
}
override fun onDestroy() {
super.onDestroy()
dataList.clear()
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.text.format.Formatter
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityAudioBinding
import com.zxhyis.toolss.logic.AudioBean
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.shareMultipleAudios
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.logic.testLog
import com.zxhyis.toolss.ui.adapter.AudioAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.attribute.BasicFileAttributes
import java.sql.Date
import java.text.SimpleDateFormat
class AudioActivity : TopActivity<ActivityAudioBinding>(), DialogDismissListener {
private val audioList = ArrayList<AudioBean>()
private val selectList = ArrayList<AudioBean>()
private val fileList = ArrayList<File>()
private lateinit var audioAdapter: AudioAdapter
private var allSize = 0L
private var dialog: LoadingDialog? = null
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var needRefresh = false
override fun getViewBinding1(): ActivityAudioBinding {
return ActivityAudioBinding.inflate(layoutInflater)
}
override fun init() {
vb.inAudio.tvTitle.text = getString(R.string.tv_audio)
setStatusBarTextDark(this)
allSize = 0
audioList.clear()
fileList.clear()
audioList.clear()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initDatasource(this@AudioActivity)
dialog = LoadingDialog()
dialog?.setDismissListener(this@AudioActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
totalSize.visibility = View.GONE
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
totalSize.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initDatasource(this@AudioActivity)
dialog = LoadingDialog()
dialog?.setDismissListener(this@AudioActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
}
}
vb.inAudio.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
vb.tvSet.setOnClick (javaClass.simpleName){
vb.tvSet.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(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inAudio.imageSelectAll.setOnClick(javaClass.simpleName) {
fileList.clear()
selectList.clear()
vb.inAudio.imageSelectAll.isSelected = !vb.inAudio.imageSelectAll.isSelected
if (vb.inAudio.imageSelectAll.isSelected) {
audioAdapter.selectAll()
for (audio in audioList) {
fileList.add(audio.file)
selectList.add(audio)
}
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
audioAdapter.deselectAll()
for (audio in audioList) {
fileList.remove(audio.file)
selectList.remove(audio)
}
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
testLog("${fileList.size}")
}
vb.inAudio.tvMenu.setOnClick(javaClass.simpleName) {
needRefresh = true
if (audioList.size > 0) {
vb.inAudio.ivBack.visibility = View.GONE
vb.inAudio.tvMenu.visibility = View.GONE
vb.inAudio.imageSelectAll.visibility = View.VISIBLE
vb.inAudio.tvAll.visibility = View.VISIBLE
vb.llBottom.visibility = View.VISIBLE
vb.inAudio.tvTitle.text = getString(R.string.select_audio)
audioAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.ivDelete.setOnClick(javaClass.simpleName) {
if (isCanDelete()) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
deleteFiles()
launch(Dispatchers.Main) {
updateUI()
}
}
} else {
"Please select at least one".showToast()
}
}
vb.ivShare.setOnClick(javaClass.simpleName) {
when {
selectList.size in 1..3 -> {
shareAudios()
}
selectList.size > 3 -> {
"Select up to three".showToast()
}
else -> {
"Select at least one".showToast()
}
}
}
vb.imageLoad.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(500)
startActivity<ResultActivity>("from" to "audio")
finish()
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun initDatasource(context: Context) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
val contentResolver: ContentResolver = context.contentResolver
val uri: Uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(MediaStore.Audio.AudioColumns.DATA)
val sortOrder = "${MediaStore.Audio.AudioColumns.TITLE} ASC"
val cursor: Cursor? = contentResolver.query(uri, projection, null, null, sortOrder)
if (cursor != null && cursor.moveToFirst()) {
val dataIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DATA)
do {
val audioPath = cursor.getString(dataIndex)
val file = File(audioPath)
allSize += file.length()
audioList.add(
AudioBean(
audioPath,
file.absoluteFile.name,
Uri.parse(audioPath),
file,
file.length(),
apkTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getFileCreationTime(
file.absolutePath
)
else "",
needRefresh
)
)
} while (cursor.moveToNext())
cursor.close()
audioAdapter = AudioAdapter(audioList, this@AudioActivity, object : Logic {
override fun doLogic() {
remove()
if (fileList.size > 0) {
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
})
}
launch(Dispatchers.Main) {
if (audioList.size > 0) {
val linearLayoutManager = LinearLayoutManager(this@AudioActivity)
linearLayoutManager.initialPrefetchItemCount = 10
vb.rvAudio.apply {
layoutManager = linearLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = audioAdapter
}
vb.apply {
rvAudio.visibility = View.VISIBLE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
totalSize.text = Formatter.formatFileSize(this@AudioActivity, allSize)
}
} else {
vb.apply {
rvAudio.visibility = View.GONE
icNoFile.visibility = View.VISIBLE
tvNoFile.visibility = View.VISIBLE
totalSize.visibility = View.GONE
}
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun updateUI() {
vb.imageLoad.visibility = View.VISIBLE
vb.tvLoad.visibility = View.VISIBLE
vb.imageLoad.playAnimation()
vb.rvAudio.visibility = View.GONE
vb.inAudio.clInclude.visibility = View.GONE
vb.llBottom.visibility = View.GONE
vb.totalSize.visibility = View.GONE
}
@RequiresApi(Build.VERSION_CODES.O)
fun getFileCreationTime(filePath: String): String? {
try {
val path = Paths.get(filePath)
val attr = Files.readAttributes(path, BasicFileAttributes::class.java)
val creationTime = attr.creationTime()
val date = Date(creationTime.toMillis())
val format = SimpleDateFormat("yyyy-MM-dd HH:mm")
return format.format(date)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
private fun isCanDelete(): Boolean {
testLog("de:${fileList.size}")
return fileList.size > 0
}
private fun remove() {
fileList.clear()
selectList.clear()
for (audio in audioList) {
if (audio.isSelected) {
fileList.add(audio.file)
selectList.add(audio)
} else {
fileList.remove(audio.file)
selectList.remove(audio)
}
}
}
private fun deleteFiles() {
for (file in fileList) {
file.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(file)
intent.data = uri
sendBroadcast(intent)
}
}
private fun shareAudios() {
// val uriList = ArrayList<Uri>()
// for (audio in selectList) {
// uriList.add(audio.audioUri)
// testLog("${Uri.parse(audio.audioPath)}")
// }
shareMultipleAudios(fileList, this)
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
audioList.clear()
fileList.clear()
selectList.clear()
if (dialog != null) {
dialog?.dismiss()
}
}
override fun onDialogDismissed() {
AdmobUtils.showInterstitialAd(this)
// MaxAdUtils.showMaxInterstitialAd(this, "interstitial_slot")
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.text.format.Formatter
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityDocumentsBinding
import com.zxhyis.toolss.logic.AudioBean
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.logic.testLog
import com.zxhyis.toolss.ui.adapter.ZipAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.attribute.BasicFileAttributes
import java.sql.Date
import java.text.SimpleDateFormat
class DocumentsActivity : TopActivity<ActivityDocumentsBinding>(), DialogDismissListener {
private val docList = ArrayList<AudioBean>()
private val fileList = ArrayList<File>()
private lateinit var docAdapter: ZipAdapter
private var allSize = 0L
private var dialog: LoadingDialog? = null
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var needRefresh = false
override fun getViewBinding1(): ActivityDocumentsBinding {
return ActivityDocumentsBinding.inflate(layoutInflater)
}
override fun init() {
setStatusBarTextDark(this)
allSize = 0
docList.clear()
fileList.clear()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvDoc.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initData()
dialog = LoadingDialog()
dialog?.setDismissListener(this@DocumentsActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvDoc.visibility = View.GONE
totalSize.visibility = View.GONE
}
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED || !Environment.isExternalStorageManager()
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvDoc.visibility = View.GONE
totalSize.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvDoc.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initData()
dialog = LoadingDialog()
dialog?.setDismissListener(this@DocumentsActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvDoc.visibility = View.GONE
totalSize.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvDoc.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initData()
dialog = LoadingDialog()
dialog?.setDismissListener(this@DocumentsActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
}
}
vb.tvSet.setOnClick(javaClass.simpleName) {
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set_click)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
result.launch(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION))
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
result.launch(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION))
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inDoc.imageSelectAll.setOnClick(javaClass.simpleName) {
fileList.clear()
vb.inDoc.imageSelectAll.isSelected = !vb.inDoc.imageSelectAll.isSelected
if (vb.inDoc.imageSelectAll.isSelected) {
docAdapter.selectAll()
for (audio in docList) {
fileList.add(audio.file)
}
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_set)
} else {
docAdapter.deselectAll()
for (audio in docList) {
fileList.remove(audio.file)
}
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_delete_no)
}
testLog("${fileList.size}")
}
vb.inDoc.tvMenu.setOnClick(javaClass.simpleName) {
needRefresh = true
if (docList.size > 0) {
vb.inDoc.ivBack.visibility = View.GONE
vb.inDoc.tvMenu.visibility = View.GONE
vb.inDoc.imageSelectAll.visibility = View.VISIBLE
vb.inDoc.tvAll.visibility = View.VISIBLE
vb.btDelete.visibility = View.VISIBLE
vb.inDoc.tvTitle.text = getString(R.string.select_zip_file)
docAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.btDelete.setOnClick(javaClass.simpleName) {
if (isCanDelete()) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
deleteFiles()
launch(Dispatchers.Main) {
updateUI()
}
}
} else {
"Please select at least one".showToast()
}
}
vb.imageLoad.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(500)
startActivity<ResultActivity>("from" to "doc")
finish()
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
vb.inDoc.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
}
@SuppressLint("Recycle")
private fun initData() {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
val contentResolver: ContentResolver = contentResolver
val uri: Uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(
MediaStore.Files.FileColumns._ID,
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.SIZE,
MediaStore.Files.FileColumns.DATA
)
val selection = (MediaStore.Files.FileColumns.MIME_TYPE + "=? OR " +
MediaStore.Files.FileColumns.MIME_TYPE + "=?")
val selectionArgs = arrayOf(
"text/plain",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
)
val sortOrder = "${MediaStore.Files.FileColumns.DATE_MODIFIED} DESC"
val cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
cursor?.use {
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
val nameColumn =
cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DISPLAY_NAME)
val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE)
val dataColumn = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)
while (cursor.moveToNext()) {
val id = cursor.getLong(idColumn)
val name = cursor.getString(nameColumn)
val size = cursor.getLong(sizeColumn)
val data = cursor.getString(dataColumn)
testLog("DocumentFiles,ID: $id,name:$name,size:$size,data:$data")
val file = File(name)
docList.add(
AudioBean(
file.absolutePath,
name,
Uri.parse(file.absolutePath),
file,
size,
apkTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getFileCreationTime(
file.absolutePath
)
else "",
needRefresh
)
)
allSize += size
}
}
docAdapter = ZipAdapter(docList, this@DocumentsActivity, 1, object : Logic {
override fun doLogic() {
remove()
if (fileList.size > 0) {
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_set)
} else {
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_delete_no)
}
}
})
launch(Dispatchers.Main) {
if (docList.size > 0) {
val linearLayoutManager = LinearLayoutManager(this@DocumentsActivity)
linearLayoutManager.initialPrefetchItemCount = 10
vb.rvDoc.apply {
layoutManager = linearLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = docAdapter
}
vb.apply {
rvDoc.visibility = View.VISIBLE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
totalSize.text = Formatter.formatFileSize(this@DocumentsActivity, allSize)
}
} else {
vb.apply {
rvDoc.visibility = View.GONE
icNoFile.visibility = View.VISIBLE
tvNoFile.visibility = View.VISIBLE
totalSize.visibility = View.GONE
}
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun updateUI() {
vb.imageLoad.visibility = View.VISIBLE
vb.tvLoad.visibility = View.VISIBLE
vb.imageLoad.playAnimation()
vb.rvDoc.visibility = View.GONE
vb.inDoc.clInclude.visibility = View.GONE
vb.btDelete.visibility = View.GONE
vb.totalSize.visibility = View.GONE
}
@SuppressLint("SimpleDateFormat")
@RequiresApi(Build.VERSION_CODES.O)
fun getFileCreationTime(filePath: String): String? {
try {
val path = Paths.get(filePath)
val attr = Files.readAttributes(path, BasicFileAttributes::class.java)
val creationTime = attr.creationTime()
val date = Date(creationTime.toMillis())
val format = SimpleDateFormat("yyyy-MM-dd HH:mm")
return format.format(date)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
private fun isCanDelete(): Boolean {
return fileList.size > 0
}
private fun remove() {
fileList.clear()
for (audio in docList) {
if (audio.isSelected) {
fileList.add(audio.file)
} else {
fileList.remove(audio.file)
}
}
}
private fun deleteFiles() {
for (file in fileList) {
file.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(file)
intent.data = uri
sendBroadcast(intent)
}
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
docList.clear()
fileList.clear()
if (dialog != null) {
dialog?.dismiss()
}
}
override fun onDialogDismissed() {
AdmobUtils.showInterstitialAd(this)
// MaxAdUtils.showMaxInterstitialAd(this, "interstitial_slot")
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityGarbageBinding
class GarbageActivity : TopActivity<ActivityGarbageBinding>() {
override fun getViewBinding1(): ActivityGarbageBinding {
return ActivityGarbageBinding.inflate(layoutInflater)
}
override fun init() {
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.graphics.Color
import com.blankj.utilcode.util.BarUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityLayoutGuestBinding
import com.zxhyis.toolss.logic.startActivity
import kotlin.random.Random
class GuestActivity : TopActivity<ActivityLayoutGuestBinding>() {
override fun getViewBinding1(): ActivityLayoutGuestBinding {
return ActivityLayoutGuestBinding.inflate(layoutInflater)
}
override fun init() {
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
vb.idLottie.imageAssetsFolder = "saomiao/images/"
vb.idLottie.setAnimation("saomiao/data.json")
vb.idLottie.playAnimation()
loadPro()
}
private var mProess = 0
private fun loadPro() {
if (mProess >= 100) {
vb.idSJindu.progress = mProess
startActivity<CleanGuestActivity>()
return
}
vb.idSJindu.postDelayed(Runnable {
mProess += Random.nextInt(5)
vb.idSJindu.progress = mProess
loadPro()
}, 200)
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityPictureBinding
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.ImageInfoBean
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.shareMultipleImages
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.logic.testLog
import com.zxhyis.toolss.ui.adapter.ImageAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
@SuppressLint("NotifyDataSetChanged")
class PictureActivity : TopActivity<ActivityPictureBinding>(), DialogDismissListener {
private val imageList = ArrayList<ImageInfoBean>()
private val imageSelectedList = ArrayList<ImageInfoBean>()
private lateinit var imageAdapter: ImageAdapter
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var dialog: LoadingDialog? = null
private var needRefresh = false
override fun getViewBinding1(): ActivityPictureBinding {
return ActivityPictureBinding.inflate(layoutInflater)
}
@SuppressLint("Recycle")
override fun init() {
vb.inPicture.tvTitle.text = getString(R.string.tv_picture)
setStatusBarTextDark(this)
imageList.clear()
imageSelectedList.clear()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvImage.visibility = View.VISIBLE
loadImages()
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvImage.visibility = View.GONE
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvImage.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvImage.visibility = View.VISIBLE
loadImages()
}
}
}
vb.inPicture.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
vb.tvSet.setOnClick(javaClass.simpleName) {
vb.tvSet.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(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inPicture.tvMenu.setOnClick(javaClass.simpleName) {
needRefresh = true
if (imageList.size > 0) {
vb.inPicture.ivBack.visibility = View.GONE
vb.inPicture.tvMenu.visibility = View.GONE
vb.inPicture.imageSelectAll.visibility = View.VISIBLE
vb.inPicture.tvAll.visibility = View.VISIBLE
vb.llBottom.visibility = View.VISIBLE
vb.inPicture.tvTitle.text = getString(R.string.select_project)
imageAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.inPicture.imageSelectAll.setOnClick(javaClass.simpleName) {
imageSelectedList.clear()
vb.inPicture.imageSelectAll.isSelected = !vb.inPicture.imageSelectAll.isSelected
if (vb.inPicture.imageSelectAll.isSelected) {
imageAdapter.selectAll()
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
imageAdapter.deselectAll()
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
vb.ivShare.setOnClick(javaClass.simpleName) {
when {
imageSelectedList.size in 1..3 -> {
shareImages()
}
imageSelectedList.size > 3 -> {
"Select up to three".showToast()
}
else -> {
"Select at least one".showToast()
}
}
}
vb.imageLoad.addAnimatorListener(object : AnimatorListener {
override fun onAnimationStart(animation: Animator) {
}
override fun onAnimationEnd(animation: Animator) {
startActivity<ResultActivity>("from" to "picture")
finish()
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
vb.ivDelete.setOnClick(javaClass.simpleName) {
if (imageSelectedList.size > 0) {
deleteImages()
vb.apply {
inPicture.clInclude.visibility = View.GONE
rvImage.visibility = View.GONE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
imageLoad.visibility = View.VISIBLE
llBottom.visibility = View.GONE
imageLoad.playAnimation()
tvLoad.visibility = View.VISIBLE
}
} else {
"Select at least one".showToast()
}
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finish()
}
})
}
override fun onResume() {
super.onResume()
}
@SuppressLint("Recycle", "CutPasteId")
private fun loadImages() {//加载图片
dialog = LoadingDialog()
dialog?.setDismissListener(this)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
CoroutineScope(Dispatchers.IO).launch {
delay(1000)
val projection = arrayOf(MediaStore.Images.Media.DATA)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
null
)
cursor?.let {
val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
while (cursor.moveToNext()) {
val imagePath = cursor.getString(columnIndex)
val bitmap = BitmapFactory.decodeFile(imagePath)
val file = File(imagePath)
if (file.exists()) {
imageList.add(
ImageInfoBean(
imagePath,
bitmap,
file,
Uri.parse(imagePath),
needRefresh
)
)//数据源
}
}
cursor.close()
imageAdapter = ImageAdapter(
imageList,
this@PictureActivity,
object : Logic {
override fun doLogic() {
remove()
if (imageSelectedList.size > 0) {
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
}
)
}
//init rv
launch(Dispatchers.Main) {
if (imageList.size > 0) {
val gridLayoutManager = GridLayoutManager(this@PictureActivity, 3)
gridLayoutManager.initialPrefetchItemCount = 10
vb.rvImage.apply {
layoutManager = gridLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = imageAdapter
}
vb.apply {
rvImage.visibility = View.VISIBLE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
}
} else {
vb.apply {
rvImage.visibility = View.GONE
icNoFile.visibility = View.VISIBLE
tvNoFile.visibility = View.VISIBLE
}
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun remove() {
imageSelectedList.clear()
for (image in imageList) {
if (image.isSelected) {
imageSelectedList.add(image)
} else {
imageSelectedList.remove(image)
}
}
}
private fun shareImages() {
val uriList = ArrayList<Uri>()
for (image in imageSelectedList) {
uriList.add(image.imageUri)
}
shareMultipleImages(uriList, this)
}
private fun deleteImages() {
testLog("size:${imageSelectedList.size}")
for (data in imageSelectedList) {
val filePath = getRealPathFromURI(contentResolver, Uri.parse(data.imagePath))
val file = File(filePath)
file.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(File(file.path))
intent.data = uri
sendBroadcast(intent)
}
}
private fun getRealPathFromURI(contentResolver: ContentResolver, contentUri: Uri): String? {
var cursor = contentResolver.query(contentUri, null, null, null, null)
return if (cursor == null) {
contentUri.path
} else {
cursor.moveToFirst()
val index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
val realPath = cursor.getString(index)
cursor.close()
realPath
}
}
override fun onDestroy() {
super.onDestroy()
imageList.clear()
imageSelectedList.clear()
if (dialog != null) {
dialog?.dismiss()
}
}
override fun onDialogDismissed() {
//MaxAdUtils.showMaxInterstitialAd(this, "interstitial_slot")
AdmobUtils.showInterstitialAd(this)
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityRecentlyBinding
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.ImageAndVideoBean
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.shareMultipleImagesAndVideos
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.ui.adapter.RecentAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.attribute.BasicFileAttributes
import java.sql.Date
import java.text.SimpleDateFormat
class RecentlyActivity : TopActivity<ActivityRecentlyBinding>(),DialogDismissListener {
private lateinit var recentAdapter: RecentAdapter
private val dataList = ArrayList<ImageAndVideoBean>()
private val selectedList = ArrayList<ImageAndVideoBean>()
private val fileList = ArrayList<File>()
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var dialog: LoadingDialog? = null
private var needRefresh = false
override fun getViewBinding1(): ActivityRecentlyBinding {
return ActivityRecentlyBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun init() {
setStatusBarTextDark(this)
dataList.clear()
selectedList.clear()
fileList.clear()
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
loadImagesAndVideo()
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
loadImagesAndVideo()
}
}
}
vb.tvSet.setOnClick(javaClass.simpleName) {
vb.inRecent.tvTitle.text = "Recent Files"
vb.inRecent.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
vb.tvSet.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(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inRecent.tvMenu.setOnClick(javaClass.simpleName) {
needRefresh = true
if (dataList.size > 0) {
vb.inRecent.ivBack.visibility = View.GONE
vb.inRecent.tvMenu.visibility = View.GONE
vb.inRecent.imageSelectAll.visibility = View.VISIBLE
vb.inRecent.tvAll.visibility = View.VISIBLE
vb.llBottom.visibility = View.VISIBLE
vb.inRecent.tvTitle.text = getString(R.string.select_project)
recentAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.inRecent.imageSelectAll.setOnClick(javaClass.simpleName) {
fileList.clear()
selectedList.clear()
vb.inRecent.imageSelectAll.isSelected = !vb.inRecent.imageSelectAll.isSelected
if (vb.inRecent.imageSelectAll.isSelected) {
for (data in dataList) {
fileList.add(data.file)
selectedList.add(
ImageAndVideoBean(
data.path,
data.file,
data.type,
data.fileName,
data.fileSize,
data.recentTime,
data.imageUri,
data.videoUri
)
)
}
recentAdapter.selectAll()
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
for (data in dataList) {
fileList.remove(data.file)
selectedList.remove(
ImageAndVideoBean(
data.path,
data.file,
data.type,
data.fileName,
data.fileSize,
data.recentTime,
data.imageUri,
data.videoUri
)
)
}
recentAdapter.deselectAll()
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
vb.ivShare.setOnClick(javaClass.simpleName) {
when {
fileList.size in 1..3 -> {
share()
}
fileList.size > 3 -> {
"Select up to three".showToast()
}
else -> {
"Select at least one".showToast()
}
}
}
vb.imageLoad.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(500)
startActivity<ResultActivity>("from" to "recent")
finish()
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
vb.ivDelete.setOnClick(javaClass.simpleName) {
if (fileList.size > 0) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
delete()
launch(Dispatchers.Main) {
vb.apply {
inRecent.clInclude.visibility = View.GONE
rvAudio.visibility = View.GONE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
imageLoad.visibility = View.VISIBLE
llBottom.visibility = View.GONE
imageLoad.playAnimation()
tvLoad.visibility = View.VISIBLE
}
}
}
} else {
"Select at least one".showToast()
}
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finish()
}
})
}
override fun onResume() {
super.onResume()
}
private fun loadImagesAndVideo() {
dialog = LoadingDialog()
dialog?.setDismissListener(this)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
CoroutineScope(Dispatchers.IO).launch {
val contentResolver = 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(
path = imagePath,
file = file,
type = 1,
fileName = file.name,
fileSize = file.length(),
recentTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getFileCreationTime(
file.absolutePath
) else "",
imageUri = Uri.parse(imagePath),
isShow = needRefresh
)
)
}
}
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(
path = videoPath,
file = file,
type = 2,
fileName = file.name,
fileSize = file.length(),
recentTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getFileCreationTime(
file.absolutePath
) else "",
imageUri = Uri.parse(videoPath),
isShow = needRefresh
)
)
}
}
cursorImages?.close()
cursorVideos?.close()
recentAdapter = RecentAdapter(dataList, this@RecentlyActivity, object : Logic {
override fun doLogic() {
remove()
if (fileList.size > 0) {
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
})
launch(Dispatchers.Main) {
if (dataList.size > 0) {
val linearLayoutManager = LinearLayoutManager(
this@RecentlyActivity
)
linearLayoutManager.initialPrefetchItemCount = 3
vb.rvAudio.apply {
layoutManager = linearLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = recentAdapter
}
vb.tvNoFile.visibility = View.GONE
vb.rvAudio.visibility = View.VISIBLE
vb.icNoFile.visibility = View.GONE
} else {
vb.tvNoFile.visibility = View.VISIBLE
vb.rvAudio.visibility = View.GONE
vb.icNoFile.visibility = View.VISIBLE
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun delete() {
for (data in selectedList) {
val filePath=getRealPathFromURI(contentResolver,data.imageUri!!)
val file=File(filePath)
file.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(file)
intent.data = uri
sendBroadcast(intent)
}
}
private fun getRealPathFromURI(contentResolver: ContentResolver, contentUri: Uri): String? {
var cursor = contentResolver.query(contentUri, null, null, null, null)
return if (cursor == null) {
contentUri.path
} else {
cursor.moveToFirst()
val index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
val realPath = cursor.getString(index)
cursor.close()
realPath
}
}
private fun remove() {
fileList.clear()
for (data in dataList) {
if (data.isSelected) {
fileList.add(data.file)
selectedList.add(
ImageAndVideoBean(
data.path,
data.file,
data.type,
data.fileName,
data.fileSize,
data.recentTime,
data.imageUri,
data.videoUri
)
)
} else {
fileList.remove(data.file)
selectedList.remove(
ImageAndVideoBean(
data.path,
data.file,
data.type,
data.fileName,
data.fileSize,
data.recentTime,
data.imageUri,
data.videoUri
)
)
}
}
}
@SuppressLint("SimpleDateFormat")
@RequiresApi(Build.VERSION_CODES.O)
fun getFileCreationTime(filePath: String): String? {
try {
val path = Paths.get(filePath)
val attr = Files.readAttributes(path, BasicFileAttributes::class.java)
val creationTime = attr.creationTime()
val date = Date(creationTime.toMillis())
val format = SimpleDateFormat("yyyy-MM-dd HH:mm")
return format.format(date)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
private fun share() {
val uriList = ArrayList<Uri>()
for (image in selectedList) {
if (image.type == 1) {
uriList.add(image.imageUri!!)
}else{
uriList.add(image.videoUri!!)
}
}
shareMultipleImagesAndVideos(uriList, this)
}
override fun onDestroy() {
super.onDestroy()
dataList.clear()
fileList.clear()
selectedList.clear()
if (dialog != null) {
dialog?.dismiss()
}
}
override fun onDialogDismissed() {
// MaxAdUtils.showMaxInterstitialAd(this,"interstitial_slot")
AdmobUtils.showInterstitialAd(this)
}
}
\ No newline at end of file
......@@ -118,7 +118,7 @@ class SplashActivity : TopActivity<ActivityLayoutSplashBinding>() {
vb.idImgGouxuan.setImageResource(R.drawable.xuan)
} else {
isgouxuan = true
vb.idImgGouxuan.setImageResource(R.drawable.gouxuan)
vb.idImgGouxuan.setImageResource(R.drawable.gouxuan_border)
}
}
vb.idUseTerms.setOnClick(javaClass.simpleName) {
......
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.annotation.SuppressLint
import android.content.ContentResolver
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityVideoBinding
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.VideoBean
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.shareMultipleVideos
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.logic.testLog
import com.zxhyis.toolss.ui.adapter.VideoAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class VideoActivity : TopActivity<ActivityVideoBinding>(),DialogDismissListener {
private val videoList = ArrayList<VideoBean>()
private val videoSelectedList = ArrayList<VideoBean>()
private lateinit var videoAdapter: VideoAdapter
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var dialog: LoadingDialog? = null
private var needRefresh = false
override fun getViewBinding1(): ActivityVideoBinding {
return ActivityVideoBinding.inflate(layoutInflater)
}
override fun init() {
setStatusBarTextDark(this)
videoList.clear()
videoSelectedList.clear()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvVideo.visibility = View.VISIBLE
loadVideos()
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvVideo.visibility = View.GONE
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvVideo.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvVideo.visibility = View.VISIBLE
loadVideos()
}
}
}
vb.inPicture.tvTitle.text = getString(R.string.tv_video)
vb.inPicture.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
vb.tvSet.setOnClick(javaClass.simpleName) {
vb.tvSet.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(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inPicture.tvMenu.setOnClick(javaClass.simpleName) {
needRefresh=true
if (videoList.size > 0) {
vb.inPicture.ivBack.visibility = View.GONE
vb.inPicture.tvMenu.visibility = View.GONE
vb.inPicture.imageSelectAll.visibility = View.VISIBLE
vb.inPicture.tvAll.visibility = View.VISIBLE
vb.llBottom.visibility = View.VISIBLE
vb.inPicture.tvTitle.text = getString(R.string.select_project)
videoAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.ivDelete.setOnClick(javaClass.simpleName) {
if (videoSelectedList.size>0){
lifecycleScope.launch {
delay(500)
deleteVideos()
vb.apply {
inPicture.clInclude.visibility = View.GONE
rvVideo.visibility = View.GONE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
imageLoad.visibility = View.VISIBLE
llBottom.visibility=View.GONE
imageLoad.playAnimation()
tvLoad.visibility = View.VISIBLE
}
}
}else{
"Select at least one".showToast()
}
}
vb.imageLoad.addAnimatorListener(object :AnimatorListener{
override fun onAnimationStart(animation: Animator) {
}
override fun onAnimationEnd(animation: Animator) {
startActivity<ResultActivity>("from" to "video")
finish()
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
vb.ivShare.setOnClick(javaClass.simpleName) {
when {
videoSelectedList.size in 1..3 -> {
shareVideos()
}
videoSelectedList.size > 3 -> {
"Select up to three".showToast()
}
else -> {
"Select at least one".showToast()
}
}
}
vb.inPicture.imageSelectAll.setOnClick(javaClass.simpleName) {
videoSelectedList.clear()
vb.inPicture.imageSelectAll.isSelected = !vb.inPicture.imageSelectAll.isSelected
if (vb.inPicture.imageSelectAll.isSelected) {
videoAdapter.selectAll()
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
videoAdapter.deselectAll()
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finish()
}
})
}
@SuppressLint("Recycle")
private fun loadVideos(){
dialog = LoadingDialog()
dialog?.setDismissListener(this)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
CoroutineScope(Dispatchers.IO).launch {
delay(1000)
val projection = arrayOf(MediaStore.Video.Media._ID,MediaStore.Video.Media.DATA)
val sortOrder = "${MediaStore.Video.Media.DATE_ADDED} DESC"
val query = contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
sortOrder
)
query?.use { cursor ->
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
val name=cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)
while (cursor.moveToNext()) {
val id = cursor.getLong(idColumn)
val videoPath=cursor.getString(name)
val contentUri: Uri = Uri.withAppendedPath(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
id.toString()
)
val file=File(videoPath)
videoList.add(VideoBean(videoPath,file,contentUri,needRefresh))
testLog("video:$videoPath")
}
cursor.close()
videoAdapter = VideoAdapter(videoList,this@VideoActivity,object :Logic{
override fun doLogic() {
remove()
if (videoList.size > 0) {
vb.ivShare.setImageResource(R.drawable.ic_share_selected)
vb.ivDelete.setImageResource(R.drawable.ic_delete_selected)
} else {
vb.ivShare.setImageResource(R.drawable.ic_share)
vb.ivDelete.setImageResource(R.drawable.ic_delete)
}
}
})
}
launch(Dispatchers.Main) {
if (videoList.size>0){
val gridLayoutManager = GridLayoutManager(this@VideoActivity, 3)
gridLayoutManager.initialPrefetchItemCount = 10
vb.rvVideo.apply {
layoutManager = GridLayoutManager(this@VideoActivity, 3)
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = videoAdapter
}
vb.apply {
rvVideo.visibility = View.VISIBLE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
}
}else{
vb.apply {
rvVideo.visibility = View.GONE
icNoFile.visibility = View.VISIBLE
tvNoFile.visibility = View.VISIBLE
}
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun remove(){
videoSelectedList.clear()
for (video in videoList){
if (video.isSelected){
videoSelectedList.add(video)
}else{
videoSelectedList.remove(video)
}
}
}
private fun shareVideos(){
val uriList = ArrayList<Uri>()
for (video in videoSelectedList) {
uriList.add(video.videoUri)
}
shareMultipleVideos(uriList,this)
}
private fun deleteVideos(){
for (file in videoSelectedList){
val filePath=getRealPathFromURI(contentResolver,file.videoUri)
val file1=File(filePath)
file1.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(file1)
intent.data = uri
sendBroadcast(intent)
}
}
private fun getRealPathFromURI(contentResolver: ContentResolver, contentUri: Uri): String? {
var cursor = contentResolver.query(contentUri, null, null, null, null)
return if (cursor == null) {
contentUri.path
} else {
cursor.moveToFirst()
val index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
val realPath = cursor.getString(index)
cursor.close()
realPath
}
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
if (dialog!=null){
dialog?.dismiss()
}
videoList.clear()
videoSelectedList.clear()
}
override fun onDialogDismissed() {
//MaxAdUtils.showMaxInterstitialAd(this,"interstitial_slot")
AdmobUtils.showInterstitialAd(this)
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.graphics.Color
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.BarUtils
import com.trustlook.sdk.data.AppInfo
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.ad.ConfigHelper
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityLayoutVirusappBinding
class VirusAppActivity:TopActivity<ActivityLayoutVirusappBinding>() {
override fun getViewBinding1(): ActivityLayoutVirusappBinding {
return ActivityLayoutVirusappBinding.inflate(layoutInflater)
}
private val appList = mutableListOf<AppInfo>()
override fun init() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
vb.root.updatePadding(top = BarUtils.getStatusBarHeight())
vb.idYdBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishToMain()
}
})
ConfigHelper.riskAppList?.let { appList.addAll(it) }
vb.idTvRisks.text="${appList.size} application is a security risk"
vb.idRlApp.run {
layoutManager = LinearLayoutManager(context)
adapter = object : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): RecyclerView.ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_layout_risk_app, parent, false)
return object : RecyclerView.ViewHolder(view) {}
}
override fun getItemCount() = appList.size
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder.itemView.run {
val c=ConfigHelper.appList?.firstOrNull {
it.packageName == appList[position].packageName
}
findViewById<ImageView>(R.id.id_app_icon).setImageDrawable(c?.icon)
findViewById<TextView>(R.id.id_app_name).text = appList[position].appName
holder.itemView.setOnClickListener {
AdmobUtils.showInterstitialAd(this@VirusAppActivity){
AppUtils.launchAppDetailsSettings(appList[position].packageName)
}
}
}
}
}
}
}
}
\ No newline at end of file
package com.zxhyis.toolss.ui.page
import android.Manifest
import android.animation.Animator
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.text.format.Formatter
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.zxhyis.toolss.R
import com.zxhyis.toolss.ad.AdmobUtils
import com.zxhyis.toolss.base.TopActivity
import com.zxhyis.toolss.databinding.ActivityZipFileBinding
import com.zxhyis.toolss.logic.AudioBean
import com.zxhyis.toolss.logic.Counts
import com.zxhyis.toolss.logic.DialogDismissListener
import com.zxhyis.toolss.logic.Logic
import com.zxhyis.toolss.logic.setOnClick
import com.zxhyis.toolss.logic.setStatusBarTextDark
import com.zxhyis.toolss.logic.showToast
import com.zxhyis.toolss.logic.startActivity
import com.zxhyis.toolss.ui.adapter.ZipAdapter
import com.zxhyis.toolss.ui.dialog.LoadingDialog
import com.zxhyis.toolss.ui.page.result.ResultActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.attribute.BasicFileAttributes
import java.sql.Date
import java.text.SimpleDateFormat
@SuppressLint("SimpleDateFormat")
class ZipFileActivity : TopActivity<ActivityZipFileBinding>(), DialogDismissListener {
private val zipList = ArrayList<AudioBean>()
private val selectList = ArrayList<AudioBean>()
private val fileList = ArrayList<File>()
private lateinit var zipAdapter: ZipAdapter
private var allSize = 0L
private var dialog: LoadingDialog? = null
private val result =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
private var needRefresh = false
override fun getViewBinding1(): ActivityZipFileBinding {
return ActivityZipFileBinding.inflate(layoutInflater)
}
override fun init() {
vb.inAudio.tvTitle.text = getString(R.string.tv_zip)
setStatusBarTextDark(this)
allSize = 0
zipList.clear()
fileList.clear()
zipList.clear()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initDatasource(this@ZipFileActivity)
dialog = LoadingDialog()
dialog?.setDismissListener(this@ZipFileActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
} else {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
totalSize.visibility = View.GONE
}
}
} else {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
vb.apply {
imagePer.visibility = View.VISIBLE
tvDes.visibility = View.VISIBLE
tvSet.visibility = View.VISIBLE
vb.tvSet.setBackgroundResource(R.drawable.bg_shape_set)
rvAudio.visibility = View.GONE
totalSize.visibility = View.GONE
}
} else {
vb.apply {
imagePer.visibility = View.GONE
tvDes.visibility = View.GONE
tvSet.visibility = View.GONE
rvAudio.visibility = View.VISIBLE
totalSize.visibility = View.VISIBLE
initDatasource(this@ZipFileActivity)
dialog = LoadingDialog()
dialog?.setDismissListener(this@ZipFileActivity)
dialog?.isCancelable = false
dialog?.showNow(supportFragmentManager, "loading")
}
}
}
vb.inAudio.ivBack.setOnClick(javaClass.simpleName) {
finish()
}
vb.tvSet.setOnClick(javaClass.simpleName) {
vb.tvSet.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(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
), Counts.REQUEST_ALL_FILE
)
}
}
vb.inAudio.imageSelectAll.setOnClick(javaClass.simpleName) {
fileList.clear()
selectList.clear()
vb.inAudio.imageSelectAll.isSelected = !vb.inAudio.imageSelectAll.isSelected
if (vb.inAudio.imageSelectAll.isSelected) {
zipAdapter.selectAll()
for (audio in zipList) {
fileList.add(audio.file)
selectList.add(audio)
}
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_set)
} else {
zipAdapter.deselectAll()
for (audio in zipList) {
fileList.remove(audio.file)
selectList.remove(audio)
}
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_delete_no)
}
}
vb.inAudio.tvMenu.setOnClick (javaClass.simpleName){
needRefresh = true
if (zipList.size > 0) {
vb.inAudio.ivBack.visibility = View.GONE
vb.inAudio.tvMenu.visibility = View.GONE
vb.inAudio.imageSelectAll.visibility = View.VISIBLE
vb.inAudio.tvAll.visibility = View.VISIBLE
vb.btDelete.visibility = View.VISIBLE
vb.inAudio.tvTitle.text = getString(R.string.select_zip_file)
zipAdapter.setShow()
} else {
getString(R.string.file_not_found).showToast()
}
}
vb.btDelete.setOnClick(javaClass.simpleName) {
if (isCanDelete()) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
deleteFiles()
launch(Dispatchers.Main) {
updateUI()
}
}
} else {
"Please select at least one".showToast()
}
}
vb.imageLoad.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(500)
startActivity<ResultActivity>("from" to "zip")
finish()
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun initDatasource(context: Context) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
val uri: Uri = MediaStore.Files.getContentUri("external")
val projection = arrayOf(MediaStore.Files.FileColumns.DATA)
val selection = MediaStore.Files.FileColumns.MIME_TYPE + "=?"
val selectionArgs = arrayOf("application/zip")
val sortOrder = null
val cursor: Cursor? = context.contentResolver.query(
uri, projection, selection, selectionArgs, sortOrder
)
cursor?.use {
val columnIndex = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)
while (cursor.moveToNext()) {
val filePath = cursor.getString(columnIndex)
val file = File(filePath)
zipList.add(
AudioBean(
filePath,
file.absoluteFile.name,
Uri.parse(filePath),
file,
file.length(),
apkTime = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getFileCreationTime(
file.absolutePath
)
else "",
needRefresh
)
)
allSize = file.length()
}
cursor.close()
zipAdapter = ZipAdapter(zipList, this@ZipFileActivity, 0, object : Logic {
override fun doLogic() {
remove()
if (fileList.size > 0) {
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_set)
} else {
vb.btDelete.setBackgroundResource(R.drawable.bg_shape_delete_no)
}
}
})
}
launch(Dispatchers.Main) {
if (zipList.size > 0) {
val linearLayoutManager = LinearLayoutManager(this@ZipFileActivity)
linearLayoutManager.initialPrefetchItemCount = 10
vb.rvAudio.apply {
layoutManager = linearLayoutManager
setHasFixedSize(true)
setItemViewCacheSize(20)
adapter = zipAdapter
}
vb.apply {
rvAudio.visibility = View.VISIBLE
icNoFile.visibility = View.GONE
tvNoFile.visibility = View.GONE
totalSize.text = Formatter.formatFileSize(this@ZipFileActivity, allSize)
}
} else {
vb.apply {
rvAudio.visibility = View.GONE
icNoFile.visibility = View.VISIBLE
tvNoFile.visibility = View.VISIBLE
totalSize.visibility = View.GONE
}
}
delay(1000)
dialog?.dismiss()
}
}
}
private fun updateUI() {
vb.imageLoad.visibility = View.VISIBLE
vb.tvLoad.visibility = View.VISIBLE
vb.imageLoad.playAnimation()
vb.rvAudio.visibility = View.GONE
vb.inAudio.clInclude.visibility = View.GONE
vb.btDelete.visibility = View.GONE
vb.totalSize.visibility = View.GONE
}
@RequiresApi(Build.VERSION_CODES.O)
fun getFileCreationTime(filePath: String): String? {
try {
val path = Paths.get(filePath)
val attr = Files.readAttributes(path, BasicFileAttributes::class.java)
val creationTime = attr.creationTime()
val date = Date(creationTime.toMillis())
val format = SimpleDateFormat("yyyy-MM-dd HH:mm")
return format.format(date)
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
private fun isCanDelete(): Boolean {
return fileList.size > 0
}
private fun remove() {
fileList.clear()
selectList.clear()
for (audio in zipList) {
if (audio.isSelected) {
fileList.add(audio.file)
selectList.add(audio)
} else {
fileList.remove(audio.file)
selectList.remove(audio)
}
}
}
private fun deleteFiles() {
for (file in fileList) {
file.delete()
val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val uri = Uri.fromFile(file)
intent.data = uri
sendBroadcast(intent)
}
}
override fun onResume() {
super.onResume()
}
override fun onDestroy() {
super.onDestroy()
zipList.clear()
fileList.clear()
selectList.clear()
if (dialog != null) {
dialog?.dismiss()
}
}
override fun onDialogDismissed() {
AdmobUtils.showInterstitialAd(this)
// MaxAdUtils.showMaxInterstitialAd(this, "interstitial_slot")
}
}
\ No newline at end of file
......@@ -57,7 +57,6 @@ import java.io.File
/**
* 大文件清理 5.11
* 之前版本 :[com.zxhyis.toolss.ui.page.AllFilesActivity]
*/
class BigFileCleanActivity : TopActivity<ActivityBigFileCleanBinding>() {
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image_selected_all" android:state_selected="true"/>
<item android:drawable="@drawable/iamge_unselected_all"/>
<item android:drawable="@drawable/gouxuan" android:state_selected="true" />
<item android:drawable="@drawable/iamge_unselected_all" />
</selector>
\ 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/image_selected" android:state_selected="true"/>
<item android:drawable="@drawable/gouxuan" android:state_selected="true"/>
<item android:drawable="@drawable/image_unselected"/>
</selector>
\ 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/gouxuan" android:state_checked="true" />
<item android:drawable="@drawable/gouxuan_border" android:state_checked="true" />
<item android:drawable="@drawable/weixuan" />
</selector>
\ No newline at end of file
......@@ -94,7 +94,7 @@
android:id="@+id/id_view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......@@ -124,7 +124,7 @@
android:id="@+id/id_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......@@ -154,7 +154,7 @@
android:id="@+id/id_view3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......
......@@ -79,7 +79,7 @@
android:id="@+id/id_view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......@@ -109,7 +109,7 @@
android:id="@+id/id_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......@@ -139,7 +139,7 @@
android:id="@+id/id_view3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/yuanw" />
android:src="@drawable/cjxuanzhuan" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
......
......@@ -80,7 +80,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="2dp"
android:src="@drawable/gouxuan"
android:src="@drawable/gouxuan_border"
android:visibility="gone" />
......
......@@ -40,7 +40,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="47dp"
android:src="@drawable/tu1"
android:src="@drawable/bingduiocn1"
app:layout_constraintBottom_toTopOf="@+id/id_img_ani"
app:layout_constraintEnd_toEndOf="parent" />
......@@ -60,7 +60,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="47dp"
android:layout_marginTop="21dp"
android:src="@drawable/tu2"
android:src="@drawable/bingduiocn2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/id_img_ani" />
......
......@@ -186,7 +186,7 @@
android:max="100"
android:progress="50"
android:progressDrawable="@drawable/seekbar_bg"
android:thumb="@drawable/yuanl" />
android:thumb="@drawable/preview" />
<TextView
android:layout_width="wrap_content"
......
<?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"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="7dp"
app:cardCornerRadius="7dp"
app:cardElevation="1dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:layout_constraintDimensionRatio="h,1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_sel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="7dp"
android:src="@drawable/image_selected"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_video"
android:layout_margin="6dp"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
......@@ -18,7 +18,7 @@
android:id="@+id/id_t_icon"
android:layout_width="43dp"
android:layout_height="43dp"
android:src="@drawable/tzguanbitu"
android:src="@drawable/tongzhiicon"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
......
<resources>
<string name="app_name">File Manager Select</string>
<string name="app_name">Clean Master</string>
<string name="service_name">AppNotificaiton service</string>
<string name="facebook_app_id">811174717697476</string>
<!-- TODO: Remove or change this placeholder text -->
......
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