Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
B
Browser White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Browser White
Commits
acf8af8f
Commit
acf8af8f
authored
Aug 28, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
bf7b8d56
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
406 additions
and
148 deletions
+406
-148
AdmobMaxHelper.kt
...src/main/java/com/base/browserwhite/ads/AdmobMaxHelper.kt
+8
-2
AdmobNativeUtils.kt
.../java/com/base/browserwhite/ads/admob/AdmobNativeUtils.kt
+7
-0
ConstObject.kt
app/src/main/java/com/base/browserwhite/bean/ConstObject.kt
+10
-0
MainActivity.kt
...in/java/com/base/browserwhite/ui/activity/MainActivity.kt
+0
-3
QrcResultActivity.kt
...ase/browserwhite/ui/activity/scanqrc/QrcResultActivity.kt
+51
-1
ScanQRCActivity.kt
.../base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
+1
-1
WebBrowserActivity.kt
...browserwhite/ui/activity/webbrowser/WebBrowserActivity.kt
+35
-18
HomeFragment.kt
...in/java/com/base/browserwhite/ui/fragment/HomeFragment.kt
+13
-118
ClipboardUtils.kt
...c/main/java/com/base/browserwhite/utils/ClipboardUtils.kt
+19
-0
LinkSearchUtils.kt
.../main/java/com/base/browserwhite/utils/LinkSearchUtils.kt
+133
-0
activity_qrc_result.xml
app/src/main/res/layout/activity_qrc_result.xml
+26
-4
item_news.xml
app/src/main/res/layout/item_news.xml
+2
-1
layout_admob_native_qrcr.xml
app/src/main/res/layout/layout_admob_native_qrcr.xml
+101
-0
No files found.
app/src/main/java/com/base/browserwhite/ads/AdmobMaxHelper.kt
View file @
acf8af8f
...
@@ -116,12 +116,18 @@ object AdmobMaxHelper {
...
@@ -116,12 +116,18 @@ object AdmobMaxHelper {
}
}
}
}
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
Int
=
0
)
{
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
String
=
""
)
{
if
(
isBlack
)
{
if
(
isBlack
)
{
return
return
}
}
if
(
getSpAdmobTrueMaxFalse
())
{
if
(
getSpAdmobTrueMaxFalse
())
{
AdmobNativeUtils
.
showNativeAd
(
activity
,
parent
)
var
layout
=
R
.
layout
.
layout_admob_native_custom
when
(
where
)
{
"QrcResultActivity"
->
layout
=
R
.
layout
.
layout_admob_native_qrcr
}
AdmobNativeUtils
.
showNativeAd
(
activity
,
parent
,
layout
)
}
else
{
}
else
{
var
layout
=
R
.
layout
.
layout_max_native_small
var
layout
=
R
.
layout
.
layout_max_native_small
// if (where == 0) {
// if (where == 0) {
...
...
app/src/main/java/com/base/browserwhite/ads/admob/AdmobNativeUtils.kt
View file @
acf8af8f
...
@@ -29,6 +29,7 @@ object AdmobNativeUtils {
...
@@ -29,6 +29,7 @@ object AdmobNativeUtils {
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
var
onAdLoaded
:
(()
->
Unit
)?
=
null
private
fun
loadNativeAd
()
{
private
fun
loadNativeAd
()
{
if
(
nativeAd
!=
null
)
{
if
(
nativeAd
!=
null
)
{
...
@@ -61,6 +62,12 @@ object AdmobNativeUtils {
...
@@ -61,6 +62,12 @@ object AdmobNativeUtils {
pullAd
(
it
.
responseInfo
,
"nativeAd"
,
reqId
=
reqId
)
pullAd
(
it
.
responseInfo
,
"nativeAd"
,
reqId
=
reqId
)
it
.
setOnPaidEventListener
(
AdmobEvent
.
EventOnPaidEventListener
(
it
))
it
.
setOnPaidEventListener
(
AdmobEvent
.
EventOnPaidEventListener
(
it
))
}.
withAdListener
(
object
:
AdListener
()
{
}.
withAdListener
(
object
:
AdListener
()
{
override
fun
onAdLoaded
()
{
super
.
onAdLoaded
()
onAdLoaded
?.
invoke
()
onAdLoaded
=
null
}
override
fun
onAdClicked
()
{
override
fun
onAdClicked
()
{
clickAd
(
nativeAd
?.
responseInfo
,
"nativeAd"
)
clickAd
(
nativeAd
?.
responseInfo
,
"nativeAd"
)
}
}
...
...
app/src/main/java/com/base/browserwhite/bean/ConstObject.kt
View file @
acf8af8f
...
@@ -51,4 +51,14 @@ object ConstObject {
...
@@ -51,4 +51,14 @@ object ConstObject {
field
=
value
field
=
value
AppPreferences
.
getInstance
().
put
(
"ifAgreePrivacy"
,
value
,
true
)
AppPreferences
.
getInstance
().
put
(
"ifAgreePrivacy"
,
value
,
true
)
}
}
var
searchEngineSp
=
"GOOGLE"
get
()
{
return
AppPreferences
.
getInstance
().
getString
(
"searchEngine"
,
field
)
}
set
(
value
)
{
field
=
value
AppPreferences
.
getInstance
().
put
(
"searchEngine"
,
value
,
true
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/activity/MainActivity.kt
View file @
acf8af8f
...
@@ -14,9 +14,6 @@ import androidx.fragment.app.Fragment
...
@@ -14,9 +14,6 @@ import androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
androidx.viewpager2.widget.ViewPager2
import
com.base.browserwhite.databinding.ActivityMainBinding
import
com.base.browserwhite.databinding.ActivityMainBinding
import
com.base.browserwhite.help.WeatherUtils
import
com.base.browserwhite.ui.activity.scanqrc.QRImageAnalyzer
import
com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
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
...
...
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/QrcResultActivity.kt
View file @
acf8af8f
package
com.base.browserwhite.ui.activity.scanqrc
package
com.base.browserwhite.ui.activity.scanqrc
import
android.content.Intent
import
android.graphics.Color
import
android.graphics.Color
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.view.updatePadding
import
com.base.browserwhite.ads.AdmobMaxHelper
import
com.base.browserwhite.ads.admob.AdmobNativeUtils
import
com.base.browserwhite.bean.ConstObject.searchEngineSp
import
com.base.browserwhite.databinding.ActivityQrcResultBinding
import
com.base.browserwhite.databinding.ActivityQrcResultBinding
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.ClipboardUtils.copyText
import
com.base.browserwhite.utils.LinkSearchUtils
import
com.base.browserwhite.utils.LinkSearchUtils.getSearchUrl
class
QrcResultActivity
:
BaseActivity
<
ActivityQrcResultBinding
>()
{
class
QrcResultActivity
:
BaseActivity
<
ActivityQrcResultBinding
>()
{
...
@@ -13,10 +23,19 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
...
@@ -13,10 +23,19 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
ActivityQrcResultBinding
.
inflate
(
layoutInflater
)
ActivityQrcResultBinding
.
inflate
(
layoutInflater
)
}
}
private
var
qrCodeValue
:
String
?
=
null
override
fun
initView
()
{
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
WHITE
)
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
qrCodeValue
=
intent
.
extras
?.
getString
(
"qrCodeValue"
)
binding
.
tvQrcodevalue
.
text
=
qrCodeValue
AdmobMaxHelper
.
admobMaxShowNativeAd
(
this
,
binding
.
flAd
,
"QrcResultActivity"
)
AdmobNativeUtils
.
onAdLoaded
=
{
binding
.
line2
.
visibility
=
View
.
VISIBLE
}
}
}
override
fun
initListener
()
{
override
fun
initListener
()
{
...
@@ -28,6 +47,37 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
...
@@ -28,6 +47,37 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
onBackPressedDispatcher
.
onBackPressed
()
onBackPressedDispatcher
.
onBackPressed
()
}
}
binding
.
llCopy
.
setOnClickListener
{
copyText
(
"qrCodeValue"
,
qrCodeValue
?:
""
)
Toast
.
makeText
(
this
,
"copy to clipboard"
,
Toast
.
LENGTH_SHORT
).
show
()
}
binding
.
llSearch
.
setOnClickListener
{
LinkSearchUtils
.
handleInput
(
qrCodeValue
?:
""
,
loadUrl
=
{
url
->
startActivity
(
Intent
(
this
,
WebBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"url"
,
url
)
putExtra
(
"searchEngine"
,
searchEngineSp
)
})
},
performSearch
=
{
search
->
startActivity
(
Intent
(
this
,
WebBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"url"
,
getSearchUrl
(
search
))
putExtra
(
"searchEngine"
,
searchEngineSp
)
})
})
}
binding
.
llShare
.
setOnClickListener
{
try
{
val
shareIntent
=
Intent
(
Intent
.
ACTION_SEND
)
shareIntent
.
setType
(
"text/plain"
)
shareIntent
.
putExtra
(
Intent
.
EXTRA_TEXT
,
qrCodeValue
)
startActivity
(
Intent
.
createChooser
(
shareIntent
,
"share text"
))
}
catch
(
e
:
Exception
)
{
Toast
.
makeText
(
this
,
"no app can show"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
View file @
acf8af8f
...
@@ -156,7 +156,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
...
@@ -156,7 +156,7 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
// imageCapture = buildImageCapture(aspectRation, rotation)
// imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer
=
QRImageAnalyzer
()
qrImageAnalyzer
=
QRImageAnalyzer
()
qrImageAnalyzer
.
parseAction
=
{
qrCodeValue
,
valueType
->
qrImageAnalyzer
.
parseAction
=
{
qrCodeValue
,
valueType
->
// startActivity(Intent(this
))
startActivity
(
Intent
(
this
,
QrcResultActivity
::
class
.
java
).
putExtra
(
"qrCodeValue"
,
qrCodeValue
))
}
}
//构建图片分析器
//构建图片分析器
...
...
app/src/main/java/com/base/browserwhite/ui/activity/webbrowser/WebBrowserActivity.kt
View file @
acf8af8f
...
@@ -14,9 +14,16 @@ import com.base.browserwhite.bean.ConstObject
...
@@ -14,9 +14,16 @@ import com.base.browserwhite.bean.ConstObject
import
com.base.browserwhite.bean.ConstObject.GOOGLE
import
com.base.browserwhite.bean.ConstObject.GOOGLE
import
com.base.browserwhite.databinding.ActivityWebBrowserBinding
import
com.base.browserwhite.databinding.ActivityWebBrowserBinding
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.fragment.HomeFragment
import
com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
import
com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.LinkSearchUtils.getBaiduSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getBingSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getDuckDuckGoSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getGoogleSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getSearchUrl
import
com.base.browserwhite.utils.LinkSearchUtils.getYahooSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getYandexSearch
import
com.base.browserwhite.utils.LinkSearchUtils.handleInput
class
WebBrowserActivity
:
BaseActivity
<
ActivityWebBrowserBinding
>()
{
class
WebBrowserActivity
:
BaseActivity
<
ActivityWebBrowserBinding
>()
{
...
@@ -26,7 +33,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
...
@@ -26,7 +33,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
}
}
private
val
fragmentList
=
arrayListOf
<
Fragment
>()
private
val
fragmentList
=
arrayListOf
<
Fragment
>()
private
var
currentFragment
:
WebViewFragment
?
=
null
private
var
currentFragment
:
WebViewFragment
?
=
null
private
var
searchAction
:
(
context
:
String
)
->
String
=
HomeFragment
.
Companion
::
getBaiduSearch
private
var
searchAction
:
(
context
:
String
)
->
String
=
::
getBaiduSearch
override
fun
initView
()
{
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
...
@@ -40,32 +47,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
...
@@ -40,32 +47,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
when
(
searchEngine
)
{
when
(
searchEngine
)
{
GOOGLE
->
{
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
searchAction
=
HomeFragment
.
Companion
::
getGoogleSearch
searchAction
=
::
getGoogleSearch
}
}
ConstObject
.
BING
->
{
ConstObject
.
BING
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
searchAction
=
HomeFragment
.
Companion
::
getBingSearch
searchAction
=
::
getBingSearch
}
}
ConstObject
.
YAHOO
->
{
ConstObject
.
YAHOO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
searchAction
=
HomeFragment
.
Companion
::
getYahooSearch
searchAction
=
::
getYahooSearch
}
}
ConstObject
.
DUCKDUCKGO
->
{
ConstObject
.
DUCKDUCKGO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
searchAction
=
HomeFragment
.
Companion
::
getDuckDuckGoSearch
searchAction
=
::
getDuckDuckGoSearch
}
}
ConstObject
.
YANDEX
->
{
ConstObject
.
YANDEX
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
searchAction
=
HomeFragment
.
Companion
::
getYandexSearch
searchAction
=
::
getYandexSearch
}
}
ConstObject
.
BAIDU
->
{
ConstObject
.
BAIDU
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
searchAction
=
HomeFragment
.
Companion
::
getBaiduSearch
searchAction
=
::
getBaiduSearch
}
}
}
}
...
@@ -90,9 +97,19 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
...
@@ -90,9 +97,19 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
binding
.
editWeb
.
setOnEditorActionListener
(
object
:
TextView
.
OnEditorActionListener
{
binding
.
editWeb
.
setOnEditorActionListener
(
object
:
TextView
.
OnEditorActionListener
{
override
fun
onEditorAction
(
v
:
TextView
?,
actionId
:
Int
,
event
:
KeyEvent
?):
Boolean
{
override
fun
onEditorAction
(
v
:
TextView
?,
actionId
:
Int
,
event
:
KeyEvent
?):
Boolean
{
if
(
actionId
==
EditorInfo
.
IME_ACTION_DONE
)
{
if
(
actionId
==
EditorInfo
.
IME_ACTION_DONE
)
{
val
content
=
HomeFragment
.
getWWWSearch
(
v
?.
text
.
toString
())
?:
searchAction
(
v
?.
text
.
toString
())
val
input
=
v
?.
text
?.
toString
()
currentFragment
?.
loadWebView
(
content
)
if
(
input
.
isNullOrEmpty
())
{
return
true
;
// 返回true表示事件已处理
return
true
}
handleInput
(
input
,
loadUrl
=
{
url
->
currentFragment
?.
loadWebView
(
url
)
},
performSearch
=
{
search
->
currentFragment
?.
loadWebView
(
getSearchUrl
(
search
))
})
return
true
// 返回true表示事件已处理
}
}
return
false
return
false
...
@@ -127,32 +144,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
...
@@ -127,32 +144,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
when
(
website
)
{
when
(
website
)
{
ConstObject
.
GOOGLE
->
{
ConstObject
.
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
searchAction
=
HomeFragment
.
Companion
::
getGoogleSearch
searchAction
=
::
getGoogleSearch
}
}
ConstObject
.
BING
->
{
ConstObject
.
BING
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
searchAction
=
HomeFragment
.
Companion
::
getBingSearch
searchAction
=
::
getBingSearch
}
}
ConstObject
.
YAHOO
->
{
ConstObject
.
YAHOO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
searchAction
=
HomeFragment
.
Companion
::
getYahooSearch
searchAction
=
::
getYahooSearch
}
}
ConstObject
.
DUCKDUCKGO
->
{
ConstObject
.
DUCKDUCKGO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
searchAction
=
HomeFragment
.
Companion
::
getDuckDuckGoSearch
searchAction
=
::
getDuckDuckGoSearch
}
}
ConstObject
.
YANDEX
->
{
ConstObject
.
YANDEX
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
searchAction
=
HomeFragment
.
Companion
::
getYandexSearch
searchAction
=
::
getYandexSearch
}
}
ConstObject
.
BAIDU
->
{
ConstObject
.
BAIDU
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
searchAction
=
HomeFragment
.
Companion
::
getBaiduSearch
searchAction
=
::
getBaiduSearch
}
}
}
}
...
@@ -162,7 +179,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
...
@@ -162,7 +179,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
}
}
private
fun
addNewWebSite
(
uri
:
String
)
{
private
fun
addNewWebSite
(
uri
:
String
)
{
val
myFragment
=
WebViewFragment
().
apply
{
url
=
uri
}
val
myFragment
=
WebViewFragment
().
apply
{
url
=
uri
}
val
transaction
:
FragmentTransaction
=
supportFragmentManager
.
beginTransaction
()
val
transaction
:
FragmentTransaction
=
supportFragmentManager
.
beginTransaction
()
transaction
.
replace
(
R
.
id
.
container
,
myFragment
)
transaction
.
replace
(
R
.
id
.
container
,
myFragment
)
transaction
.
commit
()
transaction
.
commit
()
...
...
app/src/main/java/com/base/browserwhite/ui/fragment/HomeFragment.kt
View file @
acf8af8f
package
com.base.browserwhite.ui.fragment
package
com.base.browserwhite.ui.fragment
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.Intent
import
android.content.Intent
import
android.text.TextUtils
import
android.text.TextUtils
import
android.view.KeyEvent
import
android.view.KeyEvent
import
android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import
android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import
android.widget.TextView
import
android.widget.TextView
import
android.widget.Toast
import
android.widget.Toast
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.isVisible
import
androidx.core.view.isVisible
import
androidx.recyclerview.widget.LinearLayoutManager
import
androidx.recyclerview.widget.LinearLayoutManager
import
com.base.browserwhite.R
import
com.base.browserwhite.R
...
@@ -22,6 +19,7 @@ import com.base.browserwhite.bean.ConstObject.JUNK_CLEANER
...
@@ -22,6 +19,7 @@ import com.base.browserwhite.bean.ConstObject.JUNK_CLEANER
import
com.base.browserwhite.bean.ConstObject.NEWS
import
com.base.browserwhite.bean.ConstObject.NEWS
import
com.base.browserwhite.bean.ConstObject.YAHOO
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.ConstObject.searchEngineSp
import
com.base.browserwhite.bean.WebSiteBean
import
com.base.browserwhite.bean.WebSiteBean
import
com.base.browserwhite.bean.defaultValue
import
com.base.browserwhite.bean.defaultValue
import
com.base.browserwhite.bean.webSiteGroupBeanList
import
com.base.browserwhite.bean.webSiteGroupBeanList
...
@@ -40,15 +38,18 @@ import com.base.browserwhite.ui.adapter.HeaderAdapter
...
@@ -40,15 +38,18 @@ import com.base.browserwhite.ui.adapter.HeaderAdapter
import
com.base.browserwhite.ui.adapter.NewsAdapter
import
com.base.browserwhite.ui.adapter.NewsAdapter
import
com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
import
com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.LinkMatchUtils
import
com.base.browserwhite.utils.ClipboardUtils.copyText
import
com.base.browserwhite.utils.LinkSearchUtils
import
com.base.browserwhite.utils.LinkSearchUtils.getBaiduSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getBingSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getDuckDuckGoSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getGoogleSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getYahooSearch
import
com.base.browserwhite.utils.LinkSearchUtils.getYandexSearch
import
com.base.browserwhite.utils.LogEx
import
com.base.browserwhite.utils.LogEx
import
com.chad.library.adapter4.QuickAdapterHelper
import
com.chad.library.adapter4.QuickAdapterHelper
import
com.chad.library.adapter4.loadState.LoadState
import
com.chad.library.adapter4.loadState.LoadState
import
com.chad.library.adapter4.loadState.trailing.TrailingLoadStateAdapter
import
com.chad.library.adapter4.loadState.trailing.TrailingLoadStateAdapter
import
java.net.MalformedURLException
import
java.net.URL
import
java.net.URLEncoder
import
java.nio.charset.StandardCharsets
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>()
{
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>()
{
...
@@ -186,42 +187,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -186,42 +187,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
headWebsiteAdapter
?.
let
{
headWebsiteAdapter
?.
let
{
helper
.
addBeforeAdapter
(
1
,
it
)
helper
.
addBeforeAdapter
(
1
,
it
)
}
}
// val file = File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS), "localImage")
// if (!file.exists()) {
// file.mkdirs()
// }
// webSiteGroupBeanList.flatMap { it.items }.forEach { bean: WebSiteBean ->
// val url = bean.icon_url
// val name = bean.name.lowercase(Locale.getDefault()).replace(" ", "_")
// val imageFile = File(file, "${name}_${bean.id}_local.png")
// download(url, imageFile)
// }
}
}
// fun download(imageUrl: String, file: File) {
// val client = OkHttpClient()
// val request: Request = Request.Builder().url(imageUrl).build()
//
// client.newCall(request).enqueue(object : Callback {
//
//
// override fun onFailure(call: Call, e: IOException) {
// }
//
// override fun onResponse(call: Call, response: Response) {
// if (response.isSuccessful) {
//
// // 将图片数据写入文件
// val fos: FileOutputStream = FileOutputStream(file)
// fos.write(response.body?.bytes())
// fos.flush()
// fos.close()
//
// }
// }
// })
// }
var
i
=
0
var
i
=
0
var
lastClickTime
=
0L
var
lastClickTime
=
0L
...
@@ -234,6 +201,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -234,6 +201,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
binding
.
flSearchEngine
.
setOnClickListener
{
binding
.
flSearchEngine
.
setOnClickListener
{
requireContext
().
showSearchEngineDialog
{
website
->
requireContext
().
showSearchEngineDialog
{
website
->
searchEngine
=
website
searchEngine
=
website
searchEngineSp
=
website
when
(
website
)
{
when
(
website
)
{
GOOGLE
->
{
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
...
@@ -277,7 +245,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -277,7 +245,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
Toast
.
makeText
(
context
,
"input something please"
,
Toast
.
LENGTH_SHORT
).
show
()
Toast
.
makeText
(
context
,
"input something please"
,
Toast
.
LENGTH_SHORT
).
show
()
return
true
return
true
}
}
Link
Mat
chUtils
.
handleInput
(
Link
Sear
chUtils
.
handleInput
(
content
,
content
,
loadUrl
=
{
url
->
loadUrl
=
{
url
->
requireActivity
().
startActivity
(
Intent
(
requireContext
(),
WebBrowserActivity
::
class
.
java
).
apply
{
requireActivity
().
startActivity
(
Intent
(
requireContext
(),
WebBrowserActivity
::
class
.
java
).
apply
{
...
@@ -293,7 +261,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -293,7 +261,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
})
})
})
})
return
true
;
// 返回true表示事件已处理
return
true
// 返回true表示事件已处理
}
}
return
false
return
false
...
@@ -328,83 +296,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
...
@@ -328,83 +296,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
private
fun
copyUuidGid
()
{
private
fun
copyUuidGid
()
{
val
uuid
=
AppPreferences
.
getInstance
().
getString
(
"uuid"
,
""
)
val
uuid
=
AppPreferences
.
getInstance
().
getString
(
"uuid"
,
""
)
val
gid
=
AppPreferences
.
getInstance
().
getString
(
"gid"
,
""
)
val
gid
=
AppPreferences
.
getInstance
().
getString
(
"gid"
,
""
)
// 获取系统服务ClipboardManager
requireContext
().
copyText
(
"uuid"
,
"uuid=$uuid gid=$gid"
)
val
clipboard
:
ClipboardManager
=
requireContext
().
getSystemService
(
AppCompatActivity
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
// 创建一个ClipData对象,其中包含要复制的文本
val
clip
=
ClipData
.
newPlainText
(
"uuid"
,
"uuid=$uuid gid=$gid"
)
// 将ClipData对象设置到剪贴板中
clipboard
.
setPrimaryClip
(
clip
)
Toast
.
makeText
(
requireContext
(),
"copy"
,
Toast
.
LENGTH_SHORT
).
show
()
Toast
.
makeText
(
requireContext
(),
"copy"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
companion
object
{
fun
isValidUrl
(
urlString
:
String
?):
Boolean
{
return
try
{
// 尝试将字符串转换为URL对象
URL
(
urlString
)
true
}
catch
(
e
:
MalformedURLException
)
{
// 如果转换失败,说明不是有效的URL
false
}
}
fun
isMatchesUrl
(
urlString
:
String
):
Boolean
{
val
pattern
=
"^(https?://)?(www\\.)?[a-z0-9]+\\.[a-z0-9.-]+\\.[a-z]{2,6}(:[0-9]{1,5})?(/.*)?$"
return
urlString
.
matches
(
pattern
.
toRegex
())
}
fun
getWWWSearch
(
content
:
String
):
String
?
{
if
(
isValidUrl
(
content
)
||
isMatchesUrl
(
content
))
{
return
if
(
content
.
contains
(
"http"
)
or
content
.
contains
(
"https"
))
{
content
}
else
{
"https://$content"
}
}
return
null
}
fun
getGoogleSearch
(
content
:
String
):
String
{
val
base
=
"https://www.google.com/"
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
val
search
=
"search?q=${encodedQuery}&oq=${encodedQuery}"
return
"$base$search"
}
fun
getBingSearch
(
content
:
String
):
String
{
//https://cn.bing.com/search?q=aaa&form=QBLHCN&sp=-1&lq=0&pq=aaa&sc=10-3&qs=n&sk=&cvid=CBA1E2A2A9124EBB9C9970DC69330095&ghsh=0&ghacc=0&ghpl=
val
base
=
"https://cn.bing.com/"
val
search
=
"search?q=${content}&form=QBLHCN&sp=-1&lq=0&pq=${content}"
return
"$base$search"
}
fun
getYahooSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://search.yahoo.com/search?p=$encodedQuery"
}
fun
getDuckDuckGoSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://www.duckduckgo.com/?q=encodedQuery"
}
fun
getYandexSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://yandex.com/search/?text=$encodedQuery"
}
fun
getBaiduSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://www.baidu.com/s?wd=$encodedQuery"
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/utils/ClipboardUtils.kt
0 → 100644
View file @
acf8af8f
package
com.base.browserwhite.utils
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.Context
import
androidx.appcompat.app.AppCompatActivity
object
ClipboardUtils
{
fun
Context
.
copyText
(
label
:
String
,
text
:
String
)
{
val
clipboard
:
ClipboardManager
=
getSystemService
(
AppCompatActivity
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
// 创建一个ClipData对象,其中包含要复制的文本
// val clip = ClipData.newPlainText("uuid", "uuid=$uuid gid=$gid")
val
clip
=
ClipData
.
newPlainText
(
label
,
text
)
// 将ClipData对象设置到剪贴板中
clipboard
.
setPrimaryClip
(
clip
)
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/utils/Link
Mat
chUtils.kt
→
app/src/main/java/com/base/browserwhite/utils/Link
Sear
chUtils.kt
View file @
acf8af8f
package
com.base.browserwhite.utils
package
com.base.browserwhite.utils
object
LinkMatchUtils
{
import
com.base.browserwhite.bean.ConstObject
import
java.net.MalformedURLException
import
java.net.URL
import
java.net.URLEncoder
import
java.nio.charset.StandardCharsets
object
LinkSearchUtils
{
fun
handleInput
(
fun
handleInput
(
input
:
String
,
input
:
String
,
loadUrl
:
(
url
:
String
)
->
Unit
,
loadUrl
:
(
url
:
String
)
->
Unit
,
...
@@ -43,4 +49,85 @@ object LinkMatchUtils {
...
@@ -43,4 +49,85 @@ object LinkMatchUtils {
// 其他情况,无法确定是网址还是搜索词
// 其他情况,无法确定是网址还是搜索词
return
input
return
input
}
}
fun
getSearchUrl
(
searchText
:
String
,
searchEngine
:
String
=
ConstObject
.
searchEngineSp
):
String
{
val
action
=
when
(
searchEngine
)
{
ConstObject
.
GOOGLE
->
::
getGoogleSearch
ConstObject
.
BING
->
::
getBingSearch
ConstObject
.
YAHOO
->
::
getYahooSearch
ConstObject
.
DUCKDUCKGO
->
::
getDuckDuckGoSearch
ConstObject
.
YANDEX
->
::
getYandexSearch
ConstObject
.
BAIDU
->
::
getBaiduSearch
else
->
::
getGoogleSearch
}
return
action
.
invoke
(
searchText
)
}
fun
isValidUrl
(
urlString
:
String
?):
Boolean
{
return
try
{
// 尝试将字符串转换为URL对象
URL
(
urlString
)
true
}
catch
(
e
:
MalformedURLException
)
{
// 如果转换失败,说明不是有效的URL
false
}
}
fun
isMatchesUrl
(
urlString
:
String
):
Boolean
{
val
pattern
=
"^(https?://)?(www\\.)?[a-z0-9]+\\.[a-z0-9.-]+\\.[a-z]{2,6}(:[0-9]{1,5})?(/.*)?$"
return
urlString
.
matches
(
pattern
.
toRegex
())
}
fun
getWWWSearch
(
content
:
String
):
String
?
{
if
(
isValidUrl
(
content
)
||
isMatchesUrl
(
content
))
{
return
if
(
content
.
contains
(
"http"
)
or
content
.
contains
(
"https"
))
{
content
}
else
{
"https://$content"
}
}
return
null
}
fun
getGoogleSearch
(
content
:
String
):
String
{
val
base
=
"https://www.google.com/"
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
val
search
=
"search?q=${encodedQuery}&oq=${encodedQuery}"
return
"$base$search"
}
fun
getBingSearch
(
content
:
String
):
String
{
//https://cn.bing.com/search?q=aaa&form=QBLHCN&sp=-1&lq=0&pq=aaa&sc=10-3&qs=n&sk=&cvid=CBA1E2A2A9124EBB9C9970DC69330095&ghsh=0&ghacc=0&ghpl=
val
base
=
"https://cn.bing.com/"
val
search
=
"search?q=${content}&form=QBLHCN&sp=-1&lq=0&pq=${content}"
return
"$base$search"
}
fun
getYahooSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://search.yahoo.com/search?p=$encodedQuery"
}
fun
getDuckDuckGoSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://www.duckduckgo.com/?q=encodedQuery"
}
fun
getYandexSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://yandex.com/search/?text=$encodedQuery"
}
fun
getBaiduSearch
(
content
:
String
):
String
{
val
encodedQuery
=
URLEncoder
.
encode
(
content
,
StandardCharsets
.
UTF_8
.
toString
())
return
"https://www.baidu.com/s?wd=$encodedQuery"
}
}
}
app/src/main/res/layout/activity_qrc_result.xml
View file @
acf8af8f
...
@@ -95,6 +95,7 @@
...
@@ -95,6 +95,7 @@
tools:ignore=
"ContentDescription"
/>
tools:ignore=
"ContentDescription"
/>
<TextView
<TextView
android:id=
"@+id/tv_qrcodevalue"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_gravity=
"center_horizontal"
...
@@ -110,6 +111,7 @@
...
@@ -110,6 +111,7 @@
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"23dp"
android:layout_marginTop=
"23dp"
android:layout_marginBottom=
"8dp"
android:orientation=
"horizontal"
>
android:orientation=
"horizontal"
>
<LinearLayout
<LinearLayout
...
@@ -117,7 +119,8 @@
...
@@ -117,7 +119,8 @@
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
<ImageView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
...
@@ -140,7 +143,8 @@
...
@@ -140,7 +143,8 @@
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
<ImageView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
...
@@ -159,11 +163,12 @@
...
@@ -159,11 +163,12 @@
</LinearLayout>
</LinearLayout>
<LinearLayout
<LinearLayout
android:id=
"@+id/ll_
copy
"
android:id=
"@+id/ll_
share
"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
<ImageView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
...
@@ -184,6 +189,23 @@
...
@@ -184,6 +189,23 @@
</LinearLayout>
</LinearLayout>
<View
android:id=
"@+id/line2"
android:layout_width=
"match_parent"
android:layout_height=
"1px"
android:layout_marginTop=
"27dp"
android:background=
"#E5E6EB"
android:visibility=
"gone"
/>
<FrameLayout
android:id=
"@+id/fl_ad"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<!-- <include layout="@layout/layout_admob_native_qrcr" />-->
</FrameLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</androidx.cardview.widget.CardView>
...
...
app/src/main/res/layout/item_news.xml
View file @
acf8af8f
...
@@ -52,6 +52,7 @@
...
@@ -52,6 +52,7 @@
</androidx.cardview.widget.CardView>
</androidx.cardview.widget.CardView>
<TextView
<TextView
android:layout_marginTop=
"12dp"
android:id=
"@+id/tv_tittle"
android:id=
"@+id/tv_tittle"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
...
@@ -63,7 +64,7 @@
...
@@ -63,7 +64,7 @@
<LinearLayout
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginVertical=
"1
5
dp"
android:layout_marginVertical=
"1
0
dp"
android:orientation=
"horizontal"
>
android:orientation=
"horizontal"
>
<de.hdodenhof.circleimageview.CircleImageView
<de.hdodenhof.circleimageview.CircleImageView
...
...
app/src/main/res/layout/layout_admob_native_qrcr.xml
0 → 100644
View file @
acf8af8f
<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"
>
<com.google.android.gms.ads.nativead.MediaView
android:id=
"@+id/ad_media"
android:layout_width=
"match_parent"
android:layout_height=
"170dp"
android:layout_gravity=
"center_vertical"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
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"
/>
</LinearLayout>
<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"
/>
<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>
<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:layout_marginTop=
"8dp"
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment