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
Show 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 {
}
}
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
Int
=
0
)
{
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
String
=
""
)
{
if
(
isBlack
)
{
return
}
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
{
var
layout
=
R
.
layout
.
layout_max_native_small
// if (where == 0) {
...
...
app/src/main/java/com/base/browserwhite/ads/admob/AdmobNativeUtils.kt
View file @
acf8af8f
...
...
@@ -29,6 +29,7 @@ object AdmobNativeUtils {
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
var
onAdLoaded
:
(()
->
Unit
)?
=
null
private
fun
loadNativeAd
()
{
if
(
nativeAd
!=
null
)
{
...
...
@@ -61,6 +62,12 @@ object AdmobNativeUtils {
pullAd
(
it
.
responseInfo
,
"nativeAd"
,
reqId
=
reqId
)
it
.
setOnPaidEventListener
(
AdmobEvent
.
EventOnPaidEventListener
(
it
))
}.
withAdListener
(
object
:
AdListener
()
{
override
fun
onAdLoaded
()
{
super
.
onAdLoaded
()
onAdLoaded
?.
invoke
()
onAdLoaded
=
null
}
override
fun
onAdClicked
()
{
clickAd
(
nativeAd
?.
responseInfo
,
"nativeAd"
)
}
...
...
app/src/main/java/com/base/browserwhite/bean/ConstObject.kt
View file @
acf8af8f
...
...
@@ -51,4 +51,14 @@ object ConstObject {
field
=
value
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
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
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.HomeFragment
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
import
android.content.Intent
import
android.graphics.Color
import
android.view.View
import
android.widget.Toast
import
androidx.activity.addCallback
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.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
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
>()
{
...
...
@@ -13,10 +23,19 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
ActivityQrcResultBinding
.
inflate
(
layoutInflater
)
}
private
var
qrCodeValue
:
String
?
=
null
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
WHITE
)
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
()
{
...
...
@@ -28,6 +47,37 @@ class QrcResultActivity : BaseActivity<ActivityQrcResultBinding>() {
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>() {
// imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer
=
QRImageAnalyzer
()
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
import
com.base.browserwhite.bean.ConstObject.GOOGLE
import
com.base.browserwhite.databinding.ActivityWebBrowserBinding
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.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
>()
{
...
...
@@ -26,7 +33,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
}
private
val
fragmentList
=
arrayListOf
<
Fragment
>()
private
var
currentFragment
:
WebViewFragment
?
=
null
private
var
searchAction
:
(
context
:
String
)
->
String
=
HomeFragment
.
Companion
::
getBaiduSearch
private
var
searchAction
:
(
context
:
String
)
->
String
=
::
getBaiduSearch
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
...
...
@@ -40,32 +47,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
when
(
searchEngine
)
{
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
searchAction
=
HomeFragment
.
Companion
::
getGoogleSearch
searchAction
=
::
getGoogleSearch
}
ConstObject
.
BING
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
searchAction
=
HomeFragment
.
Companion
::
getBingSearch
searchAction
=
::
getBingSearch
}
ConstObject
.
YAHOO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
searchAction
=
HomeFragment
.
Companion
::
getYahooSearch
searchAction
=
::
getYahooSearch
}
ConstObject
.
DUCKDUCKGO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
searchAction
=
HomeFragment
.
Companion
::
getDuckDuckGoSearch
searchAction
=
::
getDuckDuckGoSearch
}
ConstObject
.
YANDEX
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
searchAction
=
HomeFragment
.
Companion
::
getYandexSearch
searchAction
=
::
getYandexSearch
}
ConstObject
.
BAIDU
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
searchAction
=
HomeFragment
.
Companion
::
getBaiduSearch
searchAction
=
::
getBaiduSearch
}
}
...
...
@@ -90,9 +97,19 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
binding
.
editWeb
.
setOnEditorActionListener
(
object
:
TextView
.
OnEditorActionListener
{
override
fun
onEditorAction
(
v
:
TextView
?,
actionId
:
Int
,
event
:
KeyEvent
?):
Boolean
{
if
(
actionId
==
EditorInfo
.
IME_ACTION_DONE
)
{
val
content
=
HomeFragment
.
getWWWSearch
(
v
?.
text
.
toString
())
?:
searchAction
(
v
?.
text
.
toString
())
currentFragment
?.
loadWebView
(
content
)
return
true
;
// 返回true表示事件已处理
val
input
=
v
?.
text
?.
toString
()
if
(
input
.
isNullOrEmpty
())
{
return
true
}
handleInput
(
input
,
loadUrl
=
{
url
->
currentFragment
?.
loadWebView
(
url
)
},
performSearch
=
{
search
->
currentFragment
?.
loadWebView
(
getSearchUrl
(
search
))
})
return
true
// 返回true表示事件已处理
}
return
false
...
...
@@ -127,32 +144,32 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
when
(
website
)
{
ConstObject
.
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
searchAction
=
HomeFragment
.
Companion
::
getGoogleSearch
searchAction
=
::
getGoogleSearch
}
ConstObject
.
BING
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_bing
)
searchAction
=
HomeFragment
.
Companion
::
getBingSearch
searchAction
=
::
getBingSearch
}
ConstObject
.
YAHOO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yahoo
)
searchAction
=
HomeFragment
.
Companion
::
getYahooSearch
searchAction
=
::
getYahooSearch
}
ConstObject
.
DUCKDUCKGO
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_xuckd
)
searchAction
=
HomeFragment
.
Companion
::
getDuckDuckGoSearch
searchAction
=
::
getDuckDuckGoSearch
}
ConstObject
.
YANDEX
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_yandex
)
searchAction
=
HomeFragment
.
Companion
::
getYandexSearch
searchAction
=
::
getYandexSearch
}
ConstObject
.
BAIDU
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_baidu
)
searchAction
=
HomeFragment
.
Companion
::
getBaiduSearch
searchAction
=
::
getBaiduSearch
}
}
...
...
@@ -162,7 +179,7 @@ class WebBrowserActivity : BaseActivity<ActivityWebBrowserBinding>() {
}
private
fun
addNewWebSite
(
uri
:
String
)
{
val
myFragment
=
WebViewFragment
().
apply
{
url
=
uri
}
val
myFragment
=
WebViewFragment
().
apply
{
url
=
uri
}
val
transaction
:
FragmentTransaction
=
supportFragmentManager
.
beginTransaction
()
transaction
.
replace
(
R
.
id
.
container
,
myFragment
)
transaction
.
commit
()
...
...
app/src/main/java/com/base/browserwhite/ui/fragment/HomeFragment.kt
View file @
acf8af8f
package
com.base.browserwhite.ui.fragment
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.Intent
import
android.text.TextUtils
import
android.view.KeyEvent
import
android.view.inputmethod.EditorInfo.IME_ACTION_DONE
import
android.widget.TextView
import
android.widget.Toast
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.view.isVisible
import
androidx.recyclerview.widget.LinearLayoutManager
import
com.base.browserwhite.R
...
...
@@ -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.YAHOO
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.defaultValue
import
com.base.browserwhite.bean.webSiteGroupBeanList
...
...
@@ -40,15 +38,18 @@ import com.base.browserwhite.ui.adapter.HeaderAdapter
import
com.base.browserwhite.ui.adapter.NewsAdapter
import
com.base.browserwhite.ui.views.DialogViews.showSearchEngineDialog
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.chad.library.adapter4.QuickAdapterHelper
import
com.chad.library.adapter4.loadState.LoadState
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
>()
{
...
...
@@ -186,42 +187,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
headWebsiteAdapter
?.
let
{
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
lastClickTime
=
0L
...
...
@@ -234,6 +201,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
binding
.
flSearchEngine
.
setOnClickListener
{
requireContext
().
showSearchEngineDialog
{
website
->
searchEngine
=
website
searchEngineSp
=
website
when
(
website
)
{
GOOGLE
->
{
binding
.
ivSearchEngine
.
setImageResource
(
R
.
mipmap
.
h_s_google
)
...
...
@@ -277,7 +245,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
Toast
.
makeText
(
context
,
"input something please"
,
Toast
.
LENGTH_SHORT
).
show
()
return
true
}
Link
Mat
chUtils
.
handleInput
(
Link
Sear
chUtils
.
handleInput
(
content
,
loadUrl
=
{
url
->
requireActivity
().
startActivity
(
Intent
(
requireContext
(),
WebBrowserActivity
::
class
.
java
).
apply
{
...
...
@@ -293,7 +261,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
})
})
return
true
;
// 返回true表示事件已处理
return
true
// 返回true表示事件已处理
}
return
false
...
...
@@ -328,83 +296,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
private
fun
copyUuidGid
()
{
val
uuid
=
AppPreferences
.
getInstance
().
getString
(
"uuid"
,
""
)
val
gid
=
AppPreferences
.
getInstance
().
getString
(
"gid"
,
""
)
// 获取系统服务ClipboardManager
val
clipboard
:
ClipboardManager
=
requireContext
().
getSystemService
(
AppCompatActivity
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
// 创建一个ClipData对象,其中包含要复制的文本
val
clip
=
ClipData
.
newPlainText
(
"uuid"
,
"uuid=$uuid gid=$gid"
)
// 将ClipData对象设置到剪贴板中
clipboard
.
setPrimaryClip
(
clip
)
requireContext
().
copyText
(
"uuid"
,
"uuid=$uuid gid=$gid"
)
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
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
(
input
:
String
,
loadUrl
:
(
url
:
String
)
->
Unit
,
...
...
@@ -43,4 +49,85 @@ object LinkMatchUtils {
// 其他情况,无法确定是网址还是搜索词
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 @@
tools:ignore=
"ContentDescription"
/>
<TextView
android:id=
"@+id/tv_qrcodevalue"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
...
...
@@ -110,6 +111,7 @@
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"23dp"
android:layout_marginBottom=
"8dp"
android:orientation=
"horizontal"
>
<LinearLayout
...
...
@@ -117,7 +119,8 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
...
...
@@ -140,7 +143,8 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
...
...
@@ -159,11 +163,12 @@
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll_
copy
"
android:id=
"@+id/ll_
share
"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"30dp"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
tools:ignore=
"UseCompoundDrawables"
>
<ImageView
android:layout_width=
"wrap_content"
...
...
@@ -184,6 +189,23 @@
</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>
</androidx.cardview.widget.CardView>
...
...
app/src/main/res/layout/item_news.xml
View file @
acf8af8f
...
...
@@ -52,6 +52,7 @@
</androidx.cardview.widget.CardView>
<TextView
android:layout_marginTop=
"12dp"
android:id=
"@+id/tv_tittle"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
...
...
@@ -63,7 +64,7 @@
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginVertical=
"1
5
dp"
android:layout_marginVertical=
"1
0
dp"
android:orientation=
"horizontal"
>
<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