Commit 1496c13e authored by wanglei's avatar wanglei

初始化项目

parent f13d7b21
......@@ -1769,11 +1769,11 @@ def class_disorder():
def deal_junk():
# 添加垃圾类
add_junk_activity()
# 添加方法嵌套
add_junk_method()
# 添加垃圾代码
add_junk_code()
# add_junk_activity()
# # 添加方法嵌套
# add_junk_method()
# # 添加垃圾代码
# add_junk_code()
# 类成员乱序
class_disorder()
......
......@@ -36,15 +36,7 @@
android:theme="@style/Theme.SmartCleaner"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<activity
android:name=".activity.DeviceScanActivity"
android:exported="false" />
<activity
android:name=".activity.SettingActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.splash.NewSplashActivity"
android:exported="true"
......@@ -58,6 +50,24 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.ScreenShotActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.DeviceScanActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.SettingActivity"
android:exported="false"
android:launchMode="singleTop"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".activity.GuestActivity"
android:screenOrientation="portrait"
......
package com.test.basd.fastcleanerjunk.activity
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.test.basd.fastcleanerjunk.R
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.net.ConnectivityManager
import android.net.wifi.WifiManager
import android.os.Build
import android.os.Environment
import android.os.StatFs
import androidx.activity.addCallback
import com.blankj.utilcode.util.DeviceUtils
import com.test.basd.fastcleanerjunk.databinding.ActivityDeviceScanBinding
import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.KotlinExt.toFormatSize
import com.test.basd.fastcleanerjunk.helps.LogEx
import com.test.basd.fastcleanerjunk.helps.StatFsHelper
import com.test.basd.fastcleanerjunk.helps.ads.AdmobUtils
import com.test.basd.fastcleanerjunk.view.AFunOb
import java.io.IOException
import java.nio.file.Files
import java.nio.file.Paths
import java.util.Locale
class DeviceScanActivity : BaseActivity<ActivityDeviceScanBinding>() {
private val TAG = "DeviceScanActivity"
override val binding: ActivityDeviceScanBinding by lazy {
ActivityDeviceScanBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun initView() {
binding.tvDeviceName.text = getDeviceName()
binding.tvAndroidVersion.text = "System Version: Android ${Build.VERSION.RELEASE}"
initStorage()
binding.tvAbis.text = DeviceUtils.getABIs().toStringex()
val cupInfo = cpuInfo()
cupInfo.forEach {
LogEx.logDebug(TAG, "cupInfo $it")
}
binding.tvCpuCores.text = cupInfo.find { it.contains("CPU architecture") }?.split(":")?.get(1)
binding.tvIpAddress.text = if (isWifiConnected(this)) getWifiIpAddress(this) else ""
binding.tvSsid.text = getWifiSSID(this)
binding.tvLinkSpeed.text = "${getWifiLinkSpeed(this)} Mbps"
}
override fun initListener() {
binding.tvOk.setOnClickListener {
startActivity(Intent(this, ResultActivity::class.java).apply {
putExtra("from", AFunOb.DEVICE_SCAN)
})
}
binding.flBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
AdmobUtils.showInterstitialAd(this@DeviceScanActivity) {
finishToMain()
}
}
}
private fun capitalize(str: String?): String? {
return if (str.isNullOrEmpty()) {
str
} else str.substring(0, 1).uppercase(Locale.getDefault()) + str.substring(1).lowercase(Locale.getDefault())
}
fun getDeviceName(): String? {
val manufacturer = Build.MANUFACTURER
val model = Build.MODEL
return if (model.lowercase(Locale.getDefault()).startsWith(manufacturer.lowercase(Locale.getDefault()))) {
capitalize(model)
} else capitalize(manufacturer) + " " + model
}
@SuppressLint("SetTextI18n")
private fun initStorage() {
val stat = StatFs(Environment.getExternalStorageDirectory().path)
val totalSize = StatFsHelper.totalSize()
val availableSize = StatFsHelper.availableSize()
val usedSize = totalSize - availableSize
val usedPercentage = usedSize.toFloat() / totalSize * 100
binding.tvStorage.text = "${usedSize.toFormatSize()}/ ${totalSize.toFormatSize()}"
}
private fun cpuInfo(): ArrayList<String> {
val cpuList: ArrayList<String> = arrayListOf()
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val cpuInfo = String(Files.readAllBytes(Paths.get("/proc/cpuinfo")))
LogEx.logDebug(TAG, "$cpuInfo")
val arrays = cpuInfo.split("\n")
cpuList.addAll(arrays)
}
} catch (e: IOException) {
e.printStackTrace()
}
return cpuList
}
fun isWifiConnected(context: Context): Boolean {
val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
// 检查networkInfo是否为null以及是否连接到Wi-Fi
return networkInfo != null && networkInfo.type == ConnectivityManager.TYPE_WIFI
}
fun getWifiIpAddress(context: Context): String {
val wifiManager = context.getSystemService(WIFI_SERVICE) as WifiManager
val wifiInfo = wifiManager.connectionInfo
val ip = wifiInfo.ipAddress
return if (ip == 0) {
"No network connection"
} else (ip and 0xff).toString() + "." + (ip shr 8 and 0xff) + "." + (ip shr 16 and 0xff) + "." + (ip shr 24 and 0xff)
}
fun getMobileIpAddress(context: Context): String {
val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork = connectivityManager.activeNetworkInfo
return if (activeNetwork != null && activeNetwork.isConnected) {
activeNetwork.extraInfo.toString().split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1].trim { it <= ' ' }
} else "No network connection"
}
fun getWifiSSID(context: Context): String? {
val wifiManager = context.getSystemService(WIFI_SERVICE) as WifiManager
val wifiInfo = wifiManager.connectionInfo
if (wifiInfo != null) {
val ssid = wifiInfo.ssid
// 移除SSID周围的双引号
return if (ssid != null && ssid.isNotEmpty()) ssid.replace("\"".toRegex(), "") else null
}
return "<unknown ssid>"
}
/**
* 获取当前Wi-Fi连接的链路速度。
*
* @param context Android上下文对象。
* @return 链路速度,单位为Mbps。如果没有连接到Wi-Fi或无法获取,则返回-1。
*/
fun getWifiLinkSpeed(context: Context): Int {
val wifiManager = context.getSystemService(WIFI_SERVICE) as WifiManager
val wifiInfo = wifiManager.connectionInfo
// 获取Wi-Fi链路速度,单位为Mbps
return wifiInfo?.linkSpeed ?: -1
}
}
private fun <T> Array<T>.toStringex(): String {
val sb = StringBuffer()
sb.append("[")
forEachIndexed { index, t ->
if (index == size - 1) {
sb.append("$t")
} else {
sb.append("$t").append(",")
}
}
}
\ No newline at end of file
sb.append("]")
return sb.toString()
}
package com.test.basd.fastcleanerjunk.activity
import android.animation.ValueAnimator
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.graphics.Color
import android.graphics.Typeface
import android.view.animation.LinearInterpolator
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
......@@ -15,7 +13,6 @@ import androidx.viewpager2.widget.ViewPager2
import com.blankj.utilcode.util.AppUtils
import com.blankj.utilcode.util.BarUtils
import com.test.basd.fastcleanerjunk.databinding.ActivityMainBinding
import com.test.basd.fastcleanerjunk.fragment.BatteryFragment
import com.test.basd.fastcleanerjunk.fragment.HomeFragment
import com.test.basd.fastcleanerjunk.fragment.ToolsFragment
import com.test.basd.fastcleanerjunk.helps.BaseActivity
......
package com.test.basd.fastcleanerjunk.activity
import android.os.Environment
import com.test.basd.fastcleanerjunk.adapter.ScreenShotAdapter
import com.test.basd.fastcleanerjunk.bean.ScreenPhotoBean
import com.test.basd.fastcleanerjunk.bean.ScreenshotBean
import com.test.basd.fastcleanerjunk.databinding.ActivityScreenShotBinding
import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.KotlinExt.toFormatSize
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
import kotlin.collections.HashSet
class ScreenShotActivity(val select: (count: Int) -> Unit) : BaseActivity<ActivityScreenShotBinding>() {
private lateinit var screenShotAdapter: ScreenShotAdapter
override val binding: ActivityScreenShotBinding by lazy {
ActivityScreenShotBinding.inflate(layoutInflater)
}
override fun initView() {
screenShotAdapter = ScreenShotAdapter()
binding.rv.adapter = screenShotAdapter
initData()
}
private fun initData() {
val list = getScreenshotBean()
screenShotAdapter.setData(list)
val size = list.sumOf { it.screenPhotoBean.sumOf { ss -> ss.file.length() } }
val sizeF = size.toFormatSize().split(" ")
binding.tvSize.text = sizeF[0]
binding.tvUnit.text = sizeF[1]
}
override fun initListener() {
binding.flBack.setOnClickListener {
finishToMain()
}
binding.llSelectAll.setOnClickListener {
binding.llSelectAll.isSelected = !binding.llSelectAll.isSelected
screenShotAdapter.toggleSelect(binding.llSelectAll.isSelected)
}
}
private fun getScreenshotBean(): ArrayList<ScreenshotBean> {
val dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
val screenFile = File(dcim, "Screenshots")
val hash = HashMap<String, HashSet<File>>()
val formatter = SimpleDateFormat("yyyy/MM", Locale.getDefault())
if (screenFile.exists()) {
screenFile.listFiles()?.forEach { file ->
val time = formatter.format(file.lastModified())
if (hash[time] == null) {
hash[time] = HashSet()
}
val set = hash[time]
set?.add(file)
}
}
val beans = arrayListOf<ScreenshotBean>()
hash.forEach { (t, u) ->
beans.add(ScreenshotBean(t, u.map { file -> ScreenPhotoBean(file) }))
}
return beans
}
}
\ No newline at end of file
package com.test.basd.fastcleanerjunk.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.test.basd.fastcleanerjunk.R
import com.test.basd.fastcleanerjunk.bean.ScreenPhotoBean
import com.test.basd.fastcleanerjunk.bean.ScreenshotBean
import com.test.basd.fastcleanerjunk.databinding.ItemScreenPhotoBinding
import com.test.basd.fastcleanerjunk.databinding.ItemScreenshotBinding
import com.test.basd.fastcleanerjunk.view.XmlEx.inflate
import java.text.SimpleDateFormat
import java.util.ArrayList
import java.util.Locale
class ScreenShotAdapter() : RecyclerView.Adapter<ScreenShotAdapter.SSS>() {
private val beans = arrayListOf<ScreenshotBean>()
inner class SSS(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SSS {
return SSS(R.layout.item_screenshot.inflate(parent))
}
override fun getItemCount(): Int {
return beans.size
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindViewHolder(holder: SSS, position: Int) {
val binding = ItemScreenshotBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beans[position]
binding.tvSelectAll.text = if (bean.isSelect) "UNSELECT ALL" else "SELECT ALL"
binding.tvSelectAll.setOnClickListener {
bean.isSelect = !bean.isSelect
bean.screenPhotoBean.forEach { subBean -> subBean.isSelect = bean.isSelect }
notifyItemChanged(position)
}
binding.tvTime.text = bean.time
binding.group.removeAllViews()
bean.screenPhotoBean.forEach { screenPhotoBean ->
val photoBinding = ItemScreenPhotoBinding.bind(R.layout.item_screen_photo.inflate(binding.group))
Glide.with(context).load(screenPhotoBean.file).centerCrop().into(photoBinding.iv)
photoBinding.ivSelector.isSelected = screenPhotoBean.isSelect
photoBinding.ivSelector.setOnClickListener {
screenPhotoBean.isSelect = !screenPhotoBean.isSelect
photoBinding.ivSelector.isSelected = screenPhotoBean.isSelect
bean.isSelect = bean.screenPhotoBean.all { it.isSelect }
notifyDataSetChanged()
}
binding.group.addView(photoBinding.root)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(screenshotBean: List<ScreenshotBean>) {
beans.clear()
beans.addAll(screenshotBean)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(selected: Boolean) {
beans.forEach {
it.isSelect = selected
it.screenPhotoBean.forEach {
it.isSelect = selected
}
}
notifyDataSetChanged()
}
}
\ No newline at end of file
......@@ -18,6 +18,7 @@ import com.test.basd.fastcleanerjunk.view.AFunOb.NETWORK_TRAFFIC
import com.test.basd.fastcleanerjunk.view.AFunOb.NOTIFICATION_CLEANER
import com.test.basd.fastcleanerjunk.view.AFunOb.PHOTO_COMPRESS
import com.test.basd.fastcleanerjunk.view.AFunOb.RECENT_APP_USAGE
import com.test.basd.fastcleanerjunk.view.AFunOb.SCREENSHOT_CLEANER
import com.test.basd.fastcleanerjunk.view.AFunOb.SIMILAR_PHOTOS
import com.test.basd.fastcleanerjunk.view.XmlEx.inflate
......@@ -44,6 +45,7 @@ class ToolsAdapter(
ToolUI(NOTIFICATION_CLEANER, context.getString(R.string.notification_cleaner), R.mipmap.notification_tools),
ToolUI(NETWORK_TRAFFIC, context.getString(R.string.network_traffic), R.mipmap.network_tools),
ToolUI(RECENT_APP_USAGE, context.getString(R.string.recent_app_usage), R.mipmap.recentapp_tools),
ToolUI(SCREENSHOT_CLEANER, context.getString(R.string.screenshot_cleaner), R.mipmap.screenshot_tools),
)
),
......
package com.test.basd.fastcleanerjunk.bean
import java.io.File
data class ScreenshotBean(
val time: String,
val screenPhotoBean: List<ScreenPhotoBean>
){
var isSelect: Boolean = false
}
data class ScreenPhotoBean(val file: File) {
var isSelect: Boolean = false
}
\ No newline at end of file
......@@ -5,13 +5,13 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Environment
import android.os.StatFs
import android.util.Log
import android.view.animation.LinearInterpolator
import android.widget.ScrollView
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.test.basd.fastcleanerjunk.activity.AppManagerActivity
import com.test.basd.fastcleanerjunk.activity.BatteryInfoActivity
import com.test.basd.fastcleanerjunk.activity.DeviceScanActivity
import com.test.basd.fastcleanerjunk.activity.LargeFileCleanActivity
import com.test.basd.fastcleanerjunk.activity.NetWorkActivity
import com.test.basd.fastcleanerjunk.activity.RecentAppActivity
......@@ -23,6 +23,8 @@ import com.test.basd.fastcleanerjunk.helps.BaseFragment
import com.test.basd.fastcleanerjunk.helps.KotlinExt.setOnClickListener
import com.test.basd.fastcleanerjunk.helps.KotlinExt.toFormatSize
import com.test.basd.fastcleanerjunk.helps.NetWorkSpeed
import com.test.basd.fastcleanerjunk.helps.StatFsHelper.availableSize
import com.test.basd.fastcleanerjunk.helps.StatFsHelper.totalSize
import com.test.basd.fastcleanerjunk.notificationclean.NotificationGuestActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
......@@ -91,80 +93,24 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() {
binding.ivSetting.setOnClickListener {
startActivity(Intent(requireActivity(), SettingActivity::class.java))
}
binding.idDeviceScan.setOnClickListener {
startActivity(Intent(requireActivity(), DeviceScanActivity::class.java))
}
MainScope().launch(Dispatchers.IO) {
NetWorkSpeed.startMoritor()
}
}
var totalsize = 0L
@SuppressLint("SetTextI18n")
private fun initStorage() {
val stat = StatFs(Environment.getExternalStorageDirectory().path)
val totalSize = f()
val availableSize = b()
val totalSize = totalSize()
val availableSize = availableSize()
val usedSize = totalSize - availableSize
val usedPercentage = usedSize.toFloat() / totalSize * 100
binding.idTvOccupied.text = "${usedSize.toFormatSize()}/ ${totalSize.toFormatSize()}"
}
fun f(): Long {
return if (totalsize > 0) {
totalsize
} else try {
val statFs = StatFs(Environment.getExternalStorageDirectory().path)
val statFs2 = StatFs(Environment.getRootDirectory().path)
Log.i(
"storeByteDebug",
"store1: " + statFs2.blockSizeLong * statFs2.blockCountLong + "====store2: " + statFs.blockSizeLong * statFs.blockCountLong
)
var blockSizeLong =
statFs2.blockSizeLong * statFs2.blockCountLong + statFs.blockSizeLong * statFs.blockCountLong
blockSizeLong = getClosestPowerOfTwo(blockSizeLong)
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
}
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
}
}
fun getClosestPowerOfTwo(size: Long): Long {
var powerOfTwo: Long = 1
while (powerOfTwo < size) {
powerOfTwo *= 2
}
return powerOfTwo
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ import com.test.basd.fastcleanerjunk.activity.NetWorkActivity
import com.test.basd.fastcleanerjunk.activity.RecentAppActivity
import com.test.basd.fastcleanerjunk.activity.RepeaterdPhotoActivity
import com.test.basd.fastcleanerjunk.activity.ScanJunkActivity
import com.test.basd.fastcleanerjunk.activity.ScreenShotActivity
import com.test.basd.fastcleanerjunk.activity.photocompress.photo.StartCompressionPhotoActivity
import com.test.basd.fastcleanerjunk.adapter.ToolsAdapter
import com.test.basd.fastcleanerjunk.databinding.FragmentLayoutToolsBinding
......@@ -72,6 +73,10 @@ class ToolsFragment : BaseFragment<FragmentLayoutToolsBinding>() {
startActivity(Intent(requireActivity(), BatteryInfoActivity::class.java))
}
AFunOb.SCREENSHOT_CLEANER -> {
startActivity(Intent(requireActivity(), ScreenShotActivity::class.java))
}
}
}
binding.rvTools.adapter = adapter
......
package com.test.basd.fastcleanerjunk.helps
import android.os.Environment
import android.os.StatFs
import android.util.Log
object StatFsHelper {
var totalsize = 0L
fun totalSize(): Long {
return if (totalsize > 0) {
totalsize
} else try {
val statFs = StatFs(Environment.getExternalStorageDirectory().path)
val statFs2 = StatFs(Environment.getRootDirectory().path)
Log.i(
"storeByteDebug",
"store1: " + statFs2.blockSizeLong * statFs2.blockCountLong + "====store2: " + statFs.blockSizeLong * statFs.blockCountLong
)
var blockSizeLong =
statFs2.blockSizeLong * statFs2.blockCountLong + statFs.blockSizeLong * statFs.blockCountLong
blockSizeLong = getClosestPowerOfTwo(blockSizeLong)
totalsize = blockSizeLong
blockSizeLong
} catch (e10: java.lang.Exception) {
0L
}
}
fun a(j10: Long): Long {
var tmep = j10
var i7 = 0L
while (true) {
val j11: Long = 1000
if (tmep < j11) {
break
}
tmep /= j11
i7++
}
for (i10 in 0 until i7) {
tmep *= 1024
}
return tmep
}
fun availableSize(): 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
}
}
fun getClosestPowerOfTwo(size: Long): Long {
var powerOfTwo: Long = 1
while (powerOfTwo < size) {
powerOfTwo *= 2
}
return powerOfTwo
}
}
\ No newline at end of file
......@@ -11,4 +11,6 @@ object AFunOb {
const val EMPTY_FILE_CLEANER = "Empty File Cleaner"
const val SIMILAR_PHOTOS = "Similar Photos"
const val PHOTO_COMPRESS = "Photo Compress"
const val DEVICE_SCAN = "Device Scan"
const val SCREENSHOT_CLEANER="Screenshot Cleaner"
}
\ 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="@mipmap/quanxuan_s" android:state_selected="true" />
<item android:drawable="@mipmap/quanxuan_n" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F4F5F9"
android:orientation="vertical"
tools:context=".activity.ScreenShotActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/white">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
android:tint="@color/black"
tools:ignore="ContentDescription,UseAppTint" />
</FrameLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screenshot Cleaner"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="@id/tv_title"
app:layout_constraintStart_toStartOf="@id/tv_title"
app:layout_constraintTop_toBottomOf="@id/tv_title">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/theme_color"
android:textSize="40sp"
android:textStyle="bold"
tools:text="90.1" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:includeFontPadding="false"
android:textColor="@color/theme_color"
android:textSize="16sp"
tools:text="MB" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="Screenshots totally"
android:textColor="#666666"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="@id/tv_title"
app:layout_constraintStart_toStartOf="@id/tv_title"
app:layout_constraintTop_toBottomOf="@id/ll_size"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="80dp">
<LinearLayout
android:id="@+id/ll_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:minWidth="23dp"
android:minHeight="23dp"
android:src="@drawable/bg_selector_square"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select All"
tools:ignore="HardcodedText" />
</LinearLayout>
<com.noober.background.view.BLTextView
android:layout_width="266dp"
android:layout_height="50dp"
android:gravity="center"
android:text="CLEAN"
android:textSize="19sp"
app:bl_corners_radius="10dp"
app:bl_enabled_solid_color="@color/theme_color"
app:bl_enabled_textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ll_select_all"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
......@@ -415,7 +415,8 @@
android:text="More"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold" />
android:textStyle="bold"
tools:ignore="HardcodedText" />
<com.noober.background.view.BLLinearLayout
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="0dp"
android:layout_columnWeight="1"
android:layout_height="109dp"
android:layout_margin="4dp"
app:cardCornerRadius="5dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="end"
android:layout_margin="5dp"
android:importantForAccessibility="no"
android:src="@drawable/bg_select_all" />
</androidx.cardview.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UselessParent">
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText"
tools:text="3024/06" />
<TextView
android:id="@+id/tv_select_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:text="SELECT ALL"
android:textColor="@color/theme_color"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</FrameLayout>
<GridLayout
android:id="@+id/group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:columnCount="3" />
</LinearLayout>
\ No newline at end of file
app/src/main/res/mipmap-xxhdpi/quanxuan_n.png

680 Bytes | W: | H:

app/src/main/res/mipmap-xxhdpi/quanxuan_n.png

673 Bytes | W: | H:

app/src/main/res/mipmap-xxhdpi/quanxuan_n.png
app/src/main/res/mipmap-xxhdpi/quanxuan_n.png
app/src/main/res/mipmap-xxhdpi/quanxuan_n.png
app/src/main/res/mipmap-xxhdpi/quanxuan_n.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -191,4 +191,5 @@
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="similar_photos">Similar Photos</string>
<string name="screenshot_cleaner">Screenshot Cleaner</string>
</resources>
\ No newline at end of file
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