Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
S
Scan QR Code Barcode Reader
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
Scan QR Code Barcode Reader
Commits
dec60fd7
Commit
dec60fd7
authored
Jan 02, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...event
parent
b27fe8f3
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
1221 additions
and
125 deletions
+1221
-125
build.gradle.kts
app/build.gradle.kts
+1
-0
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+11
-2
MyApplication.kt
app/src/main/java/com/base/scanqr/MyApplication.kt
+5
-3
AdInsertMgr.kt
app/src/main/java/com/base/scanqr/ads/admob/AdInsertMgr.kt
+1
-1
AdOpenMgr.kt
app/src/main/java/com/base/scanqr/ads/admob/AdOpenMgr.kt
+1
-0
EmailUIBean.kt
app/src/main/java/com/base/scanqr/bean/EmailUIBean.kt
+43
-1
EventUIBean.kt
app/src/main/java/com/base/scanqr/bean/EventUIBean.kt
+74
-6
WebsiteUIBean.kt
app/src/main/java/com/base/scanqr/bean/WebsiteUIBean.kt
+18
-1
WifiUIBean.kt
app/src/main/java/com/base/scanqr/bean/WifiUIBean.kt
+40
-0
EmailCodeActivity.kt
...c/main/java/com/base/scanqr/ui/email/EmailCodeActivity.kt
+5
-11
EventActivity.kt
app/src/main/java/com/base/scanqr/ui/event/EventActivity.kt
+160
-0
EventCodeActivity.kt
...c/main/java/com/base/scanqr/ui/event/EventCodeActivity.kt
+148
-0
HistoryAdapter.kt
app/src/main/java/com/base/scanqr/ui/main/HistoryAdapter.kt
+4
-1
HistoryFragment.kt
app/src/main/java/com/base/scanqr/ui/main/HistoryFragment.kt
+7
-0
HistoryViewModel.kt
...src/main/java/com/base/scanqr/ui/main/HistoryViewModel.kt
+9
-1
ScanFragment.kt
app/src/main/java/com/base/scanqr/ui/main/ScanFragment.kt
+42
-6
StartActivity.kt
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
+5
-0
DateTimeDialog.kt
...src/main/java/com/base/scanqr/ui/widget/DateTimeDialog.kt
+29
-0
WifiCodeActivity.kt
...src/main/java/com/base/scanqr/ui/wifi/WifiCodeActivity.kt
+5
-5
IntentUtils.kt
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
+30
-0
KotlinExt.kt
app/src/main/java/com/base/scanqr/utils/KotlinExt.kt
+4
-0
QRCodeUtils.kt
app/src/main/java/com/base/scanqr/utils/QRCodeUtils.kt
+1
-82
color_white_black.xml
app/src/main/res/color/color_white_black.xml
+4
-0
activity_event.xml
app/src/main/res/layout/activity_event.xml
+4
-2
activity_event_code.xml
app/src/main/res/layout/activity_event_code.xml
+381
-0
dialog_date_time.xml
app/src/main/res/layout/dialog_date_time.xml
+122
-0
icondatetime.png
app/src/main/res/mipmap-xxhdpi/icondatetime.png
+0
-0
timeicon.png
app/src/main/res/mipmap-xxhdpi/timeicon.png
+0
-0
weizhi.png
app/src/main/res/mipmap-xxhdpi/weizhi.png
+0
-0
strings.xml
app/src/main/res/values/strings.xml
+3
-1
themes.xml
app/src/main/res/values/themes.xml
+60
-2
gradle.properties
gradle.properties
+2
-0
libs.versions.toml
gradle/libs.versions.toml
+2
-0
No files found.
app/build.gradle.kts
View file @
dec60fd7
...
...
@@ -97,6 +97,7 @@ dependencies {
//第三方UI控件
implementation
(
"io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"
)
implementation
(
"io.supercharge:shimmerlayout:2.1.0"
)
implementation
(
"com.github.Kunzisoft:Android-SwitchDateTimePicker:2.1"
)
//机器学习二维码扫描
...
...
app/src/main/AndroidManifest.xml
View file @
dec60fd7
...
...
@@ -4,7 +4,9 @@
<uses-feature
android:name=
"android.hardware.camera"
android:required=
"false"
/>
<!-- 获取wifi列表 -->
android:required=
"false"
/>
<!-- 获取wifi列表 -->
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.CHANGE_NETWORK_STATE"
/>
...
...
@@ -12,11 +14,15 @@
<uses-permission
android:name=
"android.permission.CHANGE_WIFI_STATE"
/>
<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<!-- 前台服务 -->
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<!-- 前台服务 -->
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE_DATA_SYNC"
/>
<uses-permission
android:name=
"android.permission.POST_NOTIFICATIONS"
/>
<uses-permission
android:name=
"android.permission.WRITE_CALENDAR"
/>
<application
android:name=
".MyApplication"
android:allowBackup=
"true"
...
...
@@ -28,6 +34,9 @@
android:supportsRtl=
"true"
android:theme=
"@style/Theme.ScanQR"
tools:targetApi=
"31"
>
<activity
android:name=
".ui.event.EventCodeActivity"
android:exported=
"false"
/>
<activity
android:name=
".ui.event.EventActivity"
android:exported=
"false"
/>
...
...
app/src/main/java/com/base/scanqr/MyApplication.kt
View file @
dec60fd7
...
...
@@ -107,9 +107,11 @@ class MyApplication : Application() {
private
fun
initGid
()
{
Thread
{
kotlin
.
runCatching
{
val
info
:
AdvertisingIdClient
.
Info
=
AdvertisingIdClient
.
getAdvertisingIdInfo
(
applicationContext
)
val
advertisingId
=
info
.
id
AppPreferences
.
getInstance
().
put
(
"gid"
,
advertisingId
)
}
}.
start
()
}
...
...
app/src/main/java/com/base/scanqr/ads/admob/AdInsertMgr.kt
View file @
dec60fd7
...
...
@@ -116,11 +116,11 @@ class AdInsertMgr {
}
fun
loadAd
(
context
:
Context
,
isUnLimit
:
Boolean
,
adEvent
:
AdEvent
)
{
if
(!
isUnLimit
)
{
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
INSERT
,
adEvent
))
{
this
.
showCallBack
?.
close
(
4
)
this
.
showCallBack
=
null
adState
.
onAdLoadFailed
()
return
}
}
...
...
app/src/main/java/com/base/scanqr/ads/admob/AdOpenMgr.kt
View file @
dec60fd7
...
...
@@ -119,6 +119,7 @@ class AdOpenMgr {
if
(!
LimitUtils
.
isAdShow
(
AdsType
.
OPEN
,
adEvent
))
{
this
.
showCallBack
?.
close
()
this
.
showCallBack
=
null
adState
.
onAdLoadFailed
()
return
}
}
...
...
app/src/main/java/com/base/scanqr/bean/EmailUIBean.kt
View file @
dec60fd7
package
com.base.scanqr.bean
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import
com.base.scanqr.utils.QRCodeUtils.getPairKeyValue
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
data class
EmailUIBean
(
var
address
:
String
=
""
,
var
subject
:
String
=
""
,
var
message
:
String
=
""
):
ScanBean
(
KEY_EMAIL
)
\ No newline at end of file
)
:
ScanBean
(
KEY_EMAIL
)
{
companion
object
{
fun
createEmailQrString
(
bean
:
EmailUIBean
):
String
{
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
val
qrContent
=
StringBuilder
()
qrContent
.
append
(
"MATMSG:"
)
qrContent
.
append
(
"TO:"
).
append
(
bean
.
address
).
append
(
";"
)
qrContent
.
append
(
"SUB:"
).
append
(
bean
.
subject
).
append
(
";"
)
qrContent
.
append
(
"BODY:"
).
append
(
bean
.
message
).
append
(
";"
)
return
qrContent
.
toString
()
}
fun
isEmailQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"MATMSG:"
)
if
(
flag
)
{
return
true
}
return
false
}
fun
createEmailBean
(
qrCodeValue
:
String
):
EmailUIBean
{
val
startTag
=
"MATMSG:"
val
subString
=
qrCodeValue
.
subSequence
(
startTag
.
length
,
qrCodeValue
.
length
)
val
splitList
=
subString
.
split
(
";"
)
val
emailUIBean
=
EmailUIBean
()
val
addressKV
=
splitList
.
find
{
it
.
startsWith
(
"TO:"
)
}
?:
""
emailUIBean
.
address
=
getPairKeyValue
(
addressKV
).
second
val
subKV
=
splitList
.
find
{
it
.
startsWith
(
"SUB:"
)
}
?:
""
emailUIBean
.
subject
=
getPairKeyValue
(
subKV
).
second
val
bodyKV
=
splitList
.
find
{
it
.
startsWith
(
"BODY:"
)
}
?:
""
emailUIBean
.
message
=
getPairKeyValue
(
bodyKV
).
second
return
emailUIBean
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/bean/EventUIBean.kt
View file @
dec60fd7
package
com.base.scanqr.bean
import
android.annotation.SuppressLint
import
org.jacoco.core.internal.flow.IFrame
import
java.text.SimpleDateFormat
import
java.util.TimeZone
//BEGIN:VEVENT
//SUMMARY:xxx
...
...
@@ -9,10 +14,73 @@ package com.base.scanqr.bean
//DESCRIPTION:xxxx
//END:VEVENT
data class
EventUIBean
(
val
summary
:
String
=
""
,
val
dtstart
:
String
=
""
,
val
dtend
:
String
=
""
,
val
location
:
String
=
""
,
val
description
:
String
=
""
)
:
ScanBean
(
FunctionUIBean
.
KEY_EVENT
)
\ No newline at end of file
var
summary
:
String
=
""
,
var
dtstart
:
String
=
""
,
var
dtend
:
String
=
""
,
var
location
:
String
=
""
,
var
description
:
String
=
""
)
:
ScanBean
(
FunctionUIBean
.
KEY_EVENT
)
{
var
startTime
:
Long
=
0
var
endTime
:
Long
=
0
companion
object
{
fun
isEventQR
(
qr
:
String
):
Boolean
{
if
(
qr
.
startsWith
(
"BEGIN:VEVENT"
)
&&
qr
.
endsWith
(
"END:VEVENT"
))
{
return
true
}
return
false
}
fun
createEventQRString
(
bean
:
EventUIBean
):
String
{
val
sb
=
StringBuilder
()
val
start
=
"BEGIN:VEVENT"
sb
.
append
(
start
).
append
(
"\n"
)
sb
.
append
(
"SUMMARY:"
).
append
(
bean
.
summary
).
append
(
"\n"
)
sb
.
append
(
"DTSTART:"
).
append
(
bean
.
dtstart
).
append
(
"\n"
)
sb
.
append
(
"DTEND:"
).
append
(
bean
.
dtend
).
append
(
"\n"
)
sb
.
append
(
"LOCATION:"
).
append
(
bean
.
location
).
append
(
"\n"
)
sb
.
append
(
"DESCRIPTION:"
).
append
(
bean
.
description
).
append
(
"\n"
)
val
end
=
"END:VEVENT"
sb
.
append
(
end
)
return
sb
.
toString
()
}
// DTSTART:20250102T060100
// DTEND:20250103T060100
@SuppressLint
(
"SimpleDateFormat"
)
fun
createEventBean
(
qr
:
String
):
EventUIBean
{
val
eventUIBean
=
EventUIBean
()
val
kvList
=
qr
.
split
(
"\n"
)
kvList
.
forEach
{
val
pair
=
it
.
split
(
":"
)
val
key
=
pair
[
0
]
val
value
=
pair
[
1
]
if
(
key
==
"SUMMARY"
)
{
eventUIBean
.
summary
=
value
}
if
(
key
==
"DTSTART"
)
{
eventUIBean
.
dtstart
=
value
}
if
(
key
==
"DTEND"
)
{
eventUIBean
.
dtend
=
value
}
if
(
key
==
"LOCATION"
)
{
eventUIBean
.
location
=
value
}
if
(
key
==
"DESCRIPTION"
)
{
eventUIBean
.
description
=
value
}
}
val
format
=
SimpleDateFormat
(
"yyyyMMdd'T'HHmmss"
)
format
.
timeZone
=
TimeZone
.
getTimeZone
(
"UTC"
)
eventUIBean
.
startTime
=
format
.
parse
(
eventUIBean
.
dtstart
)
?.
time
?:
0
eventUIBean
.
endTime
=
format
.
parse
(
eventUIBean
.
dtend
)
?.
time
?:
0
return
eventUIBean
}
}
}
app/src/main/java/com/base/scanqr/bean/WebsiteUIBean.kt
View file @
dec60fd7
...
...
@@ -2,4 +2,21 @@ package com.base.scanqr.bean
data class
WebsiteUIBean
(
var
http
:
String
=
""
)
:
ScanBean
(
FunctionUIBean
.
KEY_WEBSITE
)
\ No newline at end of file
)
:
ScanBean
(
FunctionUIBean
.
KEY_WEBSITE
)
{
companion
object
{
fun
isWebsiteQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"http://"
)
||
qrCodeValue
.
startsWith
(
"https://"
)
if
(
flag
)
{
return
true
}
return
false
}
fun
createWebsiteBean
(
qrCodeValue
:
String
):
WebsiteUIBean
{
val
websiteUIBean
=
WebsiteUIBean
()
websiteUIBean
.
http
=
qrCodeValue
return
websiteUIBean
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/bean/WifiUIBean.kt
View file @
dec60fd7
package
com.base.scanqr.bean
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_WIFI
import
com.base.scanqr.utils.QRCodeUtils.getPairKeyValue
data class
WifiUIBean
(
...
...
@@ -11,4 +12,43 @@ data class WifiUIBean(
)
:
ScanBean
(
KEY_WIFI
)
{
var
password
:
String
=
""
var
hidden
:
Boolean
=
false
companion
object
{
fun
isWifiQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"WIFI:"
)
if
(
flag
)
{
return
true
}
return
false
}
fun
createWifiBean
(
qrCodeValue
:
String
):
WifiUIBean
{
val
startTag
=
"WIFI:"
val
subString
=
qrCodeValue
.
subSequence
(
startTag
.
length
,
qrCodeValue
.
length
)
val
splitList
=
subString
.
split
(
";"
)
val
wifiUIBean
=
WifiUIBean
()
val
ssidKV
=
splitList
.
find
{
it
.
startsWith
(
"S:"
)
}
?:
""
wifiUIBean
.
ssid
=
getPairKeyValue
(
ssidKV
).
second
val
passWordKV
=
splitList
.
find
{
it
.
startsWith
(
"P:"
)
}
?:
""
wifiUIBean
.
password
=
getPairKeyValue
(
passWordKV
).
second
val
hiddenKV
=
splitList
.
find
{
it
.
startsWith
(
"H:"
)
}
?:
""
wifiUIBean
.
hidden
=
getPairKeyValue
(
hiddenKV
).
second
.
toBoolean
()
val
securityKy
=
splitList
.
find
{
it
.
startsWith
(
"T"
)
}
if
(
securityKy
.
equals
(
"WPA/WPA2"
))
{
wifiUIBean
.
securityId
=
0
}
if
(
securityKy
.
equals
(
"WEP"
))
{
wifiUIBean
.
securityId
=
1
}
if
(
securityKy
.
equals
(
""
))
{
wifiUIBean
.
securityId
=
0
}
return
wifiUIBean
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/ui/email/EmailCodeActivity.kt
View file @
dec60fd7
...
...
@@ -8,6 +8,7 @@ import com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
import
com.base.scanqr.base.BaseActivity
import
com.base.scanqr.bean.EmailUIBean
import
com.base.scanqr.bean.EmailUIBean.Companion.createEmailQrString
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import
com.base.scanqr.databinding.ActivityEmailCodeBinding
import
com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
...
...
@@ -27,7 +28,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
private
var
email
=
EmailUIBean
()
private
var
tempImage
:
String
=
""
private
var
content
:
String
=
""
private
var
emailQrString
:
String
=
""
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
...
...
@@ -49,16 +50,9 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
binding
.
tvSubject
.
text
=
email
.
subject
binding
.
tvMessage
.
text
=
email
.
message
//MATMSG:TO:xxxx;SUB:xxx;BODY:xxx;
val
qrContent
=
StringBuilder
()
qrContent
.
append
(
"MATMSG:"
)
qrContent
.
append
(
"TO:"
).
append
(
email
.
address
).
append
(
";"
)
qrContent
.
append
(
"SUB:"
).
append
(
email
.
subject
).
append
(
";"
)
qrContent
.
append
(
"BODY:"
).
append
(
email
.
message
).
append
(
";"
)
content
=
qrContent
.
toString
()
Thread
{
val
bitmap
=
generateQRCode
(
content
,
735
,
735
,
5
)
emailQrString
=
createEmailQrString
(
email
)
val
bitmap
=
generateQRCode
(
emailQrString
,
735
,
735
,
5
)
runOnUiThread
{
binding
.
ivQr
.
setImageBitmap
(
bitmap
)
val
file
=
File
(
cacheDir
,
System
.
currentTimeMillis
().
toString
()
+
".jpg"
)
...
...
@@ -131,7 +125,7 @@ class EmailCodeActivity : BaseActivity<ActivityEmailCodeBinding>(ActivityEmailCo
}
}
binding
.
llCopy
.
setOnClickListener
{
copyText
(
TAG
,
content
)
copyText
(
TAG
,
emailQrString
)
toast
(
"Copied to clipboard"
,
true
)
}
binding
.
flSearch
.
setOnClickListener
{
...
...
app/src/main/java/com/base/scanqr/ui/event/EventActivity.kt
View file @
dec60fd7
package
com.base.scanqr.ui.event
import
android.annotation.SuppressLint
import
android.content.Intent
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
androidx.core.widget.addTextChangedListener
import
com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
import
com.base.scanqr.base.BaseActivity
import
com.base.scanqr.bean.ConstObject.appLanguageSp
import
com.base.scanqr.bean.EventUIBean
import
com.base.scanqr.databinding.ActivityEventBinding
import
com.base.scanqr.utils.BarUtils
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.ToastUtils.toast
import
com.google.gson.Gson
import
com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment
import
com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment.OnButtonWithNeutralClickListener
import
com.kunzisoft.switchdatetime.SwitchDateTimeDialogFragment.SimpleDateMonthAndDayFormatException
import
java.text.SimpleDateFormat
import
java.util.Calendar
import
java.util.Date
import
java.util.GregorianCalendar
import
java.util.Locale
import
java.util.TimeZone
class
EventActivity
:
BaseActivity
<
ActivityEventBinding
>(
ActivityEventBinding
::
inflate
)
{
private
val
eventUIBean
=
EventUIBean
()
private
var
dateTimeFragment
:
SwitchDateTimeDialogFragment
?
=
null
private
val
tagDatetimeFragment
:
String
=
"tag_datetime_fragment"
private
var
startTime
=
Date
(
System
.
currentTimeMillis
())
private
var
endTime
=
Date
(
System
.
currentTimeMillis
())
private
var
setStartOrEnd
:
Boolean
=
false
//start:true ;end:false
@SuppressLint
(
"SimpleDateFormat"
)
private
val
dateTimeFormatter
=
SimpleDateFormat
(
"yyyyMMdd_HHmmss"
)
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
val
flag
=
changeLanguage
()
...
...
@@ -25,6 +48,81 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
super
.
initView
()
binding
.
clTop
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_item
)
initDateTimeFragment
()
}
private
fun
initDateTimeFragment
()
{
dateTimeFragment
=
supportFragmentManager
.
findFragmentByTag
(
tagDatetimeFragment
)
as
SwitchDateTimeDialogFragment
?
if
(
dateTimeFragment
==
null
)
{
dateTimeFragment
=
SwitchDateTimeDialogFragment
.
newInstance
(
getString
(
R
.
string
.
datetime
),
getString
(
R
.
string
.
ok
),
getString
(
R
.
string
.
cancel
),
getString
(
R
.
string
.
clean
),
// Optional
appLanguageSp
)
}
// Optionally define a timezone
dateTimeFragment
?.
setTimeZone
(
TimeZone
.
getDefault
())
// Assign unmodifiable values
dateTimeFragment
?.
set24HoursMode
(
false
)
dateTimeFragment
?.
setHighlightAMPMSelection
(
false
)
dateTimeFragment
?.
minimumDateTime
=
GregorianCalendar
(
1970
,
Calendar
.
JANUARY
,
1
).
time
dateTimeFragment
?.
maximumDateTime
=
GregorianCalendar
(
2200
,
Calendar
.
DECEMBER
,
30
).
time
dateTimeFragment
?.
setAlertStyle
(
R
.
style
.
DateTimeAlert
)
// Define new day and month format
// 20241230T072300
try
{
dateTimeFragment
?.
simpleDateMonthAndDayFormat
=
SimpleDateFormat
(
"MMMM dd"
,
Locale
.
getDefault
())
}
catch
(
e
:
SimpleDateMonthAndDayFormatException
)
{
}
// Set listener for date
// Or use dateTimeFragment.setOnButtonClickListener(new SwitchDateTimeDialogFragment.OnButtonClickListener() {
dateTimeFragment
?.
setOnButtonClickListener
(
object
:
OnButtonWithNeutralClickListener
{
override
fun
onPositiveButtonClick
(
date
:
Date
)
{
val
dateTime
=
dateTimeFormatter
.
format
(
startTime
).
split
(
"_"
)
val
dateTimeS
=
dateTime
[
0
]
+
"T"
+
dateTime
[
1
]
kotlin
.
runCatching
{
LogEx
.
logDebug
(
TAG
,
"dateTimeS=${dateTimeS}"
)
if
(
setStartOrEnd
)
{
binding
.
tvStartDate
.
text
=
createDDMMYYYY
(
date
)
startTime
=
date
eventUIBean
.
dtstart
=
dateTimeS
}
else
{
endTime
=
date
if
(
endTime
.
before
(
startTime
))
{
this
@EventActivity
.
toast
(
"please choose end time"
,
true
)
endTime
=
Date
(
System
.
currentTimeMillis
())
return
}
binding
.
tvEndDate
.
text
=
createDDMMYYYY
(
date
)
eventUIBean
.
dtend
=
dateTimeS
}
}
}
override
fun
onNegativeButtonClick
(
date
:
Date
)
{
}
override
fun
onNeutralButtonClick
(
date
:
Date
)
{
if
(
setStartOrEnd
)
{
binding
.
tvStartDate
.
text
=
this
@EventActivity
.
resources
.
getString
(
R
.
string
.
begin_time
)
eventUIBean
.
dtstart
=
""
}
else
{
binding
.
tvEndDate
.
text
=
this
@EventActivity
.
resources
.
getString
(
R
.
string
.
end_time
)
eventUIBean
.
dtend
=
""
}
}
})
}
override
fun
initListener
()
{
...
...
@@ -47,6 +145,68 @@ class EventActivity : BaseActivity<ActivityEventBinding>(ActivityEventBinding::i
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
binding
.
editName
.
addTextChangedListener
{
s
->
eventUIBean
.
summary
=
s
.
toString
()
}
binding
.
editLocation
.
addTextChangedListener
{
s
->
eventUIBean
.
location
=
s
.
toString
()
}
binding
.
editDescription
.
addTextChangedListener
{
s
->
eventUIBean
.
description
=
s
.
toString
()
}
binding
.
llBeginTime
.
setOnClickListener
{
val
flag
=
supportFragmentManager
.
findFragmentByTag
(
tagDatetimeFragment
)
!=
null
if
(
dateTimeFragment
?.
isAdded
==
true
&&
flag
)
return
@setOnClickListener
setStartOrEnd
=
true
dateTimeFragment
?.
startAtCalendarView
()
dateTimeFragment
?.
setDefaultDateTime
(
startTime
)
dateTimeFragment
?.
show
(
supportFragmentManager
,
tagDatetimeFragment
)
}
binding
.
llEndTime
.
setOnClickListener
{
val
flag
=
supportFragmentManager
.
findFragmentByTag
(
tagDatetimeFragment
)
!=
null
if
(
dateTimeFragment
?.
isAdded
==
true
&&
flag
)
return
@setOnClickListener
setStartOrEnd
=
false
dateTimeFragment
?.
startAtCalendarView
()
dateTimeFragment
?.
setDefaultDateTime
(
endTime
)
dateTimeFragment
?.
show
(
supportFragmentManager
,
tagDatetimeFragment
)
}
binding
.
flQueren
.
setOnClickListener
{
if
(
eventUIBean
.
summary
.
isEmpty
())
{
toast
(
"Enter title event"
,
true
)
return
@setOnClickListener
}
if
(
eventUIBean
.
location
.
isEmpty
())
{
toast
(
"Enter location event"
,
true
)
return
@setOnClickListener
}
if
(
eventUIBean
.
description
.
isEmpty
())
{
toast
(
"Enter description event"
,
true
)
return
@setOnClickListener
}
if
(
eventUIBean
.
dtstart
.
isEmpty
())
{
toast
(
"Please choose begin Time"
,
true
)
return
@setOnClickListener
}
if
(
eventUIBean
.
dtend
.
isEmpty
())
{
toast
(
"Please choose end Time"
,
true
)
return
@setOnClickListener
}
startActivity
(
Intent
(
this
,
EventCodeActivity
::
class
.
java
).
apply
{
eventUIBean
.
startTime
=
startTime
.
time
eventUIBean
.
endTime
=
endTime
.
time
putExtra
(
"data"
,
Gson
().
toJson
(
eventUIBean
))
})
finish
()
}
}
fun
createDDMMYYYY
(
date
:
Date
):
String
{
val
format
=
SimpleDateFormat
(
"dd/MMMM/yyyy"
,
Locale
.
ENGLISH
)
return
format
.
format
(
date
)
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/ui/event/EventCodeActivity.kt
0 → 100644
View file @
dec60fd7
package
com.base.scanqr.ui.event
import
android.Manifest
import
android.annotation.SuppressLint
import
android.os.Environment
import
androidx.activity.addCallback
import
androidx.core.view.updatePadding
import
com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
import
com.base.scanqr.base.BaseActivity
import
com.base.scanqr.bean.EventUIBean
import
com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.databinding.ActivityEventCodeBinding
import
com.base.scanqr.ui.widget.InputNameDialog.showInputNameDialog
import
com.base.scanqr.utils.BarUtils
import
com.base.scanqr.utils.BitmapUtils.saveBitmapToFile
import
com.base.scanqr.utils.ClipboardUtils.copyText
import
com.base.scanqr.utils.IntentUtils.intentAddCalendar
import
com.base.scanqr.utils.IntentUtils.intentShareImage
import
com.base.scanqr.utils.KotlinExt.toFormatTime5
import
com.base.scanqr.utils.LogEx
import
com.base.scanqr.utils.QRCodeUtils.generateQRCode
import
com.base.scanqr.utils.SpJsonUtils
import
com.base.scanqr.utils.ToastUtils.toast
import
com.google.gson.Gson
import
java.io.File
class
EventCodeActivity
:
BaseActivity
<
ActivityEventCodeBinding
>(
ActivityEventCodeBinding
::
inflate
)
{
private
var
eventUIBean
=
EventUIBean
()
private
var
tempImage
:
String
=
""
private
var
eventQrString
=
""
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
val
flag
=
changeLanguage
()
if
(
flag
)
return
AdsMgr
.
showBanner
(
binding
.
flBanner
,
false
)
}
@SuppressLint
(
"SetTextI18n"
)
override
fun
initView
()
{
super
.
initView
()
binding
.
clTop
.
updatePadding
(
top
=
BarUtils
.
getStatusBarHeight
())
launcher
.
launch
(
arrayOf
(
Manifest
.
permission
.
WRITE_CALENDAR
))
{}
AdsMgr
.
showNative
(
binding
.
flAd
,
R
.
layout
.
layout_admob_item
)
val
data
=
intent
.
extras
?.
getString
(
"data"
)
data
?.
let
{
eventUIBean
=
Gson
().
fromJson
(
data
,
EventUIBean
::
class
.
java
)
binding
.
tvDateTime
.
text
=
eventUIBean
.
startTime
.
toFormatTime5
()
+
" - "
+
eventUIBean
.
endTime
.
toFormatTime5
()
binding
.
tvLocation
.
text
=
eventUIBean
.
location
binding
.
tvDesc
.
text
=
eventUIBean
.
description
}
Thread
{
eventQrString
=
EventUIBean
.
createEventQRString
(
eventUIBean
)
LogEx
.
logDebug
(
TAG
,
"eventQrString=$eventQrString"
)
val
bitmap
=
generateQRCode
(
eventQrString
,
735
,
735
,
5
)
runOnUiThread
{
binding
.
ivQr
.
setImageBitmap
(
bitmap
)
val
file
=
File
(
cacheDir
,
System
.
currentTimeMillis
().
toString
()
+
".jpg"
)
bitmap
?.
let
{
val
flag
=
saveBitmapToFile
(
it
,
file
.
absolutePath
)
LogEx
.
logDebug
(
TAG
,
"flag=$flag tempImage=${file.absolutePath}"
)
if
(
flag
)
{
tempImage
=
file
.
absolutePath
}
}
if
(
eventUIBean
.
needCreate
)
{
eventUIBean
.
needCreate
=
false
SpJsonUtils
.
addJsonBean
<
EventUIBean
>(
FunctionUIBean
.
KEY_EVENT
,
eventUIBean
)
}
}
}.
start
()
}
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
AdsMgr
.
showInsert
(
this
@EventCodeActivity
,
false
,
object
:
AdsShowCallBack
()
{
override
fun
close
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
failed
(
where
:
Int
)
{
finishToMainTop
()
}
override
fun
googleFailed
(
where
:
Int
)
{
finishToMainTop
()
}
})
}
binding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
binding
.
llShare
.
setOnClickListener
{
val
intent
=
intentShareImage
(
this
,
tempImage
)
runCatching
{
startActivity
(
intent
)
}
}
binding
.
llPdf
.
setOnClickListener
{
toast
(
"没实现"
)
}
binding
.
llDownload
.
setOnClickListener
{
kotlin
.
runCatching
{
val
appFile
=
File
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOWNLOADS
),
this
.
resources
.
getString
(
R
.
string
.
app_name
)
)
if
(!
appFile
.
exists
())
appFile
.
mkdirs
()
var
newName
=
File
(
tempImage
).
name
showInputNameDialog
(
newName
)
{
name
->
if
(
name
.
endsWith
(
".jpg"
))
{
name
.
also
{
newName
=
it
}
}
else
{
newName
=
"$name.jpg"
}
val
downFile
=
File
(
appFile
,
newName
)
downFile
.
createNewFile
()
File
(
tempImage
).
copyTo
(
downFile
,
true
)
toast
(
"Save to:${appFile.absolutePath}"
,
true
)
}
}
}
binding
.
llCopy
.
setOnClickListener
{
copyText
(
TAG
,
eventQrString
)
toast
(
"Copied to clipboard"
,
true
)
}
binding
.
flSearch
.
setOnClickListener
{
val
intent
=
intentAddCalendar
(
eventUIBean
)
try
{
startActivity
(
intent
)
finish
()
}
catch
(
e
:
Exception
)
{
toast
(
"No application was found to handle the calendar event request"
,
true
)
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/ui/main/HistoryAdapter.kt
View file @
dec60fd7
...
...
@@ -7,6 +7,7 @@ import com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.bean.AdScanBean
import
com.base.scanqr.bean.EmailUIBean
import
com.base.scanqr.bean.EventUIBean
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_CONTACT
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EMAIL
import
com.base.scanqr.bean.FunctionUIBean.Companion.KEY_EVENT
...
...
@@ -77,7 +78,9 @@ class HistoryAdapter : BaseQuickAdapter<ScanBean, CommonViewHolder>() {
}
KEY_EVENT
->
{
if
(
item
is
EventUIBean
)
{
binding
.
ivIcon
.
setImageResource
(
R
.
mipmap
.
h_event
)
}
}
KEY_CONTACT
->
{
...
...
app/src/main/java/com/base/scanqr/ui/main/HistoryFragment.kt
View file @
dec60fd7
...
...
@@ -13,6 +13,7 @@ import com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.bean.ScanBean
import
com.base.scanqr.databinding.FragmentHistoryBinding
import
com.base.scanqr.ui.email.EmailCodeActivity
import
com.base.scanqr.ui.event.EventCodeActivity
import
com.base.scanqr.ui.product.ProductCodeActivity
import
com.base.scanqr.ui.text.TextCodeActivity
import
com.base.scanqr.ui.website.WebsiteCodeActivity
...
...
@@ -99,6 +100,12 @@ class HistoryFragment : BaseFragment<FragmentHistoryBinding>(FragmentHistoryBind
putExtra
(
"data"
,
Gson
().
toJson
(
item
))
})
}
FunctionUIBean
.
KEY_EVENT
->
{
activity
?.
startActivity
(
Intent
(
activity
,
EventCodeActivity
::
class
.
java
).
apply
{
putExtra
(
"data"
,
Gson
().
toJson
(
item
))
})
}
}
}
...
...
app/src/main/java/com/base/scanqr/ui/main/HistoryViewModel.kt
View file @
dec60fd7
...
...
@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import
androidx.lifecycle.viewModelScope
import
com.base.scanqr.bean.AdScanBean
import
com.base.scanqr.bean.EmailUIBean
import
com.base.scanqr.bean.EventUIBean
import
com.base.scanqr.bean.FunctionUIBean
import
com.base.scanqr.bean.ProductUIBean
import
com.base.scanqr.bean.ScanBean
...
...
@@ -37,12 +38,15 @@ class HistoryViewModel() : ViewModel() {
websiteList
.
forEach
{
it
.
listContent
=
it
.
http
}
val
productList
=
SpJsonUtils
.
getSpJsonList
<
ProductUIBean
>(
FunctionUIBean
.
KEY_PRODUCT
)
productList
.
forEach
{
it
.
listContent
=
it
.
content
}
val
eventList
=
SpJsonUtils
.
getSpJsonList
<
EventUIBean
>(
FunctionUIBean
.
KEY_EVENT
)
eventList
.
forEach
{
it
.
listContent
=
it
.
summary
}
historyList
.
addAll
(
wifiList
)
historyList
.
addAll
(
textList
)
historyList
.
addAll
(
emailList
)
historyList
.
addAll
(
websiteList
)
historyList
.
addAll
(
productList
)
historyList
.
addAll
(
eventList
)
historyList
.
forEach
{
LogEx
.
logDebug
(
TAG
,
"${it.scanType} ${it.createTime} ${it.createType} ${it.listContent}"
)
...
...
@@ -92,7 +96,11 @@ class HistoryViewModel() : ViewModel() {
it1
.
createTime
==
it2
.
createTime
})
}
FunctionUIBean
.
KEY_EVENT
->{
SpJsonUtils
.
removeJsonBean
<
EventUIBean
>(
bean
.
scanType
,
bean
as
EventUIBean
,
removeIf
=
{
it1
,
it2
->
it1
.
createTime
==
it2
.
createTime
})
}
}
historyList
.
remove
(
bean
)
...
...
app/src/main/java/com/base/scanqr/ui/main/ScanFragment.kt
View file @
dec60fd7
...
...
@@ -13,12 +13,21 @@ import com.base.scanqr.R
import
com.base.scanqr.ads.AdsMgr
import
com.base.scanqr.ads.AdsShowCallBack
import
com.base.scanqr.base.BaseFragment
import
com.base.scanqr.bean.EmailUIBean.Companion.createEmailBean
import
com.base.scanqr.bean.EmailUIBean.Companion.isEmailQR
import
com.base.scanqr.bean.EventUIBean.Companion.createEventBean
import
com.base.scanqr.bean.EventUIBean.Companion.isEventQR
import
com.base.scanqr.bean.ProductUIBean
import
com.base.scanqr.bean.ScanBean.Companion.CREATE_TYPE_SCAN
import
com.base.scanqr.bean.TextUIBean
import
com.base.scanqr.bean.WebsiteUIBean.Companion.createWebsiteBean
import
com.base.scanqr.bean.WebsiteUIBean.Companion.isWebsiteQR
import
com.base.scanqr.bean.WifiUIBean.Companion.createWifiBean
import
com.base.scanqr.bean.WifiUIBean.Companion.isWifiQR
import
com.base.scanqr.databinding.FragmentScanBinding
import
com.base.scanqr.qr.QRImageAnalyzer
import
com.base.scanqr.ui.email.EmailCodeActivity
import
com.base.scanqr.ui.event.EventCodeActivity
import
com.base.scanqr.ui.product.ProductCodeActivity
import
com.base.scanqr.ui.text.TextCodeActivity
import
com.base.scanqr.ui.website.WebsiteCodeActivity
...
...
@@ -135,8 +144,26 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
})
return
}
if
(
isEventQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
AdsMgr
.
showInsert
(
activity
,
false
,
object
:
AdsShowCallBack
()
{
override
fun
close
(
where
:
Int
)
{
jumpEventCodeActivity
(
activity
,
qrCodeValue
)
}
override
fun
failed
(
where
:
Int
)
{
jumpEventCodeActivity
(
activity
,
qrCodeValue
)
}
override
fun
googleFailed
(
where
:
Int
)
{
jumpEventCodeActivity
(
activity
,
qrCodeValue
)
}
})
return
}
if
(
QRCodeUtils
.
isWifiQR
(
qrCodeValue
))
{
if
(
isWifiQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
AdsMgr
.
showInsert
(
activity
,
false
,
object
:
AdsShowCallBack
()
{
...
...
@@ -155,7 +182,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return
}
if
(
QRCodeUtils
.
isEmailQR
(
qrCodeValue
))
{
if
(
isEmailQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
AdsMgr
.
showInsert
(
activity
,
false
,
object
:
AdsShowCallBack
()
{
...
...
@@ -174,7 +201,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
return
}
if
(
QRCodeUtils
.
isWebsiteQR
(
qrCodeValue
))
{
if
(
isWebsiteQR
(
qrCodeValue
))
{
if
(
scanJump
.
get
())
return
scanJump
.
set
(
true
)
AdsMgr
.
showInsert
(
activity
,
false
,
object
:
AdsShowCallBack
()
{
...
...
@@ -216,6 +243,15 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
}
}
private
fun
jumpEventCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
EventCodeActivity
::
class
.
java
).
apply
{
val
bean
=
createEventBean
(
qrCodeValue
)
bean
.
needCreate
=
true
bean
.
createType
=
CREATE_TYPE_SCAN
putExtra
(
"data"
,
Gson
().
toJson
(
bean
))
})
}
private
fun
jumpTextCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
TextCodeActivity
::
class
.
java
).
apply
{
val
bean
=
TextUIBean
()
...
...
@@ -228,7 +264,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private
fun
jumpWebsiteCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
WebsiteCodeActivity
::
class
.
java
).
apply
{
val
bean
=
QRCodeUtils
.
createWebsiteBean
(
qrCodeValue
)
val
bean
=
createWebsiteBean
(
qrCodeValue
)
bean
.
needCreate
=
true
bean
.
createType
=
CREATE_TYPE_SCAN
putExtra
(
"data"
,
Gson
().
toJson
(
bean
))
...
...
@@ -237,7 +273,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private
fun
jumpEmailCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
EmailCodeActivity
::
class
.
java
).
apply
{
val
bean
=
QRCodeUtils
.
createEmailBean
(
qrCodeValue
)
val
bean
=
createEmailBean
(
qrCodeValue
)
bean
.
needCreate
=
true
bean
.
createType
=
CREATE_TYPE_SCAN
putExtra
(
"data"
,
Gson
().
toJson
(
bean
))
...
...
@@ -246,7 +282,7 @@ class ScanFragment : BaseFragment<FragmentScanBinding>(FragmentScanBinding::infl
private
fun
jumpWifiCodeActivity
(
activity
:
MainActivity
,
qrCodeValue
:
String
)
{
activity
.
startActivity
(
Intent
(
activity
,
WifiCodeActivity
::
class
.
java
).
apply
{
val
bean
=
QRCodeUtils
.
createWifiBean
(
qrCodeValue
)
val
bean
=
createWifiBean
(
qrCodeValue
)
bean
.
needCreate
=
true
bean
.
createType
=
CREATE_TYPE_SCAN
putExtra
(
"data"
,
Gson
().
toJson
(
bean
))
...
...
app/src/main/java/com/base/scanqr/ui/start/StartActivity.kt
View file @
dec60fd7
...
...
@@ -20,6 +20,7 @@ import com.base.scanqr.databinding.ActivityStartBinding
import
com.base.scanqr.fcm.notification.NotificationHoverUtils
import
com.base.scanqr.service.StayJobService.Companion.startJob
import
com.base.scanqr.ui.email.EmailActivity
import
com.base.scanqr.ui.event.EventActivity
import
com.base.scanqr.ui.language.LanguageActivity
import
com.base.scanqr.ui.main.MainActivity
import
com.base.scanqr.ui.text.TextActivity
...
...
@@ -43,6 +44,10 @@ class StartActivity : BaseActivity<ActivityStartBinding>(ActivityStartBinding::i
override
fun
initView
()
{
super
.
initView
()
startActivity
(
Intent
(
this
,
EventActivity
::
class
.
java
))
finish
()
return
NotificationHoverUtils
.
stopNotificationHandler
()
if
(
ConstObject
.
ifAgreePrivacy
)
{
...
...
app/src/main/java/com/base/scanqr/ui/widget/DateTimeDialog.kt
0 → 100644
View file @
dec60fd7
package
com.base.scanqr.ui.widget
import
android.app.AlertDialog
import
android.content.Context
import
android.view.Gravity
import
android.view.LayoutInflater
import
com.base.scanqr.databinding.DialogDateTimeBinding
object
DateTimeDialog
{
fun
Context
.
showDateTimeDialog
()
{
val
dialog
=
AlertDialog
.
Builder
(
this
).
create
()
val
binding
=
DialogDateTimeBinding
.
inflate
(
LayoutInflater
.
from
(
this
))
dialog
.
setView
(
binding
.
root
)
dialog
.
setCanceledOnTouchOutside
(
false
)
dialog
.
show
()
val
params
=
dialog
.
window
?.
attributes
// params?.width = resources.getDimensionPixelOffset(R.dimen.dp_320)
// params?.height = resources.getDimensionPixelOffset(R.dimen.dp_400)
params
?.
gravity
=
Gravity
.
CENTER
// params?.y = 50
dialog
.
window
?.
attributes
=
params
dialog
.
window
?.
setBackgroundDrawableResource
(
android
.
R
.
color
.
transparent
)
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/ui/wifi/WifiCodeActivity.kt
View file @
dec60fd7
...
...
@@ -27,7 +27,7 @@ import java.io.File
class
WifiCodeActivity
:
BaseActivity
<
ActivityWifiCodeBinding
>(
ActivityWifiCodeBinding
::
inflate
)
{
private
var
wifiBean
:
WifiUIBean
=
WifiUIBean
()
private
var
wifi
Content
:
String
=
""
private
var
wifi
QrString
:
String
=
""
private
var
tempImage
:
String
=
""
override
fun
onResumeOneShoot
()
{
...
...
@@ -70,8 +70,8 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
content
.
append
(
"H:"
)
content
.
append
(
wifiBean
.
hidden
).
append
(
";"
)
wifi
Content
=
content
.
toString
()
LogEx
.
logDebug
(
TAG
,
"wifiContent=$wifi
Content
"
)
wifi
QrString
=
content
.
toString
()
LogEx
.
logDebug
(
TAG
,
"wifiContent=$wifi
QrString
"
)
binding
.
tvSsid
.
text
=
wifiBean
.
ssid
binding
.
tvPassword
.
text
=
wifiBean
.
password
...
...
@@ -81,7 +81,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
binding
.
tvHidden
.
text
=
"NO"
}
Thread
{
val
bitmap
=
generateQRCode
(
wifi
Content
,
735
,
735
,
5
)
val
bitmap
=
generateQRCode
(
wifi
QrString
,
735
,
735
,
5
)
runOnUiThread
{
binding
.
ivQr
.
setImageBitmap
(
bitmap
)
val
file
=
File
(
cacheDir
,
System
.
currentTimeMillis
().
toString
()
+
".jpg"
)
...
...
@@ -154,7 +154,7 @@ class WifiCodeActivity : BaseActivity<ActivityWifiCodeBinding>(ActivityWifiCodeB
}
}
binding
.
llCopy
.
setOnClickListener
{
copyText
(
TAG
,
wifi
Content
)
copyText
(
TAG
,
wifi
QrString
)
toast
(
"Copied to clipboard"
,
true
)
}
binding
.
flSearch
.
setOnClickListener
{
...
...
app/src/main/java/com/base/scanqr/utils/IntentUtils.kt
View file @
dec60fd7
...
...
@@ -4,10 +4,15 @@ import android.content.Context
import
android.content.Intent
import
android.net.Uri
import
android.os.Build
import
android.provider.CalendarContract
import
android.provider.Settings
import
androidx.core.content.FileProvider
import
com.base.scanqr.bean.EmailUIBean
import
com.base.scanqr.bean.EventUIBean
import
java.io.File
import
java.util.GregorianCalendar
import
java.util.TimeZone
object
IntentUtils
{
...
...
@@ -83,4 +88,29 @@ object IntentUtils {
intent
.
setData
(
Uri
.
parse
(
url
))
return
intent
}
fun
intentAddCalendar
(
eventUIBean
:
EventUIBean
):
Intent
{
val
intent
=
Intent
(
Intent
.
ACTION_INSERT
)
intent
.
setData
(
CalendarContract
.
Events
.
CONTENT_URI
)
// 设置事件标题
intent
.
putExtra
(
CalendarContract
.
Events
.
TITLE
,
eventUIBean
.
summary
)
val
startCalendar
=
GregorianCalendar
()
startCalendar
.
timeInMillis
=
eventUIBean
.
startTime
startCalendar
.
setTimeZone
(
TimeZone
.
getTimeZone
(
"UTC"
))
// 设置时区为UTC
intent
.
putExtra
(
CalendarContract
.
EXTRA_EVENT_BEGIN_TIME
,
startCalendar
.
timeInMillis
)
val
endCalendar
=
GregorianCalendar
()
endCalendar
.
timeInMillis
=
eventUIBean
.
endTime
endCalendar
.
setTimeZone
(
TimeZone
.
getTimeZone
(
"UTC"
))
// 设置时区为UTC
intent
.
putExtra
(
CalendarContract
.
EXTRA_EVENT_END_TIME
,
endCalendar
.
timeInMillis
)
intent
.
putExtra
(
CalendarContract
.
Events
.
AVAILABILITY
,
CalendarContract
.
Events
.
AVAILABILITY_BUSY
)
intent
.
putExtra
(
CalendarContract
.
Events
.
EVENT_TIMEZONE
,
TimeZone
.
getDefault
().
id
)
// 设置事件描述(可选)
intent
.
putExtra
(
CalendarContract
.
Events
.
DESCRIPTION
,
eventUIBean
.
description
)
// 设置事件地点
intent
.
putExtra
(
CalendarContract
.
Events
.
EVENT_LOCATION
,
eventUIBean
.
location
)
return
intent
}
}
\ No newline at end of file
app/src/main/java/com/base/scanqr/utils/KotlinExt.kt
View file @
dec60fd7
...
...
@@ -41,6 +41,10 @@ object KotlinExt {
return
SimpleDateFormat
(
"yyyy-MM-dd"
,
Locale
.
ENGLISH
).
format
(
this
)
}
fun
Long
.
toFormatTime5
():
String
{
return
SimpleDateFormat
(
"hh:mm a, yyyy.M.dd"
,
Locale
.
ENGLISH
).
format
(
this
)
}
fun
Long
.
toFormatMinute
():
String
{
return
SimpleDateFormat
(
"mm"
,
Locale
.
ENGLISH
).
format
(
this
)
}
...
...
app/src/main/java/com/base/scanqr/utils/QRCodeUtils.kt
View file @
dec60fd7
...
...
@@ -98,7 +98,7 @@ object QRCodeUtils {
}
}
private
fun
getPairKeyValue
(
keyValue
:
String
):
Pair
<
String
,
String
>
{
fun
getPairKeyValue
(
keyValue
:
String
):
Pair
<
String
,
String
>
{
val
split
=
keyValue
.
split
(
":"
)
var
key
=
""
kotlin
.
runCatching
{
...
...
@@ -111,85 +111,4 @@ object QRCodeUtils {
return
Pair
(
key
,
value
)
}
fun
isWifiQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"WIFI:"
)
if
(
flag
)
{
return
true
}
return
false
}
fun
createWifiBean
(
qrCodeValue
:
String
):
WifiUIBean
{
val
startTag
=
"WIFI:"
val
subString
=
qrCodeValue
.
subSequence
(
startTag
.
length
,
qrCodeValue
.
length
)
LogEx
.
logDebug
(
TAG
,
"subString=$subString"
)
val
splitList
=
subString
.
split
(
";"
)
val
wifiUIBean
=
WifiUIBean
()
val
ssidKV
=
splitList
.
find
{
it
.
startsWith
(
"S:"
)
}
?:
""
wifiUIBean
.
ssid
=
getPairKeyValue
(
ssidKV
).
second
val
passWordKV
=
splitList
.
find
{
it
.
startsWith
(
"P:"
)
}
?:
""
wifiUIBean
.
password
=
getPairKeyValue
(
passWordKV
).
second
val
hiddenKV
=
splitList
.
find
{
it
.
startsWith
(
"H:"
)
}
?:
""
wifiUIBean
.
hidden
=
getPairKeyValue
(
hiddenKV
).
second
.
toBoolean
()
val
securityKy
=
splitList
.
find
{
it
.
startsWith
(
"T"
)
}
if
(
securityKy
.
equals
(
"WPA/WPA2"
))
{
wifiUIBean
.
securityId
=
0
}
if
(
securityKy
.
equals
(
"WEP"
))
{
wifiUIBean
.
securityId
=
1
}
if
(
securityKy
.
equals
(
""
))
{
wifiUIBean
.
securityId
=
0
}
return
wifiUIBean
}
fun
isEmailQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"MATMSG:"
)
if
(
flag
)
{
return
true
}
return
false
}
//MATMSG:TO:179621228@qq.com;SUB:王雷;BODY:记得记得就觉得;
fun
createEmailBean
(
qrCodeValue
:
String
):
EmailUIBean
{
val
startTag
=
"MATMSG:"
val
subString
=
qrCodeValue
.
subSequence
(
startTag
.
length
,
qrCodeValue
.
length
)
LogEx
.
logDebug
(
TAG
,
"subString=$subString"
)
val
splitList
=
subString
.
split
(
";"
)
val
emailUIBean
=
EmailUIBean
()
val
addressKV
=
splitList
.
find
{
it
.
startsWith
(
"TO:"
)
}
?:
""
emailUIBean
.
address
=
getPairKeyValue
(
addressKV
).
second
val
subKV
=
splitList
.
find
{
it
.
startsWith
(
"SUB:"
)
}
?:
""
emailUIBean
.
subject
=
getPairKeyValue
(
subKV
).
second
val
bodyKV
=
splitList
.
find
{
it
.
startsWith
(
"BODY:"
)
}
?:
""
emailUIBean
.
message
=
getPairKeyValue
(
bodyKV
).
second
return
emailUIBean
}
fun
isWebsiteQR
(
qrCodeValue
:
String
):
Boolean
{
val
flag
=
qrCodeValue
.
startsWith
(
"http://"
)
||
qrCodeValue
.
startsWith
(
"https://"
)
if
(
flag
)
{
return
true
}
return
false
}
fun
createWebsiteBean
(
qrCodeValue
:
String
):
WebsiteUIBean
{
val
websiteUIBean
=
WebsiteUIBean
()
websiteUIBean
.
http
=
qrCodeValue
return
websiteUIBean
}
}
\ No newline at end of file
app/src/main/res/color/color_white_black.xml
0 → 100644
View file @
dec60fd7
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
</selector>
\ No newline at end of file
app/src/main/res/layout/activity_event.xml
View file @
dec60fd7
...
...
@@ -104,7 +104,7 @@
android:textSize=
"16sp"
/>
<EditText
android:id=
"@+id/edit
_subject
"
android:id=
"@+id/edit
Location
"
android:layout_width=
"match_parent"
android:layout_height=
"52dp"
android:layout_marginHorizontal=
"16dp"
...
...
@@ -134,7 +134,7 @@
</FrameLayout>
<EditText
android:id=
"@+id/edit
_message
"
android:id=
"@+id/edit
Description
"
android:layout_width=
"match_parent"
android:layout_height=
"92dp"
android:layout_marginHorizontal=
"16dp"
...
...
@@ -182,6 +182,7 @@
tools:ignore=
"ContentDescription"
/>
<TextView
android:id=
"@+id/tvStartDate"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
...
...
@@ -224,6 +225,7 @@
tools:ignore=
"ContentDescription"
/>
<TextView
android:id=
"@+id/tvEndDate"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
...
...
app/src/main/res/layout/activity_event_code.xml
0 → 100644
View file @
dec60fd7
This diff is collapsed.
Click to expand it.
app/src/main/res/layout/dialog_date_time.xml
0 → 100644
View file @
dec60fd7
<?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=
"match_parent"
android:layout_height=
"match_parent"
android:elevation=
"0dp"
app:cardCornerRadius=
"10dp"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"138dp"
android:background=
"#6473F8"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"15dp"
android:layout_marginTop=
"16dp"
android:text=
"@string/datetime"
android:textColor=
"@color/white"
android:textSize=
"16sp"
android:textStyle=
"bold"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<LinearLayout
android:id=
"@+id/llTime"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"15dp"
android:layout_marginTop=
"10dp"
android:orientation=
"horizontal"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<TextView
android:id=
"@+id/tvTime"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:textColor=
"@color/white"
android:textSize=
"25sp"
android:textStyle=
"bold"
tools:text=
"2:59"
/>
<TextView
android:id=
"@+id/tvAmPm"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"6dp"
android:textColor=
"@color/white"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:text=
"AM"
/>
</LinearLayout>
<ImageView
android:id=
"@+id/ivChange"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"16dp"
android:src=
"@mipmap/icondatetime"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:ignore=
"ContentDescription"
/>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"16dp"
android:layout_marginBottom=
"10dp"
android:orientation=
"vertical"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
>
<TextView
android:id=
"@+id/tvYear"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:textColor=
"@color/white"
android:textSize=
"21sp"
android:textStyle=
"bold"
tools:text=
"2025"
/>
<TextView
android:id=
"@+id/tvMD"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"5dp"
android:textColor=
"@color/white"
android:textSize=
"21sp"
android:textStyle=
"bold"
tools:text=
"December 19"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"560dp"
>
<DatePicker
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
app/src/main/res/mipmap-xxhdpi/icondatetime.png
0 → 100644
View file @
dec60fd7
305 Bytes
app/src/main/res/mipmap-xxhdpi/timeicon.png
0 → 100644
View file @
dec60fd7
2.08 KB
app/src/main/res/mipmap-xxhdpi/weizhi.png
0 → 100644
View file @
dec60fd7
2.05 KB
app/src/main/res/values/strings.xml
View file @
dec60fd7
...
...
@@ -81,7 +81,6 @@
<string
name=
"rate_now"
>
Rate now
</string>
<string
name=
"event_name"
>
Event name
</string>
<string
name=
"enter_your_event_location"
>
Enter your event location
</string>
<string
name=
"enter_your_event_name"
>
Enter event name
</string>
...
...
@@ -89,5 +88,8 @@
<string
name=
"let_people_know_more_about_the_event"
>
Let people know more about the event
</string>
<string
name=
"begin_time"
>
Begin Time
</string>
<string
name=
"end_time"
>
End Time
</string>
<string
name=
"datetime"
>
DateTime
</string>
<string
name=
"clean"
>
Clean
</string>
<string
name=
"ok"
>
OK
</string>
</resources>
\ No newline at end of file
app/src/main/res/values/themes.xml
View file @
dec60fd7
<resources
xmlns:tools=
"http://schemas.android.com/tools"
>
<!-- Base application theme. -->
<style
name=
"Base.Theme.ScanQR"
parent=
"Theme.Material3.DayNight.NoActionBar"
>
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style
name=
"Theme.ScanQR"
parent=
"Base.Theme.ScanQR"
/>
...
...
@@ -11,4 +10,63 @@
<item
name=
"android:windowBackground"
>
@drawable/splash_bp
</item>
<item
name=
"android:windowFullscreen"
>
false
</item>
</style>
<style
name=
"Theme.SwitchDateTime"
parent=
"Theme.MaterialComponents.Light.DarkActionBar"
>
<item
name=
"colorPrimary"
>
#3944FF
</item>
<item
name=
"colorPrimaryDark"
>
#FFAF00
</item>
<item
name=
"android:textColorPrimaryInverse"
>
#FF1629
</item>
<!-- 设置为白色 -->
<item
name=
"android:textColorSecondaryInverse"
>
#5AFF21
</item>
</style>
<!--日历圆圈背景-->
<style
name=
"Theme.SwitchDateTime.Date"
>
<item
name=
"mcv_selectionColor"
>
#6473F8
</item>
</style>
<!--标题头的背景-->
<style
name=
"Theme.SwitchDateTime.HeaderBackground"
>
<item
name=
"android:background"
>
#6473F8
</item>
</style>
<style
name=
"Theme.SwitchDateTime.Time"
>
<!-- 大圆背景-->
<item
name=
"timeCircleColor"
>
#E1E1E1
</item>
<!-- 时针中心点颜色-->
<item
name=
"timeCenterColor"
>
#6473F8
</item>
<!--时针选择器的颜色-->
<item
name=
"timeSelectorColor"
>
#6473F8
</item>
<!--时针数字颜色-->
<item
name=
"timeCircularNumbersColor"
>
@color/black
</item>
<!--am pm文本的颜色-->
<item
name=
"timeAmPmTextColor"
>
@color/black
</item>
<!--am pm 未选中的颜色-->
<item
name=
"timeAmPmBackgroundColor"
>
#00FFFFFF
</item>
<!--am pm 选中的颜色-->
<item
name=
"timeAmPmSelectBackgroundColor"
>
#6473F8
</item>
</style>
<!--日期时间弹窗样式-->
<style
name=
"DateTimeAlert"
parent=
"Theme.AppCompat.Light.Dialog.Alert"
>
<item
name=
"buttonBarPositiveButtonStyle"
>
@style/accessPositiveBtnStyle
</item>
<item
name=
"buttonBarNegativeButtonStyle"
>
@style/accessNegativeBtnStyle
</item>
<item
name=
"buttonBarNeutralButtonStyle"
>
@style/accessNeutralButtonStyle
</item>
</style>
<style
name=
"accessPositiveBtnStyle"
parent=
"Widget.AppCompat.Button.ButtonBar.AlertDialog"
>
<item
name=
"android:textColor"
>
#6473F8
</item>
</style>
<style
name=
"accessNegativeBtnStyle"
parent=
"Widget.AppCompat.Button.ButtonBar.AlertDialog"
>
<item
name=
"android:textColor"
>
#6473F8
</item>
</style>
<style
name=
"accessNeutralButtonStyle"
parent=
"Widget.AppCompat.Button.ButtonBar.AlertDialog"
>
<item
name=
"android:textColor"
>
#6473F8
</item>
</style>
</resources>
\ No newline at end of file
gradle.properties
View file @
dec60fd7
...
...
@@ -14,6 +14,8 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
#Jetifier ??:??????????? Support Library ???????? androidx ???
android.enableJetifier
=
true
android.useAndroidX
=
true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style
=
official
...
...
gradle/libs.versions.toml
View file @
dec60fd7
...
...
@@ -19,6 +19,7 @@ vungle = "7.4.2.0"
facebook
=
"6.18.0.0"
mintegral
=
"16.8.61.0"
pangle
=
"6.3.0.4.0"
protoliteWellKnownTypes
=
"18.0.0"
[libraries]
...
...
@@ -48,6 +49,7 @@ applovin_vungle = { group = "com.applovin.mediation", name = "vungle-adapter", v
applovin_facebook
=
{
group
=
"com.applovin.mediation"
,
name
=
"facebook-adapter"
,
version.ref
=
"facebook"
}
applovin_mintegral
=
{
group
=
"com.applovin.mediation"
,
name
=
"mintegral-adapter"
,
version.ref
=
"mintegral"
}
applovin_pangle
=
{
group
=
"com.applovin.mediation"
,
name
=
"bytedance-adapter"
,
version.ref
=
"pangle"
}
protolite-well-known-types
=
{
group
=
"com.google.firebase"
,
name
=
"protolite-well-known-types"
,
version.ref
=
"protoliteWellKnownTypes"
}
...
...
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