1.在解绑提示页面,增加提示语“Auto-Renew: Cancel”
2.适配Google Play 要求支持 16 KB 的内存页面大小,更新大部分第三方库到最新版本
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -49,7 +49,7 @@ class AddNewTracker2Activity :
|
||||
}
|
||||
}
|
||||
|
||||
Util.checkBluetoothPermissionsEnabled(mContext, {
|
||||
Util.checkBluetoothPermissionsEnabled(this, {
|
||||
startScanBle()
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
//远程控制
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ class AddWifiPowerZone3Activity :
|
||||
private fun checkPermission() {
|
||||
//从 Android 6.0(API 23)开始,定位权限现在被用于 Wi-Fi 扫描
|
||||
Util.checkPermissions(
|
||||
mContext, object : Util.RequestPermissionCallback {
|
||||
this, object : Util.RequestPermissionCallback {
|
||||
override fun onRequestPermissionSuccess() {
|
||||
addListData()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -28,7 +28,7 @@ class FirstPermissionsActivity :
|
||||
override fun initData() {
|
||||
super.initData()
|
||||
|
||||
mPermissionsCommon = PermissionsActivityCommon(mContext).apply {
|
||||
mPermissionsCommon = PermissionsActivityCommon(this).apply {
|
||||
registerGpsReceiver()
|
||||
}
|
||||
mPermissionsAdapter =
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -143,7 +143,7 @@ class ChoosePlanActivity :
|
||||
}
|
||||
|
||||
private fun goSureSubscriptionPlan() {
|
||||
Util.checkLocationPermissionsGpsEnabled(mContext, {
|
||||
Util.checkLocationPermissionsGpsEnabled(this, {
|
||||
Intent(
|
||||
mContext, SureSubscriptionPlanActivity::class.java
|
||||
).let {
|
||||
|
||||
@@ -49,7 +49,7 @@ class SubscriptionHistoryActivity :
|
||||
super.onResume()
|
||||
if (mRefreshPackage) {
|
||||
mRefreshPackage = false
|
||||
mSubscriptionViewModel.getHistoryIncludeRenew("sub_1TN3ccCUI9XSagUNmhpfpRk4")
|
||||
mSubscriptionViewModel.getHistoryIncludeRenew(subscriptionId)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user