Commit 0005e330 authored by wanglei's avatar wanglei

...

parent c822423f
...@@ -76,6 +76,21 @@ dependencies { ...@@ -76,6 +76,21 @@ dependencies {
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
//广告
implementation("com.google.android.gms:play-services-ads:23.1.0")
implementation("com.google.ads.mediation:applovin:12.4.3.0")
implementation("com.google.ads.mediation:facebook:6.17.0.0")
implementation("com.google.ads.mediation:mintegral:16.7.21.0")
implementation("com.google.ads.mediation:pangle:5.9.0.4.0")
//max
implementation("com.applovin:applovin-sdk:+")
// implementation("com.applovin.mediation:google-adapter:+")
// implementation("com.applovin.mediation:facebook-adapter:+")
// implementation("com.applovin.mediation:mintegral-adapter:+")
// implementation("com.applovin.mediation:bytedance-adapter:+")
// implementation("com.applovin.mediation:ironsource-adapter:+")
//第三方UI //第三方UI
implementation("com.airbnb.android:lottie:6.4.0") implementation("com.airbnb.android:lottie:6.4.0")
implementation("com.github.bumptech.glide:glide:4.16.0") implementation("com.github.bumptech.glide:glide:4.16.0")
......
package com.base.browserwhite.bean package com.base.browserwhite.bean
data class DownloadBean( data class DownloadBean(
val downloadId: Long = 0, var downloadId: Long = -1L,
val path: String = "", var path: String = "",
val uri: String = "", val uri: String = "",
val time: String = "", val time: String = "",
) { ) {
var state: Int = -1
var progress: Int = -1
var name: String = ""
var isTime: Boolean = false var isTime: Boolean = false
var uiType: Int = 1 var uiType: Int = 1
} }
\ No newline at end of file
...@@ -6,30 +6,16 @@ import android.os.Build ...@@ -6,30 +6,16 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.StatFs import android.os.StatFs
import android.os.storage.StorageManager import android.os.storage.StorageManager
import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isEmpty
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.R
import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ActivityMainBinding import com.base.browserwhite.databinding.ActivityMainBinding
import com.base.browserwhite.ui.fragment.FileFragment import com.base.browserwhite.ui.fragment.FileFragment
import com.base.browserwhite.ui.fragment.HomeFragment import com.base.browserwhite.ui.fragment.HomeFragment
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
import com.base.browserwhite.utils.BarUtils import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.VideoDownloader
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import java.io.File import java.io.File
class MainActivity : BaseActivity<ActivityMainBinding>() { class MainActivity : BaseActivity<ActivityMainBinding>() {
...@@ -77,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -77,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
} }
}) })
VideoDownloader.downloadVideo(this, "https://assets.mixkit.co/videos/4702/4702-720.mp4")
} }
......
...@@ -18,11 +18,16 @@ import android.webkit.WebViewClient ...@@ -18,11 +18,16 @@ import android.webkit.WebViewClient
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.bean.DownloadBean import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.databinding.FragmentWebViewBinding import com.base.browserwhite.databinding.FragmentWebViewBinding
import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.fragment.BaseFragment import com.base.browserwhite.ui.fragment.BaseFragment
import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.VideoDownloader
import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.json.JSONArray import org.json.JSONArray
import kotlin.random.Random import kotlin.random.Random
...@@ -31,7 +36,7 @@ import kotlin.random.Random ...@@ -31,7 +36,7 @@ import kotlin.random.Random
class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
private val TAG = "WebViewFragment" private val TAG = "WebViewFragment"
private var job: Job? = null private var progressJob: Job? = null
var url: String = "" var url: String = ""
private val downloadList = arrayListOf<DownloadBean>() private val downloadList = arrayListOf<DownloadBean>()
...@@ -68,7 +73,37 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -68,7 +73,37 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
reloadWebView() reloadWebView()
} }
binding.flDownload.setOnClickListener { binding.flDownload.setOnClickListener {
requireContext().showDownloadVideoDialog(downloadList) val adapter = requireContext().showDownloadVideoDialog(
downloadList,
download = { bean: DownloadBean ->
val pair = VideoDownloader.downloadVideo(requireContext(), bean.uri, bean.name)
bean.downloadId = pair.first
bean.path = pair.second.absolutePath
},
dismissAction = {
progressJob?.cancel()
},
)
progressJob?.cancel()
progressJob = upDataProgress(adapter)
}
}
@SuppressLint("NotifyDataSetChanged")
private fun upDataProgress(adapter: DownloadAdapter) = lifecycleScope.launch(Dispatchers.IO) {
while (isActive) {
downloadList.forEach { bean: DownloadBean ->
queryDownloadProgress(requireContext(), bean.downloadId,
uiAction = { progress ->
bean.progress = progress
},
noRunningAction = { status ->
bean.state = status
})
}
adapter.notifyDataSetChanged()
delay(1000)
} }
} }
...@@ -169,14 +204,11 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -169,14 +204,11 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
LogEx.logDebug(TAG, "onPageFinished") LogEx.logDebug(TAG, "onPageFinished")
super.onPageFinished(view, url) super.onPageFinished(view, url)
onPageFinished?.invoke(url) onPageFinished?.invoke(url)
job?.cancel()
} }
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) { override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
LogEx.logDebug(TAG, "onReceivedSslError") LogEx.logDebug(TAG, "onReceivedSslError")
super.onReceivedSslError(view, handler, error) super.onReceivedSslError(view, handler, error)
job?.cancel()
binding.webView.visibility = View.GONE binding.webView.visibility = View.GONE
binding.llError.visibility = View.GONE binding.llError.visibility = View.GONE
if (error != null) { if (error != null) {
......
...@@ -19,6 +19,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -19,6 +19,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
inner class DownloadViewHolder(view: View) : ViewHolder(view) inner class DownloadViewHolder(view: View) : ViewHolder(view)
var downloadAction: ((item: DownloadBean) -> Unit)? = null
override fun onBindViewHolder(holder: DownloadViewHolder, position: Int, item: DownloadBean?) { override fun onBindViewHolder(holder: DownloadViewHolder, position: Int, item: DownloadBean?) {
if (item == null) return if (item == null) return
val context = holder.itemView.context val context = holder.itemView.context
...@@ -35,6 +37,9 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -35,6 +37,9 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
val binding = ItemDownloadCardBinding.bind(holder.itemView) val binding = ItemDownloadCardBinding.bind(holder.itemView)
Glide.with(context).load(item.uri).centerCrop().into(binding.iv) Glide.with(context).load(item.uri).centerCrop().into(binding.iv)
binding.tvName.text = item.uri.split("/").last() binding.tvName.text = item.uri.split("/").last()
binding.ivDownload.setOnClickListener {
downloadAction?.invoke(item)
}
} }
} }
......
...@@ -8,11 +8,9 @@ import android.widget.Toast ...@@ -8,11 +8,9 @@ import android.widget.Toast
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.BuildConfig import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.MediaBean import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ActivityWebDownloadGuideBinding
import com.base.browserwhite.databinding.FragmentFileBinding import com.base.browserwhite.databinding.FragmentFileBinding
import com.base.browserwhite.ui.activity.MainActivity import com.base.browserwhite.ui.activity.MainActivity
import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity
import com.base.browserwhite.ui.activity.download.WebDownloadGuideActivity
import com.base.browserwhite.ui.activity.download.WebDownloadManagerActivity import com.base.browserwhite.ui.activity.download.WebDownloadManagerActivity
import com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity import com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
...@@ -32,9 +30,6 @@ import com.base.browserwhite.utils.MediaStoreUtils.getMediaZipCountSize ...@@ -32,9 +30,6 @@ import com.base.browserwhite.utils.MediaStoreUtils.getMediaZipCountSize
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
...@@ -127,7 +122,10 @@ class FileFragment : BaseFragment<FragmentFileBinding>() { ...@@ -127,7 +122,10 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
}) })
} }
binding.llDownload.setOnClickListener { binding.llDownload.setOnClickListener {
startActivity(Intent(requireContext(), WebDownloadManagerActivity::class.java)) // startActivity(Intent(requireContext(), WebDownloadManagerActivity::class.java))
startActivity(Intent(requireContext(), WebBrowserActivity::class.java).apply {
putExtra("url", "https://mixkit.co/free-stock-video/girl-dancing-happily-in-a-field-of-flowers-4702/")
})
} }
......
...@@ -7,9 +7,15 @@ import android.content.Context ...@@ -7,9 +7,15 @@ import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.view.Gravity import android.view.Gravity
import android.view.KeyEvent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView
import android.widget.TextView.OnEditorActionListener
import android.widget.Toast
import com.base.browserwhite.R import com.base.browserwhite.R
import com.base.browserwhite.bean.ConstObject.BAIDU import com.base.browserwhite.bean.ConstObject.BAIDU
import com.base.browserwhite.bean.ConstObject.BING import com.base.browserwhite.bean.ConstObject.BING
...@@ -19,17 +25,21 @@ import com.base.browserwhite.bean.ConstObject.YAHOO ...@@ -19,17 +25,21 @@ import com.base.browserwhite.bean.ConstObject.YAHOO
import com.base.browserwhite.bean.ConstObject.YANDEX import com.base.browserwhite.bean.ConstObject.YANDEX
import com.base.browserwhite.bean.DownloadBean import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.databinding.DialogDeleteTipBinding import com.base.browserwhite.databinding.DialogDeleteTipBinding
import com.base.browserwhite.databinding.DialogDownloadConfirmBinding
import com.base.browserwhite.databinding.DialogDownloadFinishBinding
import com.base.browserwhite.databinding.DialogDownloadVideoBinding import com.base.browserwhite.databinding.DialogDownloadVideoBinding
import com.base.browserwhite.databinding.DialogMediaMoreBinding import com.base.browserwhite.databinding.DialogMediaMoreBinding
import com.base.browserwhite.databinding.DialogMyAccountBinding import com.base.browserwhite.databinding.DialogMyAccountBinding
import com.base.browserwhite.databinding.DialogPermissonOpenBinding import com.base.browserwhite.databinding.DialogPermissonOpenBinding
import com.base.browserwhite.databinding.DialogSearchEngineBinding import com.base.browserwhite.databinding.DialogSearchEngineBinding
import com.base.browserwhite.ui.adapter.DownloadAdapter import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.XmlEx.inflate import com.bumptech.glide.Glide
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
object DialogViews { object DialogViews {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
...@@ -221,7 +231,11 @@ object DialogViews { ...@@ -221,7 +231,11 @@ object DialogViews {
} }
} }
fun Context.showDownloadVideoDialog(list: List<DownloadBean>) { fun Context.showDownloadVideoDialog(
list: List<DownloadBean>,
download: (item: DownloadBean) -> Unit,
dismissAction: () -> Unit
): DownloadAdapter {
val TAG = "DownloadVideoDialog" val TAG = "DownloadVideoDialog"
val dialog = BottomSheetDialog(this) val dialog = BottomSheetDialog(this)
val binding = DialogDownloadVideoBinding.inflate(LayoutInflater.from(this)) val binding = DialogDownloadVideoBinding.inflate(LayoutInflater.from(this))
...@@ -236,6 +250,12 @@ object DialogViews { ...@@ -236,6 +250,12 @@ object DialogViews {
behavior.state = BottomSheetBehavior.STATE_EXPANDED behavior.state = BottomSheetBehavior.STATE_EXPANDED
val adapter = DownloadAdapter() val adapter = DownloadAdapter()
adapter.downloadAction = { item: DownloadBean ->
dialog.dismiss()
showDownloadConfirmDialog(item) {
download.invoke(item)
}
}
binding.rv.adapter = adapter binding.rv.adapter = adapter
adapter.submitList(list) adapter.submitList(list)
...@@ -246,7 +266,74 @@ object DialogViews { ...@@ -246,7 +266,74 @@ object DialogViews {
binding.rv.layoutParams.height = recyclerViewHeight binding.rv.layoutParams.height = recyclerViewHeight
binding.rv.requestLayout() binding.rv.requestLayout()
} }
dialog.setOnDismissListener {
dismissAction.invoke()
}
return adapter
}
private fun Context.showDownloadConfirmDialog(item: DownloadBean, download: () -> Unit) {
val dialog = BottomSheetDialog(this)
val binding = DialogDownloadConfirmBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
Glide.with(this).load(item.uri).centerCrop().into(binding.iv)
binding.editName.setText(item.uri.split("/").last())
binding.ivEdit.setOnClickListener {
binding.editName.isEnabled = true
binding.editName.setBackgroundResource(android.R.drawable.edit_text)
binding.editName.requestFocus()
} }
binding.editName.setOnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
imm?.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT)
}
}
binding.editName.setOnEditorActionListener(object : OnEditorActionListener {
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
if (actionId == EditorInfo.IME_ACTION_DONE) {
binding.editName.isEnabled = false
binding.editName.background = null
return true
}
return false
}
})
binding.tvCancel.setOnClickListener {
dialog.dismiss()
}
binding.tvConfirm.setOnClickListener {
if (binding.editName.text.isNullOrEmpty()) {
Toast.makeText(this, "name is empty", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
item.name = binding.editName.text.toString()
dialog.dismiss()
download.invoke()
}
}
fun Context.showDownloadFinishDialog() {
val binding = DialogDownloadFinishBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root)
dialog.show()
val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_335)
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
}
} }
\ No newline at end of file
...@@ -13,10 +13,13 @@ import java.io.File ...@@ -13,10 +13,13 @@ import java.io.File
object VideoDownloader { object VideoDownloader {
//https://assets.mixkit.co/videos/4702/4702-720.mp4 //https://assets.mixkit.co/videos/4702/4702-720.mp4
fun downloadVideo(context: Context, uri: String): Pair<Long, File> { fun downloadVideo(context: Context, uri: String, name: String): Pair<Long, File> {
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val fileName = uri.split("/").last() var fileName = uri.split("/").last()
if (name.isNotEmpty()) {
fileName = name
}
// 创建一个DownloadManager.Request对象 // 创建一个DownloadManager.Request对象
...@@ -27,7 +30,7 @@ object VideoDownloader { ...@@ -27,7 +30,7 @@ object VideoDownloader {
request.setDescription("Downloading $fileName") request.setDescription("Downloading $fileName")
// 设置通知栏的可见性 // 设置通知栏的可见性
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
// 设置下载的文件类型 // 设置下载的文件类型
request.setMimeType("video/mp4") request.setMimeType("video/mp4")
...@@ -50,9 +53,13 @@ object VideoDownloader { ...@@ -50,9 +53,13 @@ object VideoDownloader {
fun queryDownloadProgress( fun queryDownloadProgress(
context: Context, context: Context,
downloadId: Long, downloadId: Long,
uiAction: (progress: Int) -> Uri, uiAction: (progress: Int) -> Unit,
noRunningAction: (status: Int) -> Uri noRunningAction: (status: Int) -> Unit
) { ) {
if (downloadId == -1L) {
return noRunningAction.invoke(-1)
}
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
// 创建查询对象 // 创建查询对象
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#CEE2FB" />
<corners android:radius="18dp" />
</shape>
\ No newline at end of file
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/bofang" android:state_selected="false" /> <item android:drawable="@mipmap/bofang" android:state_selected="false" />
<item android:drawable="@mipmap/zanting" android:state_selected="true" /> <item android:drawable="@mipmap/zanting_download" android:state_selected="true" />
</selector> </selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<!-- <stroke-->
<!-- android:width="1px"-->
<!-- android:color="#FF3835" />-->
<solid android:color="#E8E8F1" />
<corners android:radius="10dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%">
<shape>
<corners android:radius="10dp" />
<solid android:color="#0571ED" />
</shape>
</scale>
</item>
</layer-list>
\ 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:background="@drawable/bg_edf1f4_tlr15">
<View
android:id="@+id/v"
android:layout_width="80dp"
android:layout_height="6dp"
android:layout_marginTop="12dp"
android:background="@drawable/bg_c2c8d4_3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="28dp"
android:text="Download or not?"
android:textColor="@color/black"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v"
tools:ignore="HardcodedText" />
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="85dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="16dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:layout_constraintTop_toBottomOf="@id/tv_tip">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
app:cardCornerRadius="5dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_gravity="center"
android:src="@mipmap/t_videoicon" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="10dp"
android:layout_weight="1"
android:orientation="vertical">
<EditText
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:enabled="false"
android:imeOptions="actionDone"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="18sp"
tools:ignore="Autofill,LabelFor,TextFields"
tools:text="1796-21.mp4" />
<TextView
android:id="@+id/tv_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:textColor="#6F6F70"
android:textSize="12sp"
tools:text="50.2 KB" />
</LinearLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp">
<ImageView
android:id="@+id/iv_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/bianji"
tools:ignore="ContentDescription" />
</FrameLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginBottom="25dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/card">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="166dp"
android:layout_height="50dp"
android:background="@drawable/bg_e1e4e9_25"
android:gravity="center"
android:text="Cancel"
android:textColor="@color/black"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="166dp"
android:layout_height="50dp"
android:layout_marginStart="10dp"
android:background="@drawable/bg_0571ed_25"
android:gravity="center"
android:text="Confirm"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?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="345dp"
android:layout_height="345dp"
android:layout_margin="5dp"
app:cardCornerRadius="15dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:layout_marginTop="25dp"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:src="@mipmap/wancheng_download"
tools:ignore="ContentDescription" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="video_preview_h2…"
android:textColor="#010101"
android:textSize="18sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="358KB"
android:textColor="#6F6F70"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:layout_width="80dp"
android:layout_height="36dp"
android:layout_gravity="center_vertical|end"
android:background="@drawable/bg_cee2fb_18"
android:gravity="center"
android:text="Play"
android:textColor="#0672EE"
tools:ignore="HardcodedText" />
</LinearLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="175dp"
android:layout_marginTop="20dp">
<include layout="@layout/layout_native_admob_download" />
</FrameLayout>
<TextView
android:id="@+id/tv_download"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="15dp"
android:background="@drawable/bg_0571ed_25"
android:gravity="center"
android:text="Download"
android:textColor="@color/white"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
...@@ -49,6 +49,8 @@ ...@@ -49,6 +49,8 @@
android:id="@+id/tv_name" android:id="@+id/tv_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="18sp" android:textSize="18sp"
tools:text="1796-21.mp4" /> tools:text="1796-21.mp4" />
...@@ -71,11 +73,37 @@ ...@@ -71,11 +73,37 @@
android:layout_marginEnd="10dp"> android:layout_marginEnd="10dp">
<ImageView <ImageView
android:id="@+id/iv_download"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@mipmap/xiazhai" android:src="@mipmap/xiazhai"
android:visibility="gone"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<FrameLayout
android:id="@+id/fl_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="35dp"
android:layout_height="35dp"
android:indeterminate="false"
android:max="100"
android:progressDrawable="@drawable/progress_bar_clean"
tools:progress="50" />
<ImageView
android:id="@+id/iv_xiazai_zantin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/xiazhaiz_download"
tools:ignore="ContentDescription" />
</FrameLayout>
</FrameLayout> </FrameLayout>
......
<com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:baselineAligned="false"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="#FF923E"
android:padding="2dp"
android:text="Ad"
android:textColor="@color/white"
android:textSize="12sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center_vertical"
android:layout_marginVertical="10dp" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ad_call_to_action"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_gravity="center_vertical"
android:background="@drawable/bg_0571ed_25"
android:gravity="center"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="15sp"
tools:text="Install" />
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
\ 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