1.在解绑提示页面,增加提示语“Auto-Renew: Cancel”

2.适配Google Play 要求支持 16 KB 的内存页面大小,更新大部分第三方库到最新版本
This commit is contained in:
yezhiqiu
2026-04-21 17:20:28 +08:00
parent 0dfc082f2b
commit 4547f844ba
90 changed files with 218 additions and 152 deletions

View File

@@ -1 +0,0 @@
o/bundleLibRuntimeToDirDebug

View File

@@ -1 +1 @@
#Thu Apr 16 16:49:17 CST 2026 #Tue Apr 21 16:52:55 CST 2026

View File

@@ -30,7 +30,7 @@ android {
targetSdkVersion 35 targetSdkVersion 35
versionCode 2202 versionCode 2202
// versionName "2.2.2" // versionName "2.2.2"
versionName "2.2.2-Beta4" versionName "2.2.2-Beta6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -63,6 +63,17 @@ android {
] ]
} }
//解决mapBox和百度地图libc++_shared.so发生冲突http://www.52im.net/blog-28523-2848.html
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/armeabi/libc++_shared.so'
pickFirst 'lib/mips/libc++_shared.so'
pickFirst 'lib/mips64/libc++_shared.so'
}
// 读取local.properties文件 // 读取local.properties文件
Properties properties = new Properties() Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream() InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
@@ -188,23 +199,23 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
// Android官方库 // Android官方库
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.arch.core:core-common:2.2.0' implementation 'androidx.arch.core:core-common:2.2.0'
implementation 'androidx.arch.core:core-runtime:2.2.0' implementation 'androidx.arch.core:core-runtime:2.2.0'
implementation 'androidx.activity:activity-ktx:1.9.3' implementation 'androidx.activity:activity-ktx:1.10.1'
implementation 'androidx.fragment:fragment-ktx:1.5.6' implementation 'androidx.fragment:fragment-ktx:1.8.9'
implementation 'androidx.annotation:annotation:1.9.1' implementation 'androidx.annotation:annotation:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.10.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.7' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.10.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0'
implementation 'androidx.room:room-runtime:2.5.2' implementation 'androidx.room:room-runtime:2.8.4'
// implementation 'androidx.room:room-rxjava2:2.3.0' // implementation 'androidx.room:room-rxjava2:2.3.0'
implementation 'androidx.room:room-ktx:2.5.2' implementation 'androidx.room:room-ktx:2.8.4'
kapt 'androidx.room:room-compiler:2.5.2' kapt 'androidx.room:room-compiler:2.8.4'
//hilt依赖注入https://mvnrepository.com/artifact/com.google.dagger/hilt-android-gradle-plugin //hilt依赖注入https://mvnrepository.com/artifact/com.google.dagger/hilt-android-gradle-plugin
implementation "com.google.dagger:hilt-android:2.57" implementation "com.google.dagger:hilt-android:2.57.2"
kapt "com.google.dagger:hilt-android-compiler:2.57" kapt "com.google.dagger:hilt-android-compiler:2.57.2"
//Android UI 开发效率的 UI 库https://github.com/Tencent/QMUI_Android //Android UI 开发效率的 UI 库https://github.com/Tencent/QMUI_Android
implementation 'com.qmuiteam:qmui:2.1.0' implementation 'com.qmuiteam:qmui:2.1.0'
@@ -221,11 +232,11 @@ dependencies {
implementation "io.coil-kt:coil-gif:1.4.0"//支持GIF implementation "io.coil-kt:coil-gif:1.4.0"//支持GIF
//lottie动画https://github.com/airbnb/lottie-android //lottie动画https://github.com/airbnb/lottie-android
implementation 'com.airbnb.android:lottie:6.6.7' implementation 'com.airbnb.android:lottie:6.7.1'
//https://github.com/CymChad/BaseRecyclerViewAdapterHelper //https://github.com/CymChad/BaseRecyclerViewAdapterHelper
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.11' implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.14"
//升级recyclerview因BaseRecyclerViewAdapterHelper item点击事件是使用1.2.0 //升级recyclerview因BaseRecyclerViewAdapterHelper item点击事件是使用1.2.0
implementation 'androidx.recyclerview:recyclerview:1.3.1' implementation 'androidx.recyclerview:recyclerview:1.4.0'
//谷歌地图 //谷歌地图
implementation 'com.google.android.gms:play-services-maps:20.0.0' implementation 'com.google.android.gms:play-services-maps:20.0.0'
@@ -245,21 +256,24 @@ dependencies {
//mapbox地图https://github.com/mapbox/mapbox-maps-android //mapbox地图https://github.com/mapbox/mapbox-maps-android
// implementation 'com.mapbox.maps:android:10.2.0' // implementation 'com.mapbox.maps:android:10.2.0'
//https://github.com/mapbox/mapbox-search-android //https://github.com/mapbox/mapbox-search-android
//用mapbox搜索SDK,地理编码 有搜索ui组件已包括mapbox-search-android架包 /**用mapbox搜索SDK,地理编码 有搜索ui组件已包括mapbox-search-android架包
implementation "com.mapbox.search:mapbox-search-android-ui:2.5.1" * 支持 16 KB 页面大小
* https://docs.mapbox.com/android/search/guides/install/#step-2-add-search-sdk-dependencies
*/
implementation "com.mapbox.search:mapbox-search-android-ui-ndk27:2.22.0"
// mapbox搜索SDK,地理编码 没有搜索ui组件 // mapbox搜索SDK,地理编码 没有搜索ui组件
// implementation "com.mapbox.search:mapbox-search-android:1.0.0-beta.25" // implementation "com.mapbox.search:mapbox-search-android:1.0.0-beta.25"
//用于计算距离https://docs.mapbox.com/android/java/guides/turf/#available-methods //用于计算距离https://docs.mapbox.com/android/java/guides/#installation
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:6.15.0' implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:7.10.0'
//用于计算路线规划信息https://docs.mapbox.com/android/java/examples/dashed-directions-line/ //用于计算路线规划信息、地理编码
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:6.3.0' implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:7.10.0'
// 权限请求框架https://github.com/getActivity/XXPermissions // 权限请求框架https://github.com/getActivity/XXPermissions
implementation 'com.github.getActivity:XXPermissions:25.2' implementation 'com.github.getActivity:XXPermissions:28.2'
// 吐司框架https://github.com/getActivity/ToastUtils // 吐司框架https://github.com/getActivity/ToastUtils
implementation 'com.github.getActivity:Toaster:13.2' implementation 'com.github.getActivity:Toaster:15.0'
// 日志调试框架https://github.com/getActivity/Logcat ,在debug模式下集成 // 日志调试框架https://github.com/getActivity/Logcat ,在debug模式下集成
debugImplementation 'com.github.getActivity:Logcat:12.3' debugImplementation 'com.github.getActivity:Logcat:13.0'
// PictureSelector图片选择器,需要compileSdkVersion=31 https://github.com/LuckSiege/PictureSelector // PictureSelector图片选择器,需要compileSdkVersion=31 https://github.com/LuckSiege/PictureSelector
// implementation 'io.github.lucksiege:pictureselector:v3.0.3' // implementation 'io.github.lucksiege:pictureselector:v3.0.3'
@@ -268,14 +282,14 @@ dependencies {
//压缩图片 https://github.com/zetbaitsu/Compressor //压缩图片 https://github.com/zetbaitsu/Compressor
implementation 'id.zelory:compressor:3.0.1' implementation 'id.zelory:compressor:3.0.1'
//图片裁剪功能https://github.com/CanHub/Android-Image-Cropper //图片裁剪功能https://github.com/CanHub/Android-Image-Cropper
implementation 'com.vanniktech:android-image-cropper:4.6.0' implementation 'com.vanniktech:android-image-cropper:4.7.0'
//******************************************极光推送start***************************************************** //******************************************极光推送start*****************************************************
// https://docs.jiguang.cn/jpush/client/Android/android_guide // https://docs.jiguang.cn/jpush/client/Android/android_guide
// implementation 'cn.jiguang.sdk:jcore:3.1.2' // 此处以JCore 2.7.2 版本为例。 // implementation 'cn.jiguang.sdk:jcore:3.1.2' // 此处以JCore 2.7.2 版本为例。
// implementation 'cn.jiguang.sdk:jpush:4.6.0' // 此处以JPush 4.0.0 版本为例 // implementation 'cn.jiguang.sdk:jpush:4.6.0' // 此处以JPush 4.0.0 版本为例
implementation 'cn.jiguang.sdk:jcore-google:5.1.0' // 此处以JCore 2.7.2 版本为例。 implementation 'cn.jiguang.sdk:jcore-google:5.3.7' // 此处以JCore 2.7.2 版本为例。
implementation 'cn.jiguang.sdk:jpush-google:5.8.0' // 此处以JPush 4.0.0 版本为例 implementation 'cn.jiguang.sdk:jpush-google:6.0.7' // 此处以JPush 4.0.0 版本为例
// 接入华为厂商 // 接入华为厂商
// implementation 'com.huawei.hms:push:6.1.0.300' // implementation 'com.huawei.hms:push:6.1.0.300'
// implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0'// 极光厂商插件版本与接入 JPush 版本保持一致,下同 // implementation 'cn.jiguang.sdk.plugin:huawei:4.0.0'// 极光厂商插件版本与接入 JPush 版本保持一致,下同
@@ -306,13 +320,13 @@ dependencies {
implementation 'com.stripe:stripe-android:20.27.0' implementation 'com.stripe:stripe-android:20.27.0'
//百度地图基础定位组件 //百度地图基础定位组件
implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.6.5.1' implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.6.7'
//地图组件 //地图组件
implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.5.2' implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.6.7'
//检索组件 //检索组件
implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.5.2' implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.6.7'
//工具组件 //工具组件
implementation 'com.baidu.lbsyun:BaiduMapSDK_Util:7.5.2' implementation 'com.baidu.lbsyun:BaiduMapSDK_Util:7.6.7'
//微信登录、支付 //微信登录、支付
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+' implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+'
@@ -326,7 +340,7 @@ dependencies {
implementation 'no.nordicsemi.android:mcumgr-ble:2.7.4' implementation 'no.nordicsemi.android:mcumgr-ble:2.7.4'
//适配Android 12以下SplashScreen启动动画闪屏图片 //适配Android 12以下SplashScreen启动动画闪屏图片
implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.core:core-splashscreen:1.2.0'
//优雅、万能自定义日历https://github.com/huanghaibin-dev/CalendarView //优雅、万能自定义日历https://github.com/huanghaibin-dev/CalendarView
// implementation 'com.haibin:calendarview:3.7.1' // implementation 'com.haibin:calendarview:3.7.1'
//https://github.com/angcyo/CalendarView //https://github.com/angcyo/CalendarView

View File

@@ -9,6 +9,7 @@ import com.abbidot.tracker.util.Util
import com.baidu.mapapi.search.route.BikingRouteResult import com.baidu.mapapi.search.route.BikingRouteResult
import com.baidu.mapapi.search.route.DrivingRouteResult import com.baidu.mapapi.search.route.DrivingRouteResult
import com.baidu.mapapi.search.route.IndoorRouteResult import com.baidu.mapapi.search.route.IndoorRouteResult
import com.baidu.mapapi.search.route.IntegralRouteResult
import com.baidu.mapapi.search.route.MassTransitRouteResult import com.baidu.mapapi.search.route.MassTransitRouteResult
import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener
import com.baidu.mapapi.search.route.PlanNode import com.baidu.mapapi.search.route.PlanNode
@@ -144,6 +145,10 @@ class RoutePlanningViewModel : ViewModel() {
override fun onGetBikingRouteResult(p0: BikingRouteResult?) { override fun onGetBikingRouteResult(p0: BikingRouteResult?) {
} }
override fun onGetIntegralRouteResult(p0: IntegralRouteResult?) {
}
}) })
} }

