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
7d66088f
Commit
7d66088f
authored
Aug 28, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
6ee147a1
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
113 additions
and
69 deletions
+113
-69
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+3
-2
EventUtils.kt
app/src/main/java/com/base/browserwhite/help/EventUtils.kt
+7
-1
QRImageAnalyzer.kt
.../base/browserwhite/ui/activity/scanqrc/QRImageAnalyzer.kt
+12
-19
QrcResultActivity.kt
...ase/browserwhite/ui/activity/scanqrc/QrcResultActivity.kt
+21
-0
ScanQRCActivity.kt
.../base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
+45
-29
WebsiteAdapter.kt
...n/java/com/base/browserwhite/ui/adapter/WebsiteAdapter.kt
+1
-1
HomeFragment.kt
...in/java/com/base/browserwhite/ui/fragment/HomeFragment.kt
+11
-3
LinkMatchUtils.kt
...c/main/java/com/base/browserwhite/utils/LinkMatchUtils.kt
+3
-14
activity_qrc_result.xml
app/src/main/res/layout/activity_qrc_result.xml
+10
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
7d66088f
...
...
@@ -15,7 +15,6 @@
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE_DATA_SYNC"
/>
<uses-permission
android:name=
"android.permission.REQUEST_INSTALL_PACKAGES"
/>
<queries>
<intent>
<action
android:name=
"android.intent.action.MAIN"
/>
...
...
@@ -25,7 +24,6 @@
</intent>
</queries>
<application
android:name=
".MyApplication"
android:allowBackup=
"true"
...
...
@@ -39,6 +37,9 @@
android:theme=
"@style/Theme.BrowserWhite"
android:usesCleartextTraffic=
"true"
tools:targetApi=
"34"
>
<activity
android:name=
".ui.activity.scanqrc.QrcResultActivity"
android:exported=
"false"
/>
<activity
android:name=
".ui.activity.appprocess.AppProcessActivity"
android:exported=
"false"
/>
...
...
app/src/main/java/com/base/browserwhite/help/EventUtils.kt
View file @
7d66088f
...
...
@@ -2,6 +2,7 @@ package com.base.browserwhite.help
import
android.os.Build
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.bean.ConstObject.ifAgreePrivacy
import
com.base.browserwhite.help.ReportUtils.doPost
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.LogEx
...
...
@@ -17,6 +18,10 @@ object EventUtils {
isSingleEvent
:
Boolean
=
false
)
{
if
(!
ifAgreePrivacy
)
{
return
}
if
(
isSingleEvent
)
{
val
stringSet
=
AppPreferences
.
getInstance
().
getStringSet
(
"singleEvent"
,
setOf
())
if
(
stringSet
.
contains
(
key
))
{
...
...
@@ -48,7 +53,8 @@ object EventUtils {
.
put
(
"data"
,
s
)
.
put
(
"bp"
,
s2
)
.
toString
()
LogEx
.
logDebug
(
TAG
,
"data=${AppPreferences.getInstance().getString("
uuid
", "")}"
)
LogEx
.
logDebug
(
TAG
,
"uuid=${AppPreferences.getInstance().getString("
uuid
", "")}"
)
LogEx
.
logDebug
(
TAG
,
"gid=${AppPreferences.getInstance().getString("
gid
", "")}"
)
paramJson
=
AESHelper
.
encrypt
(
data
)
}
catch
(
e
:
JSONException
)
{
paramJson
=
""
...
...
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/QRImageAnalyzer.kt
View file @
7d66088f
...
...
@@ -2,18 +2,14 @@ package com.base.browserwhite.ui.activity.scanqrc
import
android.annotation.SuppressLint
import
android.content.Context
import
android.content.Intent
import
android.graphics.Bitmap
import
android.widget.Toast
import
androidx.camera.core.ImageAnalysis
import
androidx.camera.core.ImageProxy
import
com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import
com.base.browserwhite.ui.fragment.HomeFragment.Companion.isMatchesUrl
import
com.base.browserwhite.utils.LogEx
import
com.google.mlkit.vision.barcode.BarcodeScannerOptions
import
com.google.mlkit.vision.barcode.BarcodeScanning
import
com.google.mlkit.vision.barcode.common.Barcode
import
com.google.mlkit.vision.barcode.common.Barcode.FORMAT_AZTEC
import
com.google.mlkit.vision.barcode.common.Barcode.FORMAT_CODABAR
import
com.google.mlkit.vision.common.InputImage
...
...
@@ -22,7 +18,7 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
private
val
TAG
=
"QRImageAnalyzer"
var
action
:
((
qrCodeValue
:
String
)
->
Unit
)?
=
null
var
parseAction
:
((
qrCodeValue
:
String
,
valueType
:
Int
)
->
Unit
)?
=
null
//如需仅检测 Aztec 码和 QR 码
private
val
options
=
BarcodeScannerOptions
.
Builder
().
setBarcodeFormats
(
...
...
@@ -55,25 +51,21 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
}
}
private
fun
handleBarcodeList
(
barcodeList
:
List
<
Barcode
>)
{
private
fun
handleBarcodeList
(
barcodeList
:
List
<
Barcode
>,
)
{
if
(
barcodeList
.
size
==
1
)
{
val
barcode
=
barcodeList
[
0
]
val
valueType
=
barcode
.
valueType
val
qrCodeValue
=
barcode
.
rawValue
?:
""
// Barcode.FORMAT_QR_CODE, FORMAT_CODABAR, FORMAT_AZTEC, TYPE_TEXT
LogEx
.
logDebug
(
TAG
,
"valueType=$valueType"
)
when
(
valueType
)
{
Barcode
.
FORMAT_QR_CODE
,
FORMAT_CODABAR
,
FORMAT_AZTEC
->
{
val
qrCodeValue
=
barcode
.
rawValue
?:
""
LogEx
.
logDebug
(
TAG
,
"qrCodeValue=${qrCodeValue}"
)
if
(
isMatchesUrl
(
qrCodeValue
)
or
qrCodeValue
.
startsWith
(
"http"
)
or
qrCodeValue
.
startsWith
(
"https"
))
{
action
?.
invoke
(
qrCodeValue
)
}
}
}
parseAction
?.
invoke
(
qrCodeValue
,
valueType
)
}
}
fun
processImage
(
bitmap
:
Bitmap
)
{
fun
processImage
(
context
:
Context
,
bitmap
:
Bitmap
)
{
val
image
=
InputImage
.
fromBitmap
(
bitmap
,
0
)
val
barcodeScanner
=
BarcodeScanning
.
getClient
(
options
)
...
...
@@ -83,7 +75,8 @@ class QRImageAnalyzer() : ImageAnalysis.Analyzer {
}
.
addOnFailureListener
{
exception
->
// 处理失败情况
LogEx
.
logDebug
(
TAG
,
"$exception"
)
// LogEx.logDebug(TAG,"$exception")
Toast
.
makeText
(
context
,
"Unable to parse QR code"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/QrcResultActivity.kt
0 → 100644
View file @
7d66088f
package
com.base.browserwhite.ui.activity.scanqrc
import
android.graphics.Color
import
androidx.core.view.updatePadding
import
com.base.browserwhite.databinding.ActivityQrcResultBinding
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.utils.BarUtils
class
QrcResultActivity
:
BaseActivity
<
ActivityQrcResultBinding
>()
{
override
val
binding
:
ActivityQrcResultBinding
by
lazy
{
ActivityQrcResultBinding
.
inflate
(
layoutInflater
)
}
override
fun
initView
()
{
BarUtils
.
setStatusBarLightMode
(
this
,
true
)
BarUtils
.
setStatusBarColor
(
this
,
Color
.
TRANSPARENT
)
binding
.
root
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/activity/scanqrc/ScanQRCActivity.kt
View file @
7d66088f
...
...
@@ -3,14 +3,17 @@ package com.base.browserwhite.ui.activity.scanqrc
import
android.Manifest
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.graphics.BitmapFactory
import
android.graphics.Color
import
android.hardware.camera2.CameraAccessException
import
android.hardware.camera2.CameraCharacteristics
import
android.hardware.camera2.CameraManager
import
android.net.Uri
import
androidx.activity.addCallback
import
androidx.camera.core.AspectRatio
import
androidx.camera.core.Camera
import
androidx.camera.core.CameraSelector
import
androidx.camera.core.CameraX
import
androidx.camera.core.ImageAnalysis
import
androidx.camera.core.Preview
import
androidx.camera.lifecycle.ProcessCameraProvider
...
...
@@ -19,7 +22,6 @@ import androidx.core.view.isVisible
import
androidx.core.view.updatePadding
import
com.base.browserwhite.databinding.ActivityScanQrcBinding
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.webbrowser.WebBrowserActivity
import
com.base.browserwhite.ui.views.DialogViews.showGerPermission
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.LogEx
...
...
@@ -101,7 +103,22 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
}
binding
.
ivShoudian
.
isSelected
=
!
binding
.
ivShoudian
.
isSelected
}
binding
.
ivPhoto
.
setOnClickListener
{
}
binding
.
ivPhoto
.
setOnClickListener
{
val
safIntent
=
Intent
(
Intent
.
ACTION_OPEN_DOCUMENT
)
safIntent
.
addCategory
(
Intent
.
CATEGORY_OPENABLE
)
safIntent
.
setType
(
"image/*"
)
launcher
.
launch
(
safIntent
)
{
LogEx
.
logDebug
(
TAG
,
"${it.resultCode}"
)
val
dataIntent
=
it
.
data
if
(
it
.
resultCode
==
RESULT_OK
&&
dataIntent
!=
null
)
{
val
uri
:
Uri
=
dataIntent
.
data
?:
Uri
.
EMPTY
val
bitmap
=
BitmapFactory
.
decodeStream
(
contentResolver
.
openInputStream
(
uri
))
qrImageAnalyzer
.
processImage
(
this
@ScanQRCActivity
,
bitmap
)
}
}
}
}
private
fun
initCamera
()
{
...
...
@@ -138,13 +155,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
//构建图片捕捉类
// imageCapture = buildImageCapture(aspectRation, rotation)
qrImageAnalyzer
=
QRImageAnalyzer
()
qrImageAnalyzer
.
action
=
{
qrCodeValue
->
binding
.
root
.
post
{
startActivity
(
Intent
(
this
@ScanQRCActivity
,
WebBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"url"
,
qrCodeValue
)
})
finish
()
}
qrImageAnalyzer
.
parseAction
=
{
qrCodeValue
,
valueType
->
// startActivity(Intent(this))
}
//构建图片分析器
...
...
@@ -208,6 +220,8 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
override
fun
onDestroy
()
{
super
.
onDestroy
()
cameraExecutor
.
shutdown
()
imageAnalyzer
?.
clearAnalyzer
()
cameraProvider
?.
unbindAll
()
}
companion
object
{
...
...
@@ -218,31 +232,33 @@ class ScanQRCActivity : BaseActivity<ActivityScanQrcBinding>() {
private
fun
openFlash
()
{
val
cameraManager
=
getSystemService
(
CAMERA_SERVICE
)
as
CameraManager
cameraManager
.
setTorchMode
(
getBackCameraId
(),
true
)
// val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// cameraManager.setTorchMode(getBackCameraId(), true)
camera
?.
cameraControl
?.
enableTorch
(
true
)
}
private
fun
closeFlash
()
{
val
cameraManager
=
getSystemService
(
CAMERA_SERVICE
)
as
CameraManager
cameraManager
.
setTorchMode
(
getBackCameraId
(),
false
)
// val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
// cameraManager.setTorchMode(getBackCameraId(), false)
camera
?.
cameraControl
?.
enableTorch
(
false
)
}
private
fun
getBackCameraId
():
String
{
var
cameraId
:
String
?
=
null
try
{
val
cameraManager
=
getSystemService
(
CAMERA_SERVICE
)
as
CameraManager
for
(
id
in
cameraManager
.
cameraIdList
)
{
val
characteristics
:
CameraCharacteristics
=
cameraManager
.
getCameraCharacteristics
(
id
)
if
(
characteristics
.
get
(
CameraCharacteristics
.
LENS_FACING
)
==
CameraCharacteristics
.
LENS_FACING_BACK
)
{
cameraId
=
id
break
}
}
}
catch
(
e
:
CameraAccessException
)
{
e
.
printStackTrace
()
}
return
cameraId
?:
""
}
//
private fun getBackCameraId(): String {
//
var cameraId: String? = null
//
try {
//
val cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
//
for (id in cameraManager.cameraIdList) {
//
val characteristics: CameraCharacteristics = cameraManager.getCameraCharacteristics(id)
//
if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
//
cameraId = id
//
break
//
}
//
}
//
} catch (e: CameraAccessException) {
//
e.printStackTrace()
//
}
//
return cameraId ?: ""
//
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ui/adapter/WebsiteAdapter.kt
View file @
7d66088f
...
...
@@ -61,7 +61,7 @@ class WebsiteAdapter(val uiType: Int = 0, val click: (bean: WebSiteBean) -> Unit
binding
.
ivIcon
.
visibility
=
View
.
VISIBLE
binding
.
ivAdd
.
visibility
=
View
.
GONE
val
bordIconName
=
arrayOf
(
"Ebay"
,
"Bing"
,
"Wikipedia"
,
"Pinterest"
,
"NBC News"
,
"Shopee"
,
"Drugs"
)
LogEx
.
logDebug
(
TAG
,
bean
.
name
)
//
LogEx.logDebug(TAG, bean.name)
if
(
bordIconName
.
contains
(
bean
.
name
))
{
binding
.
ivIcon
.
borderColor
=
ContextCompat
.
getColor
(
context
,
R
.
color
.
color_cbcdd7
)
binding
.
ivIcon
.
borderWidth
=
1
...
...
app/src/main/java/com/base/browserwhite/ui/fragment/HomeFragment.kt
View file @
7d66088f
...
...
@@ -3,6 +3,7 @@ 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
...
...
@@ -272,8 +273,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
override
fun
onEditorAction
(
v
:
TextView
?,
actionId
:
Int
,
event
:
KeyEvent
?):
Boolean
{
if
(
actionId
==
IME_ACTION_DONE
)
{
val
content
=
v
?.
text
.
toString
()
LinkMatchUtils
.
handleInput
(
requireContext
(),
if
(
TextUtils
.
isEmpty
(
content
))
{
Toast
.
makeText
(
context
,
"input something please"
,
Toast
.
LENGTH_SHORT
).
show
()
return
true
}
LinkMatchUtils
.
handleInput
(
content
,
loadUrl
=
{
url
->
requireActivity
().
startActivity
(
Intent
(
requireContext
(),
WebBrowserActivity
::
class
.
java
).
apply
{
...
...
@@ -282,7 +286,11 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
})
},
performSearch
=
{
url
->
searchAction
.
invoke
(
url
)
val
searchUrl
=
searchAction
.
invoke
(
url
)
requireActivity
().
startActivity
(
Intent
(
requireContext
(),
WebBrowserActivity
::
class
.
java
).
apply
{
putExtra
(
"searchEngine"
,
searchEngine
)
putExtra
(
"url"
,
searchUrl
)
})
})
return
true
;
// 返回true表示事件已处理
...
...
app/src/main/java/com/base/browserwhite/utils/LinkMatchUtils.kt
View file @
7d66088f
package
com.base.browserwhite.utils
import
android.content.Context
import
android.text.TextUtils
import
android.widget.Toast
object
LinkMatchUtils
{
fun
handleInput
(
context
:
Context
,
input
:
String
,
loadUrl
:
(
url
:
String
)
->
Unit
,
performSearch
:
(
search
:
String
)
->
Unit
)
{
var
tempInput
=
input
if
(
TextUtils
.
isEmpty
(
input
))
{
Toast
.
makeText
(
context
,
"input something please"
,
Toast
.
LENGTH_SHORT
).
show
()
return
}
// 去除输入字符串两端的空白字符
tempInput
=
input
.
trim
{
it
<=
' '
}
val
tempInput
=
input
.
trim
{
it
<=
' '
}
// 检查输入是否看起来像是一个网址
if
(
isLikelyUrl
(
tempInput
))
{
// 补齐协议并加载网址
val
formattedUrl
=
addProtocolIfNeeded
(
tempInput
)
loadUrl
(
formattedUrl
)
;
loadUrl
(
formattedUrl
)
}
else
{
// 作为搜索关键词处理
performSearch
(
input
)
;
performSearch
(
input
)
}
}
...
...
app/src/main/res/layout/activity_qrc_result.xml
0 → 100644
View file @
7d66088f
<?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:id=
"@+id/main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".ui.activity.scanqrc.QrcResultActivity"
>
</androidx.constraintlayout.widget.ConstraintLayout>
\ 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