Commit 50dd9119 authored by wanglei's avatar wanglei

[修改]首页

parent 70f6c1c1
package com.base.appzxhy.bean
class FeatureBean(
val key: String = "",
val titleRes: Int = 0,
val icon: Int = 0,
val content: Int = 0,
) {
var span: Int = 1
companion object {
const val JUNK_CLEAN = "junk_clean"
const val BATTERY_INFO = "battery_info"
const val SCREENSHOT_CLEAN = "screenshot_clean"
const val LARGE_FILE_CLEAN = "large_file_clean"
const val PHOTO_COMPRESSION = "photo_compression"
const val SIMILAR_PHOTOS = "similar_photos"
}
}
\ No newline at end of file
package com.base.appzxhy.bean
data class HomeTabUIBean(
val icon: Int,
val tab: String
)
\ No newline at end of file
...@@ -9,7 +9,7 @@ class NotificationSendBean( ...@@ -9,7 +9,7 @@ class NotificationSendBean(
val where: String = "", val where: String = "",
val canSend: () -> Boolean = { true },//是否可以发送 val canSend: () -> Boolean = { true },//是否可以发送
var sendSuccess: (() -> Unit)? = null,//发送成功回调 var sendSuccess: (() -> Unit)? = null,//发送成功回调
var valueMap: HashMap<String, Any> = hashMapOf()//发送通知可能携带的参数 var valueMap: HashMap<String, Any> = hashMapOf()//发送通知可能携带的参数比如 NotificationInfoBean
) { ) {
var actionId: String = "" var actionId: String = ""
......
package com.base.appzxhy.ui.main
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.appzxhy.R
import com.base.appzxhy.bean.FeatureBean
import com.base.appzxhy.databinding.ItemFeatureRvBinding
import com.base.appzxhy.utils.XmlEx.inflate
import com.chad.library.adapter4.BaseQuickAdapter
class FeatureAdapter : BaseQuickAdapter<List<FeatureBean>, FeatureAdapter.Koko6666>() {
inner class Koko6666(view: View) : ViewHolder(view)
var itemClick: ((bean: FeatureBean) -> Unit)? = null
override fun onBindViewHolder(holder: Koko6666, position: Int, item: List<FeatureBean>?) {
item ?: return
val binding = ItemFeatureRvBinding.bind(holder.itemView)
val context = holder.itemView.context
binding.rv.layoutManager = GridLayoutManager(context, 3).apply {
spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position2: Int): Int {
val featureBean = item[position2]
return featureBean.span
}
}
}
val adapter = FeatureItemAdapter()
adapter.itemClick = this.itemClick
binding.rv.adapter = adapter
adapter.submitList(item)
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): Koko6666 {
return Koko6666(R.layout.item_feature_rv.inflate(parent))
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.appzxhy.R
import com.base.appzxhy.bean.FeatureBean
import com.base.appzxhy.databinding.ItemFeatureSpan1Binding
import com.base.appzxhy.databinding.ItemFeatureSpan2Binding
import com.base.appzxhy.utils.Utils.inflate
import com.chad.library.adapter4.BaseQuickAdapter
class FeatureItemAdapter : BaseQuickAdapter<FeatureBean, FeatureItemAdapter.Koko8888>() {
inner class Koko8888(view: View) : ViewHolder(view)
var itemClick: ((bean: FeatureBean) -> Unit)? = null
override fun getItemViewType(position: Int, list: List<FeatureBean>): Int {
val bean = list[position]
return bean.span
}
override fun onBindViewHolder(holder: Koko8888, position: Int, item: FeatureBean?) {
item ?: return
val context = holder.itemView.context
when (item.span) {
1 -> {
val binding = ItemFeatureSpan2Binding.bind(holder.itemView)
binding.ivIcon.setImageResource(item.icon)
binding.tvName.text = context.getString(item.titleRes)
binding.root.setOnClickListener {
itemClick?.invoke(item)
}
}
3 -> {
val binding = ItemFeatureSpan1Binding.bind(holder.itemView)
binding.ivIcon.setImageResource(item.icon)
binding.tvName.text = context.getString(item.titleRes)
binding.root.setOnClickListener {
itemClick?.invoke(item)
}
}
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): Koko8888 {
val layout = when (viewType) {
1 -> R.layout.item_feature_span2
3 -> R.layout.item_feature_span1
else -> 0
}
return Koko8888(layout.inflate(parent))
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.bean.FeatureBean
import com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import com.base.appzxhy.databinding.FragmentHomeBinding
import com.base.appzxhy.utils.Utils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {
private val concatAdapter = ConcatAdapter()
private val featureList = listOf(
FeatureBean(JUNK_CLEAN, R.string.junk_clean, R.drawable.h_junkclean).apply { span = 1 },
FeatureBean(BATTERY_INFO, R.string.battery_info, R.drawable.h_battery).apply { span = 1 },
FeatureBean(SCREENSHOT_CLEAN, R.string.large_file_clean, R.drawable.h_lagre).apply { span = 1 },
FeatureBean(LARGE_FILE_CLEAN, R.string.screenshot_clean, R.drawable.h_screenshot).apply { span = 3 },
FeatureBean(PHOTO_COMPRESSION, R.string.photo_compression, R.drawable.h_compression).apply { span = 3 },
FeatureBean(SIMILAR_PHOTOS, R.string.similar_photos, R.drawable.h_similar).apply { span = 3 },
)
override fun initView() {
super.initView()
binding.rv.adapter = concatAdapter
concatAdapter.addAdapter(YuanAdapter2().apply {
submitList(listOf(arrayOf("", "")))
cleanClick = {
// ActivityController.action(requireContext(), launcher, R.string.junk_clean)
}
initData(this)
})
concatAdapter.addAdapter(FeatureAdapter().apply {
submitList(listOf(featureList))
itemClick = { bean ->
// ActivityController.action(requireContext(), launcher, bean.name)
}
})
}
override fun initListener() {
super.initListener()
}
private fun initData(adapter: YuanAdapter2) {
lifecycleScope.launch(Dispatchers.IO) {
val totalStorageSize = async { Utils.getTotalStorageSize() }.await()
val availableStorageSize = async { Utils.getAvailableStorageSize() }.await()
val usedStorageSize = totalStorageSize - availableStorageSize
val totalStorage = Utils.getSizeFormat(totalStorageSize)
val usedStorage = Utils.getSizeFormat(usedStorageSize)
val percent = (usedStorageSize * 100 / totalStorageSize).toInt()
launch(Dispatchers.Main) {
adapter.submitList(
listOf(arrayOf(usedStorage, totalStorage, "$percent"))
)
}
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main package com.base.appzxhy.ui.main
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.bean.HomeTabUIBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.ActivityMainBinding import com.base.appzxhy.databinding.ActivityMainBinding
import com.base.appzxhy.databinding.ItemHomeTabBinding
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) { class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
private val fragmentList = listOf(
HomeFragment(),
RecoveryFragment(),
SettingsFragment()
)
private val viewPagerAdapter by lazy {
object : FragmentStateAdapter(this) {
override fun getItemCount(): Int = fragmentList.size
override fun createFragment(position: Int): Fragment = fragmentList[position]
}
}
override fun initView() {
super.initView()
initTab()
initViewPager2()
AdsMgr.showBanner(binding.flBanner, false)
}
private fun initViewPager2() {
binding.viewPager2.adapter = viewPagerAdapter
binding.viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
val defaultTab = binding.tabLayout.getTabAt(position)
defaultTab?.select()
defaultTab?.setSelected()
}
})
}
private fun initTab() {
arrayOf(
HomeTabUIBean(R.drawable.tab_home_selector, getString(R.string.home)),
HomeTabUIBean(R.drawable.tab_recovery_selector, getString(R.string.recovery)),
HomeTabUIBean(R.drawable.tab_settings_selector, getString(R.string.settings)),
).forEachIndexed { index, homeTab ->
val tab = binding.tabLayout.newTab()
val view = LayoutInflater.from(this).inflate(R.layout.item_home_tab, null)
val tabBinding = ItemHomeTabBinding.bind(view)
tabBinding.ivIcon.setImageResource(homeTab.icon)
tabBinding.tvTab.text = homeTab.tab
// tabBinding.tvTab.setTextColor(ContextCompat.getColor(this, R.color.color_tab_home))
tab.customView = tabBinding.root
tab.id = index
if (index == 1) {
tabBinding.vDian.visibility = View.VISIBLE
} else {
tabBinding.vDian.visibility = View.GONE
}
binding.tabLayout.addTab(tab)
}
binding.tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
tab?.let {
if (binding.viewPager2.currentItem == tab.id) return
binding.viewPager2.setCurrentItem(tab.id, false)
}
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
tab?.setUnselected()
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
}
fun TabLayout.Tab.setSelected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab)
textView?.setTextColor(
ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)
)
}
fun TabLayout.Tab.setUnselected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab)
textView?.setTextColor(Color.parseColor("#999999"))
}
} }
\ No newline at end of file
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentRecoveryBinding
class RecoveryFragment : BaseFragment<FragmentRecoveryBinding>(FragmentRecoveryBinding::inflate) {
override fun initView() {
super.initView()
}
override fun initListener() {
super.initListener()
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentSettingsBinding
class SettingsFragment : BaseFragment<FragmentSettingsBinding>(FragmentSettingsBinding::inflate) {
override fun initView() {
super.initView()
}
override fun initListener() {
super.initListener()
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.appzxhy.BuildConfig
import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemYuan2Binding
import com.base.appzxhy.utils.XmlEx.inflate
import com.chad.library.adapter4.BaseQuickAdapter
import kotlin.random.Random
class YuanAdapter2 : BaseQuickAdapter<Array<String>, YuanAdapter2.AAA>() {
var cleanClick: (() -> Unit)? = null
inner class AAA(view: View) : ViewHolder(view)
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: AAA, position: Int, item: Array<String>?) {
item ?: return
val binding = ItemYuan2Binding.bind(holder.itemView)
if (BuildConfig.DEBUG) {
binding.tvCleanSize.text = "%.2f".format(Random.nextFloat() * Random.nextInt(1, 10))
binding.tvCleanSizeUnit.text = "GB Found"
}
binding.tvSize2.text = item[0]
binding.tvSize1.text = item[1]
binding.fl.setOnClickListener {
cleanClick?.invoke()
}
binding.tvClean.setOnClickListener {
cleanClick?.invoke()
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): AAA {
return AAA(R.layout.item_yuan_2.inflate(parent))
}
}
\ No newline at end of file
package com.base.appzxhy.utils
import android.app.ActivityManager
import android.content.Context
import android.os.Environment
import android.os.StatFs
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
object Utils {
fun toDate(): String {
val formatter = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
return formatter.format(Date())
}
fun Context.dpToPx(dp: Int): Float {
val density = resources.displayMetrics.density
return dp * density
}
fun getSizeTwoDecimalPlace(bytes: Long): String {
val value = getSize(bytes)
val formattedNumber = String.format("%.2f", value[0])
return formattedNumber + value[1]
}
fun getSizeFormat(bytes: Long): String {
if (bytes == 0.toLong()) return "0 B"
val value = getSize(bytes)
val formattedNumber = String.format("%.1f", value[0])
return formattedNumber + value[1]
}
fun getSizeArray(bytes: Long): Array<String> {
val value = getSizeFormat(bytes)
val size = value.substring(0, value.indexOf(" "))
val unit = value.substring(value.indexOf(" ") + 1)
return arrayOf(size, unit)
}
fun getSize(bytes: Long): Array<Any> {
val value: Double
val unit: String
if (bytes.toDouble() < 1024) {
value = bytes.toDouble()
unit = " B"
} else if (bytes.toDouble() < 1024 * 1024) {
value = bytes.toDouble() / 1024
unit = " KB"
} else if (bytes.toDouble() < 1024 * 1024 * 1024) {
value = bytes.toDouble() / (1024 * 1024)
unit = " MB"
} else {
value = bytes.toDouble() / (1024 * 1024 * 1024)
unit = " GB"
}
return arrayOf(value, unit)
}
fun divide(dividend: Int, divisor: Int): String {
val bigDecimalDividend = BigDecimal(dividend)
val bigDecimalDivisor = BigDecimal(divisor)
// 执行除法操作,并保留一位小数,不四舍五入
val result = bigDecimalDividend.divide(bigDecimalDivisor, 1, RoundingMode.DOWN)
// 将结果转换回Double
return result.toString()
}
fun getMemoryTotal(context: Context): Long {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
return memoryInfo.totalMem
}
fun getMemoryAvailable(context: Context): Long {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
return memoryInfo.availMem
}
fun getTotalStorageSize(): Long {
try {
val statFs = StatFs(Environment.getExternalStorageDirectory().path)
val statFs2 = StatFs(Environment.getRootDirectory().path)
val blockSizeLong =
statFs2.blockSizeLong * statFs2.blockCountLong + statFs.blockSizeLong * statFs.blockCountLong
return calculateTotalStorage(blockSizeLong)
} catch (e: Exception) {
return 0
}
}
fun getAvailableStorageSize(): 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 calculateAvailableStorage(blackSize)
} catch (e: Exception) {
return 0
}
}
private fun calculateTotalStorage(size: Long): Long {
var powerOfTwo: Long = 1
while (powerOfTwo < size) {
powerOfTwo *= 2
}
return powerOfTwo
}
private fun calculateAvailableStorage(size: Long): Long {
var value = size
var n = 0
while (true) {
val m: Long = 1000
if (value < m) {
break
}
value /= m
n++
}
for (i in 0 until n) {
value *= 1024
}
return value
}
fun Int.inflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F3F5F7" />
<corners android:radius="61dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F8F9FA" />
<corners android:radius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFE3E56" />
<corners android:radius="90dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/tab_home_s" android:state_selected="true" />
<item android:drawable="@drawable/tab_home_n" android:state_selected="false" />
</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/tab_recovery_s" android:state_selected="true" />
<item android:drawable="@drawable/tab_recovery_n" android:state_selected="false" />
</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/tab_setting_s" android:state_selected="true" />
<item android:drawable="@drawable/tab_setting_n" android:state_selected="false" />
</selector>
\ No newline at end of file
...@@ -2,49 +2,58 @@ ...@@ -2,49 +2,58 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/flBottom"
app:layout_constraintTop_toTopOf="parent">
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2" android:id="@+id/viewPager2"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
app:layout_constraintBottom_toTopOf="@id/fl_tab" android:overScrollMode="never"
app:layout_constraintTop_toTopOf="parent" /> android:scrollbars="none" />
</FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/fl_tab" android:id="@+id/flBottom"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="60dp" android:layout_marginBottom="60dp"
app:layout_constraintBottom_toBottomOf="parent"> app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_container">
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout" android:id="@+id/tabLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@color/white"
app:tabIndicatorHeight="0dp" app:tabIndicatorHeight="0dp"
app:tabMaxWidth="200dp"
app:tabMinWidth="100dp" app:tabMinWidth="100dp"
app:tabMode="fixed" app:tabMode="fixed"
app:tabRippleColor="@android:color/transparent" app:tabRippleColor="@android:color/transparent"
tools:ignore="SpeakableTextPresentCheck" /> tools:ignore="SpeakableTextPresentCheck" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="#F5F5F5" />
</FrameLayout> </FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/fl_banner" android:id="@+id/flBanner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
app:layout_constraintBottom_toBottomOf="parent"> android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
tools:ignore="ContentDescription" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:paddingVertical="15dp"
android:text="@string/file_recovery"
android:textColor="#000000"
android:textSize="19sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivVips"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:src="@drawable/h_vip_s"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tv_app_name"
app:layout_constraintStart_toEndOf="@id/tv_app_name"
app:layout_constraintTop_toTopOf="@id/tv_app_name" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivVip"
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:layout_marginEnd="14dp"
android:src="@drawable/h_vip"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tv_app_name"
app:layout_constraintEnd_toStartOf="@id/ll_weather"
app:layout_constraintTop_toTopOf="@id/tv_app_name" />
<LinearLayout
android:id="@+id/ll_weather"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_f3f5f7_61"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="@id/tv_app_name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_app_name">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:layout_marginEnd="2dp"
android:includeFontPadding="false"
android:text="20"
android:textColor="#000000"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp"
android:includeFontPadding="false"
android:text="℃"
android:textColor="#000000"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<ImageView
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="9dp"
android:src="@drawable/tianqi"
tools:ignore="ContentDescription" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:overScrollMode="never"
android:paddingHorizontal="8dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_app_name" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.RecoveryFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.SettingsFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager">
</androidx.recyclerview.widget.RecyclerView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="6dp"
android:background="@drawable/bg_f8f9fa_15">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_icon"
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:layout_marginVertical="20dp"
android:layout_marginStart="18dp"
android:src="@drawable/h_junkclean"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="22dp"
android:layout_marginEnd="8dp"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_more"
app:layout_constraintStart_toEndOf="@id/iv_icon"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:src="@drawable/icon_right_tool"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ 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"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="6dp"
android:layout_marginVertical="12dp"
android:background="@drawable/bg_f8f9fa_15"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_icon"
android:layout_width="@dimen/dp_30"
android:layout_height="@dimen/dp_30"
android:layout_gravity="center_horizontal"
android:layout_marginTop="12dp"
android:src="@drawable/h_junkclean" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:layout_marginBottom="15dp"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/vDian"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"
tools:src="@mipmap/ic_launcher" />
<View
android:id="@+id/vDian"
android:layout_width="6dp"
android:layout_height="6dp"
android:layout_gravity="end|top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/tv_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="3dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:textColor="#838383"
android:textSize="13sp" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="18dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/ivYuan"
android:layout_width="@dimen/dp_180"
android:layout_height="@dimen/dp_180"
android:src="@drawable/h_yuan"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tvCleanSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Clean"
android:textColor="#ffffff"
android:textSize="32sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tvCleanSizeUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textColor="#ffffff"
tools:ignore="HardcodedText"
tools:text="GB Found" />
</LinearLayout>
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="19dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/fl"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/fl"
app:layout_constraintTop_toTopOf="@id/fl">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_gravity="center_vertical"
app:cardBackgroundColor="#FF9ADCFF"
app:cardCornerRadius="2dp"
app:cardElevation="0dp" />
<TextView
android:id="@+id/tvSize1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:text="0"
android:textColor="#000000"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginTop="40dp">
<androidx.cardview.widget.CardView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_gravity="center_vertical"
app:cardBackgroundColor="#FF3A81FF"
app:cardCornerRadius="2dp"
app:cardElevation="0dp" />
<TextView
android:id="@+id/tvSize2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="15dp"
android:text="0"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tvClean"
android:layout_width="269dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="24dp"
android:background="@drawable/bg_fe3e56_90"
android:gravity="center"
android:text="Clean Up"
android:textColor="#ffffff"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -14,4 +14,5 @@ ...@@ -14,4 +14,5 @@
<dimen name="sp_16">16sp</dimen> <dimen name="sp_16">16sp</dimen>
<dimen name="sp_12">12sp</dimen> <dimen name="sp_12">12sp</dimen>
<dimen name="dp_8">8dp</dimen> <dimen name="dp_8">8dp</dimen>
<dimen name="dp_180">180dp</dimen>
</resources> </resources>
\ No newline at end of file
<resources> <resources>
<string name="app_name">AppName</string> <string name="app_name">AppName</string>
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="facebook_app_id">4512448902756291</string> <string name="facebook_app_id">4512448902756291</string>
<string name="preparing_advertisement">Preparing advertisement</string> <string name="preparing_advertisement">Preparing advertisement</string>
...@@ -19,7 +20,19 @@ Please rest assured that we will handle your information in strict accordance wi ...@@ -19,7 +20,19 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="document">Document</string> <string name="document">Document</string>
<string name="video">Video</string> <string name="video">Video</string>
<string name="continue_">Continue</string> <string name="continue_">Continue</string>
<!-- TODO: Remove or change this placeholder text --> <string name="file_recovery">File Recovery</string>
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="junk_clean">Junk Clean</string>
<string name="battery_info">Battery Info</string>
<string name="screenshot_clean">Screenshot Clean</string>
<string name="app_manager">App Manager</string>
<string name="large_file_clean">Large File Clean</string>
<string name="photo_compression">Photo Compression</string>
<string name="similar_photos">Similar Photos</string>
<string name="home">Home</string>
<string name="recovery">Recovery</string>
<string name="settings">Settings</string>
</resources> </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