View File

@@ -215,7 +215,8 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
CrashReport.setUserId(MMKVUtil.getString(MMKVKey.Email)) CrashReport.setUserId(MMKVUtil.getString(MMKVKey.Email))
//预先加载相册,防止上传头像几千张照片加载慢 //预先加载相册,防止上传头像几千张照片加载慢
XXPermissions.with(this).permission(PermissionLists.getReadMediaImagesPermission()) XXPermissions.with(this).permission(PermissionLists.getReadMediaImagesPermission())
.request { _, allGranted -> .request { _, deniedList ->
val allGranted = deniedList.isEmpty()
if (allGranted) { if (allGranted) {
EasyPhotos.preLoad(this) EasyPhotos.preLoad(this)
// { // {
@@ -310,7 +311,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
//蓝牙连接就去连接socket //蓝牙连接就去连接socket
// mBleReportManage.dealBleReportData(macID, null) // mBleReportManage.dealBleReportData(macID, null)
} else { } else {
mLogBleReportViewModel.uploadLog(mContext, macID,deviceOutId) mLogBleReportViewModel.uploadLog(mContext, macID, deviceOutId)
startCountDownConBle(15) startCountDownConBle(15)
} }
} }
@@ -454,7 +455,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
packageUnavailableState() packageUnavailableState()
//刚开始打开APP上传日志 //刚开始打开APP上传日志
getPet(false)?.apply { getPet(false)?.apply {
mLogBleReportViewModel.uploadLog(mContext, macID,deviceOutId) mLogBleReportViewModel.uploadLog(mContext, macID, deviceOutId)
} }
} else { } else {
onChangeClick(mSelectPetPosition) onChangeClick(mSelectPetPosition)
@@ -573,7 +574,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
private fun checkPermissions() { private fun checkPermissions() {
val checkBleOpen = MMKVUtil.getBoolean(MMKVKey.isFirstCheckBleOpen, true) val checkBleOpen = MMKVUtil.getBoolean(MMKVKey.isFirstCheckBleOpen, true)
if (checkBleOpen) MMKVUtil.putBoolean(MMKVKey.isFirstCheckBleOpen, false) if (checkBleOpen) MMKVUtil.putBoolean(MMKVKey.isFirstCheckBleOpen, false)
Util.checkBluetoothPermissionsEnabled(mContext, { Util.checkBluetoothPermissionsEnabled(this, {
// mAutomaticConnectionDeviceViewModel.autoConnectBleDevice(mContext) // mAutomaticConnectionDeviceViewModel.autoConnectBleDevice(mContext)
}, isCheckBleOpen = checkBleOpen) }, isCheckBleOpen = checkBleOpen)
} }

View File

@@ -38,7 +38,7 @@ import com.stripe.android.PaymentConfiguration
import com.tencent.bugly.crashreport.CrashReport import com.tencent.bugly.crashreport.CrashReport
import com.tencent.mm.opensdk.constants.ConstantsAPI import com.tencent.mm.opensdk.constants.ConstantsAPI
import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.IWXAPI
import java.util.* import java.util.Calendar
/** /**
@@ -179,7 +179,7 @@ class SplashActivity : QMUIActivity() {
// }, 600) // }, 600)
// } // }
mViewBinding.splashLogoIv.visibility = View.VISIBLE mViewBinding.splashLogoIv.visibility = View.VISIBLE
mCountDownTimerViewModel.startCountDown(2) mCountDownTimerViewModel.startCountDown(1)
init() init()
} }
@@ -219,8 +219,8 @@ class SplashActivity : QMUIActivity() {
initMapbox() initMapbox()
} }
val buglyKey = Util.getMetadata(applicationContext, KeyNames.BUG_LY_KEY_NAME)
//腾讯bugly初始化 //腾讯bugly初始化
val buglyKey = Util.getMetadata(applicationContext, KeyNames.BUG_LY_KEY_NAME)
CrashReport.initCrashReport(applicationContext, buglyKey, AppUtils.isDebug()) CrashReport.initCrashReport(applicationContext, buglyKey, AppUtils.isDebug())
} }

View File

@@ -92,7 +92,7 @@ class AddNewTracker1Activity :
* 检查获取定位蓝牙权限 * 检查获取定位蓝牙权限
*/ */
private fun checkPermissions() { private fun checkPermissions() {
Util.checkBluetoothPermissionsEnabled(mContext, { Util.checkBluetoothPermissionsEnabled(this, {
val intent = Intent(mContext, AddNewTracker3Activity::class.java) val intent = Intent(mContext, AddNewTracker3Activity::class.java)
intent.putExtra(ConstantString.isFirstBind, isFirstBind) intent.putExtra(ConstantString.isFirstBind, isFirstBind)
startActivity(intent) startActivity(intent)

View File

@@ -49,7 +49,7 @@ class AddNewTracker2Activity :
} }
} }
Util.checkBluetoothPermissionsEnabled(mContext, { Util.checkBluetoothPermissionsEnabled(this, {
startScanBle() startScanBle()
}) })
} }

View File

@@ -402,7 +402,7 @@ class PreviewFencesZoneActivity :
} }
private fun goEditFences() { private fun goEditFences() {
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
mCurrentFences?.apply { mCurrentFences?.apply {
val intent = if (fenceType == ConstantInt.SafeZone) Intent( val intent = if (fenceType == ConstantInt.SafeZone) Intent(
mContext, EditSafeZoneActivity::class.java mContext, EditSafeZoneActivity::class.java

View File

@@ -338,7 +338,7 @@ class VirtualFencesActivity :
} }
private fun goPreviewFencesZone(fencesBean: FencesBean) { private fun goPreviewFencesZone(fencesBean: FencesBean) {
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
mPetBean?.apply { mPetBean?.apply {
val intent = Intent(mContext, PreviewFencesZoneActivity::class.java) val intent = Intent(mContext, PreviewFencesZoneActivity::class.java)
intent.putExtra(ConstantString.Fence, fencesBean) intent.putExtra(ConstantString.Fence, fencesBean)
@@ -351,7 +351,7 @@ class VirtualFencesActivity :
private fun goAddSafeZone() { private fun goAddSafeZone() {
val share = MMKVUtil.getInt(MMKVKey.Shared) val share = MMKVUtil.getInt(MMKVKey.Shared)
if (share != ConstantInt.NoShare) return if (share != ConstantInt.NoShare) return
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
val intent = Intent(mContext, AddSafeZoneActivity::class.java) val intent = Intent(mContext, AddSafeZoneActivity::class.java)
intent.putExtra(ConstantString.Pet, mPetBean) intent.putExtra(ConstantString.Pet, mPetBean)
intent.putExtra(ConstantString.Fence, mGetFencesBean) intent.putExtra(ConstantString.Fence, mGetFencesBean)
@@ -362,7 +362,7 @@ class VirtualFencesActivity :
private fun goAddNoGoZone() { private fun goAddNoGoZone() {
val share = MMKVUtil.getInt(MMKVKey.Shared) val share = MMKVUtil.getInt(MMKVKey.Shared)
if (share != ConstantInt.NoShare) return if (share != ConstantInt.NoShare) return
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
val intent = Intent(mContext, AddNoGoZoneActivity::class.java) val intent = Intent(mContext, AddNoGoZoneActivity::class.java)
intent.putExtra(ConstantString.Pet, mPetBean) intent.putExtra(ConstantString.Pet, mPetBean)
intent.putExtra(ConstantString.Fence, mGetFencesBean) intent.putExtra(ConstantString.Fence, mGetFencesBean)

View File

@@ -343,7 +343,7 @@ class LedLightActivity : BaseActivity<ActivityLedLightBinding>(ActivityLedLightB
if (BleManager.getInstance().isConnected(deviceMacId)) { if (BleManager.getInstance().isConnected(deviceMacId)) {
//蓝牙控制 //蓝牙控制
SRBleUtil.instance.getConnectMacDevice(deviceMacId)?.let { SRBleUtil.instance.getConnectMacDevice(deviceMacId)?.let {
SRBleUtil.instance.setBleLedSwitch(mContext, it.bleDevice, mode) SRBleUtil.instance.setBleLedSwitch(this@LedLightActivity, it.bleDevice, mode)
} }
} else { } else {
//远程控制 //远程控制
@@ -414,7 +414,7 @@ class LedLightActivity : BaseActivity<ActivityLedLightBinding>(ActivityLedLightB
if (BleManager.getInstance().isConnected(deviceMacId)) { if (BleManager.getInstance().isConnected(deviceMacId)) {
//蓝牙控制 //蓝牙控制
SRBleUtil.instance.getConnectMacDevice(deviceMacId)?.let { SRBleUtil.instance.getConnectMacDevice(deviceMacId)?.let {
SRBleUtil.instance.setBleLedSwitch(mContext, it.bleDevice, ledSwitch) SRBleUtil.instance.setBleLedSwitch(this@LedLightActivity, it.bleDevice, ledSwitch)
} }
} else { } else {
//远程控制 //远程控制

View File

@@ -294,7 +294,7 @@ class LedLightActivityV0 : BaseActivity<ActivityLedLightBinding>(ActivityLedLigh
private fun setBleLedMode(mode: Int) { private fun setBleLedMode(mode: Int) {
mBleTrackDeviceBean?.apply { mBleTrackDeviceBean?.apply {
SRBleUtil.instance.setBleLedSwitch(mContext, bleDevice, mode) SRBleUtil.instance.setBleLedSwitch(this@LedLightActivityV0, bleDevice, mode)
} }
} }

View File

@@ -273,7 +273,7 @@ class AddWifiPasswordActivity :
} }
private fun goEditWifiActivity() { private fun goEditWifiActivity() {
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
val intent = Intent(mContext, EditWifiPowerZoneActivity::class.java) val intent = Intent(mContext, EditWifiPowerZoneActivity::class.java)
intent.putExtra(ConstantString.WiFi, mWiFiBean) intent.putExtra(ConstantString.WiFi, mWiFiBean)
mDecWiFiAddressData?.let { mDecWiFiAddressData?.let {

View File

@@ -178,7 +178,7 @@ class AddWifiPowerZone1Activity :
} }
private fun goNext() { private fun goNext() {
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
Intent(mContext, AddWifiPowerZone2Activity::class.java).let { Intent(mContext, AddWifiPowerZone2Activity::class.java).let {
mPetBean?.let { pet -> mPetBean?.let { pet ->
it.putExtra(ConstantString.Pet, pet) it.putExtra(ConstantString.Pet, pet)

View File

@@ -105,7 +105,7 @@ class AddWifiPowerZone2Activity :
override fun onClick(v: View?) { override fun onClick(v: View?) {
mViewBinding.apply { mViewBinding.apply {
when (v!!) { when (v!!) {
btnAddWifiZone2Next -> Util.checkBluetoothPermissionsEnabled(mContext, { btnAddWifiZone2Next -> Util.checkBluetoothPermissionsEnabled(this@AddWifiPowerZone2Activity, {
goNext() goNext()
}) })

View File

@@ -272,7 +272,7 @@ class AddWifiPowerZone3Activity :
private fun checkPermission() { private fun checkPermission() {
//从 Android 6.0API 23开始定位权限现在被用于 Wi-Fi 扫描 //从 Android 6.0API 23开始定位权限现在被用于 Wi-Fi 扫描
Util.checkPermissions( Util.checkPermissions(
mContext, object : Util.RequestPermissionCallback { this, object : Util.RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
addListData() addListData()
} }

View File

@@ -115,7 +115,7 @@ class PowerSavingSetActivity :
if (share != ConstantInt.NoShare) { if (share != ConstantInt.NoShare) {
return return
} }
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
if (mZoneAdapter.getData().isNotEmpty()) { if (mZoneAdapter.getData().isNotEmpty()) {
val wiFiZoneBean = mZoneAdapter.getData()[pos] val wiFiZoneBean = mZoneAdapter.getData()[pos]
val intent = Intent(mContext, EditWifiPowerZoneActivity::class.java) val intent = Intent(mContext, EditWifiPowerZoneActivity::class.java)

View File

@@ -718,7 +718,7 @@ class LiveActivityV3 : BaseActivity<ActivityLiveV3Binding>(ActivityLiveV3Binding
*/ */
private fun setLedSwitch(mode: Int) { private fun setLedSwitch(mode: Int) {
mTrackBleDevice?.apply { mTrackBleDevice?.apply {
SRBleUtil.instance.setBleLedSwitch(mContext, bleDevice, mode) SRBleUtil.instance.setBleLedSwitch(this@LiveActivityV3, bleDevice, mode)
} }
} }
@@ -1109,7 +1109,7 @@ class LiveActivityV3 : BaseActivity<ActivityLiveV3Binding>(ActivityLiveV3Binding
* 找蓝牙设备 * 找蓝牙设备
*/ */
private fun findBleDevice(mac: String) { private fun findBleDevice(mac: String) {
Util.checkBluetoothPermissionsEnabled(mContext, { Util.checkBluetoothPermissionsEnabled(this, {
showAndHideFindLayout() showAndHideFindLayout()
mViewBinding.ilLiveV2BluetoothFindDevice.apply { mViewBinding.ilLiveV2BluetoothFindDevice.apply {
mFindBleDeviceViewModel.startScanFind( mFindBleDeviceViewModel.startScanFind(

View File

@@ -28,7 +28,7 @@ class FirstPermissionsActivity :
override fun initData() { override fun initData() {
super.initData() super.initData()
mPermissionsCommon = PermissionsActivityCommon(mContext).apply { mPermissionsCommon = PermissionsActivityCommon(this).apply {
registerGpsReceiver() registerGpsReceiver()
} }
mPermissionsAdapter = mPermissionsAdapter =

View File

@@ -25,7 +25,7 @@ class PermissionsSetActivity :
setTopBarTitle(R.string.txt_permissions) setTopBarTitle(R.string.txt_permissions)
setLeftBackImage(R.drawable.icon_white_back_svg) setLeftBackImage(R.drawable.icon_white_back_svg)
mPermissionsCommon = PermissionsActivityCommon(mContext).apply { mPermissionsCommon = PermissionsActivityCommon(this).apply {
registerGpsReceiver() registerGpsReceiver()
} }
mPermissionsSetAdapter = mPermissionsSetAdapter =

View File

@@ -143,7 +143,7 @@ class ChoosePlanActivity :
} }
private fun goSureSubscriptionPlan() { private fun goSureSubscriptionPlan() {
Util.checkLocationPermissionsGpsEnabled(mContext, { Util.checkLocationPermissionsGpsEnabled(this, {
Intent( Intent(
mContext, SureSubscriptionPlanActivity::class.java mContext, SureSubscriptionPlanActivity::class.java
).let { ).let {

View File

@@ -49,7 +49,7 @@ class SubscriptionHistoryActivity :
super.onResume() super.onResume()
if (mRefreshPackage) { if (mRefreshPackage) {
mRefreshPackage = false mRefreshPackage = false
mSubscriptionViewModel.getHistoryIncludeRenew("sub_1TN3ccCUI9XSagUNmhpfpRk4") mSubscriptionViewModel.getHistoryIncludeRenew(subscriptionId)
} }
} }

View File

@@ -7,11 +7,13 @@ import android.location.LocationManager
import android.provider.Settings import android.provider.Settings
import com.abbidot.baselibrary.list.BaseRecyclerAdapter import com.abbidot.baselibrary.list.BaseRecyclerAdapter
import com.abbidot.tracker.R import com.abbidot.tracker.R
import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.bean.DataBean import com.abbidot.tracker.bean.DataBean
import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.receiver.GPSMonitorReceiver import com.abbidot.tracker.receiver.GPSMonitorReceiver
import com.abbidot.tracker.util.Util import com.abbidot.tracker.util.Util
import com.abbidot.tracker.util.bluetooth.SRBleUtil import com.abbidot.tracker.util.bluetooth.SRBleUtil
import com.baidu.mshield.x0.EngineImpl.mContext
import com.clj.fastble.BleManager import com.clj.fastble.BleManager
import com.hjq.permissions.XXPermissions import com.hjq.permissions.XXPermissions
import com.hjq.permissions.permission.PermissionLists import com.hjq.permissions.permission.PermissionLists
@@ -21,11 +23,11 @@ import com.hjq.permissions.permission.PermissionLists
* @link * @link
* @description: * @description:
*/ */
class PermissionsActivityCommon(context: Context) { class PermissionsActivityCommon(activity: BaseActivity<*>) {
private val mLocationManager = private val mLocationManager =
context.getSystemService(Context.LOCATION_SERVICE) as LocationManager activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
private val mContext = context private val mActivity = activity
private var mGPSListenerReceiver: GPSMonitorReceiver? = null private var mGPSListenerReceiver: GPSMonitorReceiver? = null
/** /**
@@ -172,7 +174,7 @@ class PermissionsActivityCommon(context: Context) {
*/ */
fun operateBluetooth() { fun operateBluetooth() {
Util.checkPermissions( Util.checkPermissions(
mContext, mActivity,
object : Util.RequestPermissionCallback { object : Util.RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
if (BleManager.getInstance().isSupportBle) { if (BleManager.getInstance().isSupportBle) {
@@ -191,11 +193,12 @@ class PermissionsActivityCommon(context: Context) {
*/ */
fun operateGPSLocation() { fun operateGPSLocation() {
Util.checkPermissions( Util.checkPermissions(
mContext, mActivity,
object : Util.RequestPermissionCallback { object : Util.RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
mContext.startActivity(intent) mContext.startActivity(intent)
} }
} }
@@ -211,7 +214,7 @@ class PermissionsActivityCommon(context: Context) {
*/ */
fun operateNotifications(adapter: BaseRecyclerAdapter<DataBean>, expansionState: Int) { fun operateNotifications(adapter: BaseRecyclerAdapter<DataBean>, expansionState: Int) {
Util.checkPermissions( Util.checkPermissions(
mContext, mActivity,
object : Util.RequestPermissionCallback { object : Util.RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
updatePermissionsState(adapter, expansionState) updatePermissionsState(adapter, expansionState)

View File

@@ -1109,7 +1109,7 @@ class HomeTrackFragment :
*/ */
private fun connectionBtn(btnString: String) { private fun connectionBtn(btnString: String) {
if (btnString == getString(R.string.txt_unconnect_no)) { if (btnString == getString(R.string.txt_unconnect_no)) {
Util.checkBluetoothPermissionsEnabled(mContext!!, { Util.checkBluetoothPermissionsEnabled(getHomeV2Activity()!!, {
getHomeV2Activity()?.getPet()?.apply { getHomeV2Activity()?.getPet()?.apply {
mConnectionDeviceViewModel.connectDeviceToMac( mConnectionDeviceViewModel.connectDeviceToMac(
getHomeV2Activity()!!, macID, false getHomeV2Activity()!!, macID, false
@@ -1172,7 +1172,7 @@ class HomeTrackFragment :
if (BleManager.getInstance().isConnected(it.deviceMacId)) { if (BleManager.getInstance().isConnected(it.deviceMacId)) {
//蓝牙控制 //蓝牙控制
getBleTrackDeviceBean(false)?.let { ble -> getBleTrackDeviceBean(false)?.let { ble ->
SRBleUtil.instance.setBleLedSwitch(mContext!!, ble.bleDevice, ledSwitch) SRBleUtil.instance.setBleLedSwitch(getHomeV2Activity()!!, ble.bleDevice, ledSwitch)
} }
} else { } else {
// setLedState(ledSwitch) // setLedState(ledSwitch)

View File

@@ -513,7 +513,7 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
override fun onOkClick(dialog: BaseDialog<*>) { override fun onOkClick(dialog: BaseDialog<*>) {
dialog.dismiss() dialog.dismiss()
if (type == 0) checkPermissions(type) if (type == 0) checkPermissions(type)
else Util.checkLocationPermissionsGpsEnabled(mContext!!, {}) else Util.checkLocationPermissionsGpsEnabled(getHomeV2Activity()!!, {})
} }
}, },
okTextResId = R.string.txt_accept, okTextResId = R.string.txt_accept,
@@ -811,7 +811,7 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
*/ */
private fun checkPermissions(type: Int) { private fun checkPermissions(type: Int) {
getHomeV2Activity()?.apply { getHomeV2Activity()?.apply {
Util.checkBluetoothPermissionsEnabled(mContext, { Util.checkBluetoothPermissionsEnabled(this, {
if (type == 0) { if (type == 0) {
if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)

View File

@@ -40,7 +40,6 @@ import com.abbidot.tracker.vm.SubscriptionManageViewModel
import com.baidu.mapapi.utils.DistanceUtil import com.baidu.mapapi.utils.DistanceUtil
import com.clj.fastble.BleManager import com.clj.fastble.BleManager
import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLng
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions import com.hjq.permissions.XXPermissions
import com.hjq.permissions.permission.PermissionLists import com.hjq.permissions.permission.PermissionLists
import com.hjq.permissions.permission.base.IPermission import com.hjq.permissions.permission.base.IPermission
@@ -351,38 +350,55 @@ class Util {
* 检查权限并获取权限 * 检查权限并获取权限
*/ */
fun checkPermissions( fun checkPermissions(
context: Context, activity: BaseActivity<*>,
requestPermissionCallback: RequestPermissionCallback, requestPermissionCallback: RequestPermissionCallback,
permissionTag: String, permissionTag: String,
vararg permissions: IPermission vararg permissions: IPermission
) { ) {
XXPermissions.with(context).permissions(permissions) XXPermissions.with(activity).permissions(permissions).request { _, deniedList ->
.request(object : OnPermissionCallback { val allGranted = deniedList.isEmpty()
override fun onGranted( if (allGranted) {
permissions: MutableList<IPermission>, all: Boolean LogUtil.e("获取${permissionTag}权限成功")
) { requestPermissionCallback.onRequestPermissionSuccess()
if (all) { } else {
LogUtil.e("获取${permissionTag}权限成功") val doNotAskAgain =
requestPermissionCallback.onRequestPermissionSuccess() XXPermissions.isDoNotAskAgainPermissions(activity, deniedList)
} else { if (doNotAskAgain) {
LogUtil.e("获取部分权限成功,但部分权限未正常授予") LogUtil.e("被永久拒绝授权,请手动授予定位权限")
requestPermissionCallback.onRequestPermissionFail() // 如果是被永久拒绝就跳转到应用权限系统设置页面
} XXPermissions.startPermissionActivity(activity, deniedList)
} else {
LogUtil.e("获取部分权限成功,但部分权限未正常授予")
requestPermissionCallback.onRequestPermissionFail()
} }
}
override fun onDenied( // object : OnPermissionCallback {
permissions: MutableList<IPermission>, doNotAskAgain: Boolean // override fun onGranted(
) { // permissions: MutableList<IPermission>, all: Boolean
if (doNotAskAgain) { // ) {
LogUtil.e("被永久拒绝授权,请手动授予定位权限") // if (all) {
// 如果是被永久拒绝就跳转到应用权限系统设置页面 //
XXPermissions.startPermissionActivity(context, permissions) // } else {
} else { // LogUtil.e("获取部分权限成功,但部分权限未正常授予")
LogUtil.e("获取${permissionTag}权限失败") // requestPermissionCallback.onRequestPermissionFail()
requestPermissionCallback.onRequestPermissionFail() // }
} // }
} //
}) // override fun onDenied(
// permissions: MutableList<IPermission>, doNotAskAgain: Boolean
// ) {
// if (doNotAskAgain) {
// LogUtil.e("被永久拒绝授权,请手动授予定位权限")
// // 如果是被永久拒绝就跳转到应用权限系统设置页面
// XXPermissions.startPermissionActivity(context, permissions)
// } else {
// LogUtil.e("获取${permissionTag}权限失败")
// requestPermissionCallback.onRequestPermissionFail()
// }
// }
// }
}
} }
@@ -647,18 +663,18 @@ class Util {
* 检查蓝牙权限和开关 * 检查蓝牙权限和开关
*/ */
fun checkBluetoothPermissionsEnabled( fun checkBluetoothPermissionsEnabled(
context: Context, activity: BaseActivity<*>,
successAuthorize: () -> Unit, successAuthorize: () -> Unit,
isShowToast: Boolean = true, isShowToast: Boolean = true,
isCheckBleOpen: Boolean = true isCheckBleOpen: Boolean = true
) { ) {
checkPermissions( checkPermissions(
context, activity,
object : RequestPermissionCallback { object : RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
//判断蓝牙是否打开 //判断蓝牙是否打开
if (isCheckBleOpen && !SRBleUtil.instance.isBleEnable(context)) { if (isCheckBleOpen && !SRBleUtil.instance.isBleEnable(activity)) {
SRBleUtil.instance.openBluetooth(context) SRBleUtil.instance.openBluetooth(activity)
return return
} }
successAuthorize() successAuthorize()
@@ -680,18 +696,18 @@ class Util {
* 检查定位权限和GPS开关 * 检查定位权限和GPS开关
*/ */
fun checkLocationPermissionsGpsEnabled( fun checkLocationPermissionsGpsEnabled(
context: Context, successAuthorize: () -> Unit, isShowToast: Boolean = true activity: BaseActivity<*>, successAuthorize: () -> Unit, isShowToast: Boolean = true
) { ) {
val locationManager = val locationManager =
context.getSystemService(Context.LOCATION_SERVICE) as LocationManager activity.getSystemService(Context.LOCATION_SERVICE) as LocationManager
checkPermissions( checkPermissions(
context, activity,
object : RequestPermissionCallback { object : RequestPermissionCallback {
override fun onRequestPermissionSuccess() { override fun onRequestPermissionSuccess() {
//判断GPS是否打开 //判断GPS是否打开
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
context.startActivity(intent) activity.startActivity(intent)
return return
} }
successAuthorize() successAuthorize()

View File

@@ -78,10 +78,8 @@ import com.daimajia.androidanimations.library.YoYo.YoYoString
import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions import com.hjq.permissions.XXPermissions
import com.hjq.permissions.permission.PermissionLists import com.hjq.permissions.permission.PermissionLists
import com.hjq.permissions.permission.base.IPermission
import com.hjq.toast.Toaster import com.hjq.toast.Toaster
import com.huantansheng.easyphotos.EasyPhotos import com.huantansheng.easyphotos.EasyPhotos
import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton
@@ -575,34 +573,53 @@ class ViewUtil private constructor() {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
XXPermissions.with(activity).permission(PermissionLists.getReadMediaImagesPermission()) XXPermissions.with(activity).permission(PermissionLists.getReadMediaImagesPermission())
.permission(PermissionLists.getCameraPermission()) .permission(PermissionLists.getCameraPermission()).request { _, deniedList ->
.request(object : OnPermissionCallback { val allGranted = deniedList.isEmpty()
override fun onGranted(permissions: MutableList<IPermission>, allGranted: Boolean) { if (allGranted) {
if (allGranted) { LogUtil.e("获取READ_MEDIA_IMAGES权限成功")
LogUtil.e("获取READ_MEDIA_IMAGES权限成功") EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance)
EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance) .setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count)
.setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count) .setPuzzleMenu(false).setCleanMenu(false).start(requestCode)
.setPuzzleMenu(false).setCleanMenu(false).start(requestCode) //activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
//activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left) } else {
val doNotAskAgain =
XXPermissions.isDoNotAskAgainPermissions(activity, deniedList)
if (doNotAskAgain) {
LogUtil.e("READ_MEDIA_IMAGES被永久拒绝授权请手动授予定位权限")
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(activity, deniedList)
} else { } else {
LogUtil.e("获取READ_MEDIA_IMAGES权限但部分权限未正常授予") LogUtil.e("获取READ_MEDIA_IMAGES权限但部分权限未正常授予")
Toaster.show(R.string.txt_permissions_fail_tips) Toaster.show(R.string.txt_permissions_fail_tips)
} }
} }
override fun onDenied( // override fun onGranted(permissions: MutableList<IPermission>, allGranted: Boolean) {
permissions: MutableList<IPermission>, doNotAskAgain: Boolean // if (allGranted) {
) { // LogUtil.e("获取READ_MEDIA_IMAGES权限成功")
if (doNotAskAgain) { // EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance)
LogUtil.e("READ_MEDIA_IMAGES被永久拒绝授权请手动授予定位权限") // .setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count)
// 如果是被永久拒绝就跳转到应用权限系统设置页面 // .setPuzzleMenu(false).setCleanMenu(false).start(requestCode)
XXPermissions.startPermissionActivity(activity, permissions) // //activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
} else { // } else {
LogUtil.e("获取READ_MEDIA_IMAGES权限失败") // LogUtil.e("获取READ_MEDIA_IMAGES权限,但部分权限未正常授予")
Toaster.show(R.string.txt_permissions_fail_tips) // Toaster.show(R.string.txt_permissions_fail_tips)
} // }
} // }
}) //
// override fun onDenied(
// permissions: MutableList<IPermission>, doNotAskAgain: Boolean
// ) {
// if (doNotAskAgain) {
// LogUtil.e("READ_MEDIA_IMAGES被永久拒绝授权请手动授予定位权限")
// // 如果是被永久拒绝就跳转到应用权限系统设置页面
// XXPermissions.startPermissionActivity(activity, permissions)
// } else {
// LogUtil.e("获取READ_MEDIA_IMAGES权限失败")
// Toaster.show(R.string.txt_permissions_fail_tips)
// }
// }
}
} }
/** /**

View File

@@ -15,6 +15,7 @@ import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.eventbus.XEventBus import com.abbidot.baselibrary.eventbus.XEventBus
import com.abbidot.baselibrary.util.AppUtils import com.abbidot.baselibrary.util.AppUtils
import com.abbidot.baselibrary.util.LogUtil import com.abbidot.baselibrary.util.LogUtil
import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.bean.BleTrackDeviceBean import com.abbidot.tracker.bean.BleTrackDeviceBean
import com.abbidot.tracker.bean.ReceiveDeviceData import com.abbidot.tracker.bean.ReceiveDeviceData
import com.abbidot.tracker.util.SocketUtilManageV2 import com.abbidot.tracker.util.SocketUtilManageV2
@@ -132,6 +133,7 @@ class SRBleUtil private constructor() {
fun openBluetooth(context: Context) { fun openBluetooth(context: Context) {
// BleManager.getInstance().enableBluetooth() // BleManager.getInstance().enableBluetooth()
val intent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) val intent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent) context.startActivity(intent)
} }
@@ -298,9 +300,7 @@ class SRBleUtil private constructor() {
override fun onNotifyFailure(exception: BleException?) { override fun onNotifyFailure(exception: BleException?) {
LogUtil.e("打开日志上报通道失败:${bleDevice.mac}$exception") LogUtil.e("打开日志上报通道失败:${bleDevice.mac}$exception")
openG40LogReportNotify( openG40LogReportNotify(
bleDevice, bleDevice, logG40ServiceUUID, logG40NotifyCharacteristicUUID
logG40ServiceUUID,
logG40NotifyCharacteristicUUID
) )
} }
@@ -474,10 +474,10 @@ class SRBleUtil private constructor() {
/** /**
*发送设备开启关闭led蓝牙指令 *发送设备开启关闭led蓝牙指令
*/ */
fun setBleLedSwitch(context: Context, bleDevice: BleDevice?, mode: Int) { fun setBleLedSwitch(activity: BaseActivity<*>, bleDevice: BleDevice?, mode: Int) {
//判断是否有蓝牙连接 //判断是否有蓝牙连接
if (BleManager.getInstance().isConnected(bleDevice)) { if (BleManager.getInstance().isConnected(bleDevice)) {
Util.checkBluetoothPermissionsEnabled(context, { Util.checkBluetoothPermissionsEnabled(activity, {
writeData( writeData(
bleDevice, SRBleCmdUtil.instance.ledState(SRBleCmdUtil.CMD_WRITE, mode) bleDevice, SRBleCmdUtil.instance.ledState(SRBleCmdUtil.CMD_WRITE, mode)
) )

View File

@@ -326,7 +326,12 @@ public final class BrowserView extends WebView {
// //
DialogUtils.Companion.showEditTextDialog(mWebView.getContext(), message, defaultValue DialogUtils.Companion.showEditTextDialog(mWebView.getContext(), message, defaultValue
, new GetResultCallback() { , new GetResultCallback() {
@Override @Override
public void onErrorCode() {
}
@Override
public void onRequestError(@Nullable String exceptionCode) { public void onRequestError(@Nullable String exceptionCode) {
} }
@@ -350,7 +355,7 @@ public final class BrowserView extends WebView {
@Override @Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> callback, public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> callback,
FileChooserParams params) { FileChooserParams params) {
Util.Companion.checkPermissions(mWebView.getContext(), Util.Companion.checkPermissions((BaseActivity) (mWebView.getContext()),
new Util.RequestPermissionCallback() { new Util.RequestPermissionCallback() {
@Override @Override
public void onRequestPermissionSuccess() { public void onRequestPermissionSuccess() {

View File

@@ -73,6 +73,14 @@
android:text="@string/txt_led_setting" android:text="@string/txt_led_setting"
android:textSize="@dimen/textSize14" android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" /> app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_marginTop="@dimen/dp_8"
android:drawableStart="@drawable/icon_permission_error_check_svg"
android:drawablePadding="@dimen/dp_8"
android:text="@string/txt_auto_renew_cancel"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"

View File

@@ -1078,5 +1078,6 @@
<string name="map_baidu_map">Baidu Map</string> <string name="map_baidu_map">Baidu Map</string>
<string name="txt_time_line">Timeline</string> <string name="txt_time_line">Timeline</string>
<string name="txt_phone_close_device">Keep phone close to device</string> <string name="txt_phone_close_device">Keep phone close to device</string>
<string name="txt_auto_renew_cancel">Auto-Renew: Cancel</string>
</resources> </resources>

View File

@@ -43,9 +43,9 @@ dependencies {
// Android官方库 // Android官方库
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api 'androidx.core:core-ktx:1.13.1' api 'androidx.core:core-ktx:1.16.0'
api 'androidx.appcompat:appcompat:1.7.0' api 'androidx.appcompat:appcompat:1.7.1'
api 'com.google.android.material:material:1.10.0' api 'com.google.android.material:material:1.13.0'
//SharedPreferences的替代https://github.com/Tencent/MMKV //SharedPreferences的替代https://github.com/Tencent/MMKV
implementation 'com.tencent:mmkv-static:2.4.0' implementation 'com.tencent:mmkv-static:2.4.0'

View File

@@ -1,6 +1,6 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '2.2.0' ext.kotlin_version = '2.3.10'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
@@ -13,14 +13,12 @@ buildscript {
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.11.1' classpath 'com.android.tools.build:gradle:8.11.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.4.2' classpath 'com.google.gms:google-services:4.4.4'
// classpath 'com.google.dagger:hilt-android-gradle-plugin:2.46.1' // classpath 'com.google.dagger:hilt-android-gradle-plugin:2.46.1'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.57' classpath 'com.google.dagger:hilt-android-gradle-plugin:2.57.2'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
// fcm
// classpath 'com.google.gms:google-services:4.3.4'
// hms // hms
// classpath 'com.huawei.agconnect:agcp:1.4.1.300' // classpath 'com.huawei.agconnect:agcp:1.4.1.300'
} }

View File

@@ -18,10 +18,10 @@ android {
dependencies { dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.10.0' implementation 'com.google.android.material:material:1.13.0'
implementation 'androidx.recyclerview:recyclerview:1.3.1' implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0'
implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.chrisbanes:PhotoView:2.3.0'
} }

View File

@@ -15,7 +15,7 @@ android {
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.code.gson:gson:2.13.2'
} }
sourceCompatibility = "7" sourceCompatibility = "7"