Commit 0005e330 authored by wanglei's avatar wanglei

...

parent c822423f
......@@ -76,6 +76,21 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
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
implementation("com.airbnb.android:lottie:6.4.0")
implementation("com.github.bumptech.glide:glide:4.16.0")
......
package com.base.browserwhite.bean
data class DownloadBean(
val downloadId: Long = 0,
val path: String = "",
var downloadId: Long = -1L,
var path: String = "",
val uri: String = "",
val time: String = "",
) {
var state: Int = -1
var progress: Int = -1
var name: String = ""
var isTime: Boolean = false
var uiType: Int = 1
}
\ No newline at end of file
......@@ -6,30 +6,16 @@ import android.os.Build
import android.os.Environment
import android.os.StatFs
import android.os.storage.StorageManager
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isEmpty
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
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.ui.fragment.FileFragment
import com.base.browserwhite.ui.fragment.HomeFragment
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
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
class MainActivity : BaseActivity<ActivityMainBinding>() {
......@@ -77,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
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
import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.bean.DownloadBean
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.views.DialogViews.showDownloadVideoDialog
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.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import org.json.JSONArray
import kotlin.random.Random
......@@ -31,7 +36,7 @@ import kotlin.random.Random
class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
private val TAG = "WebViewFragment"
private var job: Job? = null
private var progressJob: Job? = null
var url: String = ""
private val downloadList = arrayListOf<DownloadBean>()
......@@ -68,7 +73,37 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
reloadWebView()
}
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>() {
LogEx.logDebug(TAG, "onPageFinished")
super.onPageFinished(view, url)
onPageFinished?.invoke(url)
job?.cancel()
}
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
LogEx.logDebug(TAG, "onReceivedSslError")
super.onReceivedSslError(view, handler, error)
job?.cancel()
binding.webView.visibility = View.GONE
binding.llError.visibility = View.GONE
if (error != null) {
......
......@@ -19,6 +19,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
inner class DownloadViewHolder(view: View) : ViewHolder(view)
var downloadAction: ((item: DownloadBean) -> Unit)? = null
override fun onBindViewHolder(holder: DownloadViewHolder, position: Int, item: DownloadBean?) {
if (item == null) return
val context = holder.itemView.context
......@@ -35,6 +37,9 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
val binding = ItemDownloadCardBinding.bind(holder.itemView)
Glide.with(context).load(item.uri).centerCrop().into(binding.iv)
binding.tvName.text = item.uri.split("/").last()
binding.ivDownload.setOnClickListener {
downloadAction?.invoke(item)
}
}
}
......
......@@ -8,11 +8,9 @@ import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ActivityWebDownloadGuideBinding
import com.base.browserwhite.databinding.FragmentFileBinding
import com.base.browserwhite.ui.activity.MainActivity
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.mediabrowser.MediaBrowserActivity
import com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
......@@ -32,9 +30,6 @@ import com.base.browserwhite.utils.MediaStoreUtils.getMediaZipCountSize
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.io.File
......@@ -127,7 +122,10 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
})
}
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
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
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.bean.ConstObject.BAIDU
import com.base.browserwhite.bean.ConstObject.BING
......@@ -19,17 +25,21 @@ import com.base.browserwhite.bean.ConstObject.YAHOO
import com.base.browserwhite.bean.ConstObject.YANDEX
import com.base.browserwhite.bean.DownloadBean
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.DialogMediaMoreBinding
import com.base.browserwhite.databinding.DialogMyAccountBinding
import com.base.browserwhite.databinding.DialogPermissonOpenBinding
import com.base.browserwhite.databinding.DialogSearchEngineBinding
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.XmlEx.inflate
import com.bumptech.glide.Glide
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
object DialogViews {
@SuppressLint("SetTextI18n")
......@@ -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 dialog = BottomSheetDialog(this)
val binding = DialogDownloadVideoBinding.inflate(LayoutInflater.from(this))
......@@ -236,6 +250,12 @@ object DialogViews {
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val adapter = DownloadAdapter()
adapter.downloadAction = { item: DownloadBean ->
dialog.dismiss()
showDownloadConfirmDialog(item) {
download.invoke(item)
}
}
binding.rv.adapter = adapter
adapter.submitList(list)
......@@ -246,7 +266,74 @@ object DialogViews {
binding.rv.layoutParams.height = recyclerViewHeight
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
object VideoDownloader {
//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 fileName = uri.split("/").last()
var fileName = uri.split("/").last()
if (name.isNotEmpty()) {
fileName = name
}
// 创建一个DownloadManager.Request对象
......@@ -27,7 +30,7 @@ object VideoDownloader {
request.setDescription("Downloading $fileName")
// 设置通知栏的可见性
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
// 设置下载的文件类型
request.setMimeType("video/mp4")
......@@ -50,9 +53,13 @@ object VideoDownloader {
fun queryDownloadProgress(
context: Context,
downloadId: Long,
uiAction: (progress: Int) -> Uri,
noRunningAction: (status: Int) -> Uri
uiAction: (progress: Int) -> Unit,
noRunningAction: (status: Int) -> Unit
) {
if (downloadId == -1L) {
return noRunningAction.invoke(-1)
}
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 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<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>
\ 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 @@
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="18sp"
tools:text="1796-21.mp4" />
......@@ -71,11 +73,37 @@
android:layout_marginEnd="10dp">
<ImageView
android:id="@+id/iv_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/xiazhai"
android:visibility="gone"
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>
......
<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