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
versionCode 2202
// versionName "2.2.2"
versionName "2.2.2-Beta4"
versionName "2.2.2-Beta6"
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文件
Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
@@ -188,23 +199,23 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
// 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-runtime:2.2.0'
implementation 'androidx.activity:activity-ktx:1.9.3'
implementation 'androidx.fragment:fragment-ktx:1.5.6'
implementation 'androidx.annotation:annotation:1.9.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.7'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7'
implementation 'androidx.activity:activity-ktx:1.10.1'
implementation 'androidx.fragment:fragment-ktx:1.8.9'
implementation 'androidx.annotation:annotation:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.10.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.10.0'
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-ktx:2.5.2'
kapt 'androidx.room:room-compiler:2.5.2'
implementation 'androidx.room:room-ktx:2.8.4'
kapt 'androidx.room:room-compiler:2.8.4'
//hilt依赖注入https://mvnrepository.com/artifact/com.google.dagger/hilt-android-gradle-plugin
implementation "com.google.dagger:hilt-android:2.57"
kapt "com.google.dagger:hilt-android-compiler:2.57"
implementation "com.google.dagger:hilt-android:2.57.2"
kapt "com.google.dagger:hilt-android-compiler:2.57.2"
//Android UI 开发效率的 UI 库https://github.com/Tencent/QMUI_Android
implementation 'com.qmuiteam:qmui:2.1.0'
@@ -221,11 +232,11 @@ dependencies {
implementation "io.coil-kt:coil-gif:1.4.0"//支持GIF
//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
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.11'
implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.14"
//升级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'
@@ -245,21 +256,24 @@ dependencies {
//mapbox地图https://github.com/mapbox/mapbox-maps-android
// implementation 'com.mapbox.maps:android:10.2.0'
//https://github.com/mapbox/mapbox-search-android
//用mapbox搜索SDK,地理编码 有搜索ui组件已包括mapbox-search-android架包
implementation "com.mapbox.search:mapbox-search-android-ui:2.5.1"
/**用mapbox搜索SDK,地理编码 有搜索ui组件已包括mapbox-search-android架包
* 支持 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组件
// implementation "com.mapbox.search:mapbox-search-android:1.0.0-beta.25"
//用于计算距离https://docs.mapbox.com/android/java/guides/turf/#available-methods
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:6.15.0'
//用于计算路线规划信息https://docs.mapbox.com/android/java/examples/dashed-directions-line/
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:6.3.0'
//用于计算距离https://docs.mapbox.com/android/java/guides/#installation
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-turf:7.10.0'
//用于计算路线规划信息、地理编码
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:7.10.0'
// 权限请求框架https://github.com/getActivity/XXPermissions
implementation 'com.github.getActivity:XXPermissions:25.2'
implementation 'com.github.getActivity:XXPermissions:28.2'
// 吐司框架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模式下集成
debugImplementation 'com.github.getActivity:Logcat:12.3'
debugImplementation 'com.github.getActivity:Logcat:13.0'
// PictureSelector图片选择器,需要compileSdkVersion=31 https://github.com/LuckSiege/PictureSelector
// implementation 'io.github.lucksiege:pictureselector:v3.0.3'
@@ -268,14 +282,14 @@ dependencies {
//压缩图片 https://github.com/zetbaitsu/Compressor
implementation 'id.zelory:compressor:3.0.1'
//图片裁剪功能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*****************************************************
// 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: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:jpush-google:5.8.0' // 此处以JPush 4.0.0 版本为例
implementation 'cn.jiguang.sdk:jcore-google:5.3.7' // 此处以JCore 2.7.2 版本为例。
implementation 'cn.jiguang.sdk:jpush-google:6.0.7' // 此处以JPush 4.0.0 版本为例
// 接入华为厂商
// implementation 'com.huawei.hms:push:6.1.0.300'
// 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.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:+'
@@ -326,7 +340,7 @@ dependencies {
implementation 'no.nordicsemi.android:mcumgr-ble:2.7.4'
//适配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
// implementation 'com.haibin:calendarview:3.7.1'
//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.DrivingRouteResult
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.OnGetRoutePlanResultListener
import com.baidu.mapapi.search.route.PlanNode
@@ -144,6 +145,10 @@ class RoutePlanningViewModel : ViewModel() {
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))
//预先加载相册,防止上传头像几千张照片加载慢
XXPermissions.with(this).permission(PermissionLists.getReadMediaImagesPermission())
.request { _, allGranted ->
.request { _, deniedList ->
val allGranted = deniedList.isEmpty()
if (allGranted) {
EasyPhotos.preLoad(this)
// {
@@ -310,7 +311,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
//蓝牙连接就去连接socket
// mBleReportManage.dealBleReportData(macID, null)
} else {
mLogBleReportViewModel.uploadLog(mContext, macID,deviceOutId)
mLogBleReportViewModel.uploadLog(mContext, macID, deviceOutId)
startCountDownConBle(15)
}
}
@@ -454,7 +455,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
packageUnavailableState()
//刚开始打开APP上传日志
getPet(false)?.apply {
mLogBleReportViewModel.uploadLog(mContext, macID,deviceOutId)
mLogBleReportViewModel.uploadLog(mContext, macID, deviceOutId)
}
} else {
onChangeClick(mSelectPetPosition)
@@ -573,7 +574,7 @@ class HomeV2Activity : BaseActivity<ActivityHomeV2Binding>(ActivityHomeV2Binding
private fun checkPermissions() {
val checkBleOpen = MMKVUtil.getBoolean(MMKVKey.isFirstCheckBleOpen, true)
if (checkBleOpen) MMKVUtil.putBoolean(MMKVKey.isFirstCheckBleOpen, false)
Util.checkBluetoothPermissionsEnabled(mContext, {
Util.checkBluetoothPermissionsEnabled(this, {
// mAutomaticConnectionDeviceViewModel.autoConnectBleDevice(mContext)
}, isCheckBleOpen = checkBleOpen)
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -294,7 +294,7 @@ class LedLightActivityV0 : BaseActivity<ActivityLedLightBinding>(ActivityLedLigh
private fun setBleLedMode(mode: Int) {
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() {
Util.checkLocationPermissionsGpsEnabled(mContext, {
Util.checkLocationPermissionsGpsEnabled(this, {
val intent = Intent(mContext, EditWifiPowerZoneActivity::class.java)
intent.putExtra(ConstantString.WiFi, mWiFiBean)
mDecWiFiAddressData?.let {

View File

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

View File

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

View File

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

View File

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

View File

@@ -718,7 +718,7 @@ class LiveActivityV3 : BaseActivity<ActivityLiveV3Binding>(ActivityLiveV3Binding
*/
private fun setLedSwitch(mode: Int) {
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) {
Util.checkBluetoothPermissionsEnabled(mContext, {
Util.checkBluetoothPermissionsEnabled(this, {
showAndHideFindLayout()
mViewBinding.ilLiveV2BluetoothFindDevice.apply {
mFindBleDeviceViewModel.startScanFind(

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -78,10 +78,8 @@ import com.daimajia.androidanimations.library.YoYo.YoYoString
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions
import com.hjq.permissions.permission.PermissionLists
import com.hjq.permissions.permission.base.IPermission
import com.hjq.toast.Toaster
import com.huantansheng.easyphotos.EasyPhotos
import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton
@@ -575,34 +573,53 @@ class ViewUtil private constructor() {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
XXPermissions.with(activity).permission(PermissionLists.getReadMediaImagesPermission())
.permission(PermissionLists.getCameraPermission())
.request(object : OnPermissionCallback {
override fun onGranted(permissions: MutableList<IPermission>, allGranted: Boolean) {
if (allGranted) {
LogUtil.e("获取READ_MEDIA_IMAGES权限成功")
EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance)
.setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count)
.setPuzzleMenu(false).setCleanMenu(false).start(requestCode)
//activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
.permission(PermissionLists.getCameraPermission()).request { _, deniedList ->
val allGranted = deniedList.isEmpty()
if (allGranted) {
LogUtil.e("获取READ_MEDIA_IMAGES权限成功")
EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance)
.setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count)
.setPuzzleMenu(false).setCleanMenu(false).start(requestCode)
//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 {
LogUtil.e("获取READ_MEDIA_IMAGES权限但部分权限未正常授予")
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)
}
}
})
// override fun onGranted(permissions: MutableList<IPermission>, allGranted: Boolean) {
// if (allGranted) {
// LogUtil.e("获取READ_MEDIA_IMAGES权限成功")
// EasyPhotos.createAlbum(activity, true, false, CoilEngine.instance)
// .setFileProviderAuthority(FileUtil.FILE_PROVIDER).setCount(count)
// .setPuzzleMenu(false).setCleanMenu(false).start(requestCode)
// //activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
// } else {
// LogUtil.e("获取READ_MEDIA_IMAGES权限,但部分权限未正常授予")
// 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.util.AppUtils
import com.abbidot.baselibrary.util.LogUtil
import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.bean.BleTrackDeviceBean
import com.abbidot.tracker.bean.ReceiveDeviceData
import com.abbidot.tracker.util.SocketUtilManageV2
@@ -132,6 +133,7 @@ class SRBleUtil private constructor() {
fun openBluetooth(context: Context) {
// BleManager.getInstance().enableBluetooth()
val intent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
@@ -298,9 +300,7 @@ class SRBleUtil private constructor() {
override fun onNotifyFailure(exception: BleException?) {
LogUtil.e("打开日志上报通道失败:${bleDevice.mac}$exception")
openG40LogReportNotify(
bleDevice,
logG40ServiceUUID,
logG40NotifyCharacteristicUUID
bleDevice, logG40ServiceUUID, logG40NotifyCharacteristicUUID
)
}
@@ -474,10 +474,10 @@ class SRBleUtil private constructor() {
/**
*发送设备开启关闭led蓝牙指令
*/
fun setBleLedSwitch(context: Context, bleDevice: BleDevice?, mode: Int) {
fun setBleLedSwitch(activity: BaseActivity<*>, bleDevice: BleDevice?, mode: Int) {
//判断是否有蓝牙连接
if (BleManager.getInstance().isConnected(bleDevice)) {
Util.checkBluetoothPermissionsEnabled(context, {
Util.checkBluetoothPermissionsEnabled(activity, {
writeData(
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
, new GetResultCallback() {
@Override
@Override
public void onErrorCode() {
}
@Override
public void onRequestError(@Nullable String exceptionCode) {
}
@@ -350,7 +355,7 @@ public final class BrowserView extends WebView {
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> callback,
FileChooserParams params) {
Util.Companion.checkPermissions(mWebView.getContext(),
Util.Companion.checkPermissions((BaseActivity) (mWebView.getContext()),
new Util.RequestPermissionCallback() {
@Override
public void onRequestPermissionSuccess() {

View File

@@ -73,6 +73,14 @@
android:text="@string/txt_led_setting"
android:textSize="@dimen/textSize14"
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
style="@style/my_TextView_style_v2"

View File

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

View File

@@ -43,9 +43,9 @@ dependencies {
// Android官方库
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api 'androidx.core:core-ktx:1.13.1'
api 'androidx.appcompat:appcompat:1.7.0'
api 'com.google.android.material:material:1.10.0'
api 'androidx.core:core-ktx:1.16.0'
api 'androidx.appcompat:appcompat:1.7.1'
api 'com.google.android.material:material:1.13.0'
//SharedPreferences的替代https://github.com/Tencent/MMKV
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.
buildscript {
ext.kotlin_version = '2.2.0'
ext.kotlin_version = '2.3.10'
repositories {
google()
mavenCentral()
@@ -13,14 +13,12 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:8.11.1'
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.57'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.57.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// fcm
// classpath 'com.google.gms:google-services:4.3.4'
// hms
// classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}

View File

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

View File

@@ -15,7 +15,7 @@ android {
dependencies {
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"