1.增加默认谷歌地图导航

2.优化人和宠物位置切换
This commit is contained in:
yezhiqiu
2026-04-09 09:47:27 +08:00
parent 16956f1086
commit 862c9c9a06
20 changed files with 272 additions and 146 deletions

View File

@@ -1 +1 @@
#Thu Mar 19 17:33:53 CST 2026 #Wed Apr 08 14:56:42 CST 2026

View File

@@ -28,9 +28,9 @@ android {
applicationId "com.abbidot.tracker" applicationId "com.abbidot.tracker"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 35 targetSdkVersion 35
versionCode 2112 versionCode 2113
versionName "2.1.12" // versionName "2.1.13"
// versionName "2.1.12-Beta4" versionName "2.1.13-Beta3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -49,6 +49,8 @@ import androidx.annotation.IntDef
ConstantInt.BasicPackage, ConstantInt.BasicPackage,
ConstantInt.PremiumPackage, ConstantInt.PremiumPackage,
ConstantInt.MinSportGoal, ConstantInt.MinSportGoal,
ConstantInt.PetSpecialType,
ConstantInt.DefaultType,
ConstantInt.NoShare, ConstantInt.NoShare,
ConstantInt.ReportTimeOutTime, ConstantInt.ReportTimeOutTime,
ConstantInt.PetLocationType ConstantInt.PetLocationType
@@ -100,6 +102,8 @@ annotation class ConstantInt {
const val OtherLocationType = 2 const val OtherLocationType = 2
const val UserLocationType = 1 const val UserLocationType = 1
const val PetLocationType = 0 const val PetLocationType = 0
const val PetSpecialType = 3
const val DefaultType = 4
//默认的运动目标时间(min) //默认的运动目标时间(min)
const val DefaultSportGoal = 60 const val DefaultSportGoal = 60

View File

@@ -0,0 +1,10 @@
package com.abbidot.tracker.constant
/**
*Created by .yzq on 2026/4/8/周三.
* @link
* @description:
*/
interface LinkMapCallback {
fun onCameraListener(type:Int)
}

View File

@@ -96,6 +96,7 @@ class AddNewTracker3Activity :
//接收蓝牙连接状态 //接收蓝牙连接状态
XEventBus.observe(this, EventName.ConnectDeviceState) { ble: BleTrackDeviceBean -> XEventBus.observe(this, EventName.ConnectDeviceState) { ble: BleTrackDeviceBean ->
if (mConBleMac == ble.mac) { if (mConBleMac == ble.mac) {
mViewBinding.ivAddNewTracker3RefreshBtn.isEnabled = true
if (ble.conState == ConState.CONNECTED) { if (ble.conState == ConState.CONNECTED) {
setNoConnectState() setNoConnectState()
val intent = Intent(mContext, AddPairedSuccessActivity::class.java) val intent = Intent(mContext, AddPairedSuccessActivity::class.java)
@@ -107,9 +108,6 @@ class AddNewTracker3Activity :
startActivity(intent) startActivity(intent)
} else if (ble.conState == ConState.CONNECTION_FAIL) { } else if (ble.conState == ConState.CONNECTION_FAIL) {
setNoConnectState() setNoConnectState()
mViewBinding.ivAddNewTracker3RefreshBtn.isEnabled = true
} else {
mViewBinding.ivAddNewTracker3RefreshBtn.isEnabled = true
} }
} }
} }

View File

@@ -348,6 +348,13 @@ class AddPairedSuccessActivity :
} }
} }
override fun leftBackOnClick() {
if (!TextUtils.isEmpty(mMac)) {
SRBleUtil.instance.disconnectToMac(mMac)
}
super.leftBackOnClick()
}
override fun onClick(v: View?) { override fun onClick(v: View?) {
mViewBinding.apply { mViewBinding.apply {
when (v!!) { when (v!!) {

View File

@@ -10,6 +10,7 @@ import com.abbidot.tracker.base.BaseMapCommon
import com.abbidot.tracker.bean.HistoryDataBean import com.abbidot.tracker.bean.HistoryDataBean
import com.abbidot.tracker.bean.MapDeviceBean import com.abbidot.tracker.bean.MapDeviceBean
import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.LinkMapCallback
import com.abbidot.tracker.databinding.LayoutPetLocationInfoBinding import com.abbidot.tracker.databinding.LayoutPetLocationInfoBinding
import com.abbidot.tracker.ui.fragment.map.baidumap.HomeMapBaiduMapFragment import com.abbidot.tracker.ui.fragment.map.baidumap.HomeMapBaiduMapFragment
import com.abbidot.tracker.ui.fragment.map.googlemap.HomeMapGoogleMapFragmentV3 import com.abbidot.tracker.ui.fragment.map.googlemap.HomeMapGoogleMapFragmentV3

View File

@@ -11,6 +11,7 @@ import android.view.Gravity
import android.view.View import android.view.View
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.commit import androidx.fragment.app.commit
@@ -123,7 +124,7 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
mViewBinding.apply { mViewBinding.apply {
getHomeV2Activity()?.edgeToEdgeAdapterBars( getHomeV2Activity()?.edgeToEdgeAdapterBars(
rlHomeMapTopLayout, WindowInsetsCompat.Type.statusBars() root, WindowInsetsCompat.Type.statusBars()
) )
mFragment = mHomeMapCommon.getMapFragment( mFragment = mHomeMapCommon.getMapFragment(
mContext!!, mContext!!,
@@ -151,6 +152,17 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
// mContext!!, rvHomeMapDeviceMsg, mDeviceMsgAdapter, bottom = 10 // mContext!!, rvHomeMapDeviceMsg, mDeviceMsgAdapter, bottom = 10
// ) // )
// rlHomeMapTopLayout.setOnTouchListener { _, _ ->
// if (mShowCenterLocationType == ConstantInt.PetLocationType) {
// mShowCenterLocationType = ConstantInt.PetSpecialType
// ViewUtil.instance.setMapSwitchLocationButtonImage(
// homeMapRefreshBtn, mShowCenterLocationType
// )
// }
// false
// }
setOnClickListenerViews( setOnClickListenerViews(
homeMapRefreshBtn, homeMapRefreshBtn,
homeMapBluetoothBtn, homeMapBluetoothBtn,
@@ -160,7 +172,8 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
llHomeMapTopPet.homeDataPetNameSmall, llHomeMapTopPet.homeDataPetNameSmall,
llHomeMapTopPet.homeDataPetHeadSmall.root, llHomeMapTopPet.homeDataPetHeadSmall.root,
ilHomeMapDeviceBatteryLayout.ivDeviceCloseBtn, ilHomeMapDeviceBatteryLayout.ivDeviceCloseBtn,
ilHomeMapDeviceMsg.ivDeviceMsgCloseBtn ilHomeMapDeviceMsg.ivDeviceMsgCloseBtn,
ilHomeMapPetLocation.ivPetLocationNavigationBtn
) )
if (AppUtils.isDebug()) { if (AppUtils.isDebug()) {
@@ -185,7 +198,9 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (mShowCenterLocationType == ConstantInt.PetLocationType) isMoveCamera = true if (mShowCenterLocationType == ConstantInt.PetLocationType) {
isMoveCamera = true
}
getHomeV2Activity()?.apply { getHomeV2Activity()?.apply {
//其他页面是否选择了宠物 //其他页面是否选择了宠物
if (mCurrentShowPetPos != mSelectPetPosition) { if (mCurrentShowPetPos != mSelectPetPosition) {
@@ -863,6 +878,9 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
} }
} }
/**
* 停止一键定位
*/
private fun stopRefreshLocation() { private fun stopRefreshLocation() {
getHomeV2Activity()?.apply { getHomeV2Activity()?.apply {
if (isNotifyRefreshLocation) { if (isNotifyRefreshLocation) {
@@ -891,6 +909,26 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
} }
} }
private fun goNavigation() {
mMapDeviceBean?.let { m ->
try {
//自动弹出手机中已经有安装地图的应用
val uri = if (MMKVUtil.getBoolean(MMKVKey.isGpsToGCJ02)) {
val convertLatLon =
LonAndLatUtil.convertFromWGS84ToGCJ02(m.latitude, m.longitude)
"google.navigation:q=${convertLatLon[0]},${convertLatLon[1]}&mode=w".toUri()
} else {
"google.navigation:q=${m.latitude},${m.longitude}&mode=w".toUri()
}
val intent = Intent(Intent.ACTION_VIEW, uri)
intent.setPackage("com.google.android.apps.maps")
startActivity(intent)
} catch (e: Exception) {
showToast(getString(R.string.txt_no_install))
}
}
}
override fun onClick(v: View?) { override fun onClick(v: View?) {
if (isLimitClick()) return if (isLimitClick()) return
mViewBinding.apply { mViewBinding.apply {
@@ -901,13 +939,23 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
showToast(R.string.no_bind_pet) showToast(R.string.no_bind_pet)
return return
} }
if (mShowCenterLocationType == ConstantInt.PetLocationType) { when (mShowCenterLocationType) {
// ConstantInt.PetSpecialType -> {
// mShowCenterLocationType = ConstantInt.PetLocationType
// mHomeMapCommon.switchShowLocation(mShowCenterLocationType)
// }
ConstantInt.PetLocationType -> {
mShowCenterLocationType = ConstantInt.UserLocationType mShowCenterLocationType = ConstantInt.UserLocationType
mHomeMapCommon.switchShowLocation(mShowCenterLocationType) mHomeMapCommon.switchShowLocation(mShowCenterLocationType)
} else { }
ConstantInt.UserLocationType -> {
mShowCenterLocationType = ConstantInt.PetLocationType mShowCenterLocationType = ConstantInt.PetLocationType
isMoveCamera = true // isMoveCamera = true
updateMapDeviceStatus(useBleLocation = false) // updateMapDeviceStatus(useBleLocation = false)
mHomeMapCommon.switchShowLocation(mShowCenterLocationType)
}
} }
ViewUtil.instance.setMapSwitchLocationButtonImage( ViewUtil.instance.setMapSwitchLocationButtonImage(
homeMapRefreshBtn, mShowCenterLocationType homeMapRefreshBtn, mShowCenterLocationType
@@ -944,8 +992,10 @@ class MapV3Fragment : BaseFragment<FragmentMapV3Binding>(FragmentMapV3Binding::i
mMapDeviceBean?.isCloseMsg = true mMapDeviceBean?.isCloseMsg = true
ilHomeMapDeviceMsg.root.visibility = View.GONE ilHomeMapDeviceMsg.root.visibility = View.GONE
} }
ilHomeMapPetLocation.ivPetLocationNavigationBtn -> goNavigation()
}
}
} }
} }
}
}

View File

@@ -304,15 +304,40 @@ abstract class BaseGoogleMapFragment :
* 切换用户和宠物的位置居中显示,移动摄像头中心 * 切换用户和宠物的位置居中显示,移动摄像头中心
*/ */
fun switchShowLocation(@ConstantInt type: Int) { fun switchShowLocation(@ConstantInt type: Int) {
val latLng = if (type == ConstantInt.PetLocationType) { when (type) {
ConstantInt.PetLocationType -> {
//刷新下用户当前的位置 //刷新下用户当前的位置
getLastLocation() getLastLocation()
mPetLatLng mPetLatLng?.let {
} else { mGoogleMapZoom = 17f
mUserLatLng refreshPetCurrentLocation(it, true)
} }
latLng?.let { }
moveCameraLocation(it)
ConstantInt.UserLocationType -> {
mPetLatLng?.let {
mUserLatLng?.apply {
setLatLngZoom(mContext!!, 250, it, this)
cameraUpdateMove()
}
}
}
else->{
}
// ConstantInt.DefaultType -> {
// mPetLatLng?.let {
// mGoogleMapZoom = 17f
// refreshPetCurrentLocation(it, true)
// }
// }
// else -> {
// mUserLatLng?.let {
// moveCameraLocation(it)
// }
// }
} }
} }
@@ -948,10 +973,9 @@ abstract class BaseGoogleMapFragment :
it.isMyLocationButtonEnabled = false it.isMyLocationButtonEnabled = false
//用于设置是启用还是停用倾斜手势的偏好设置。 //用于设置是启用还是停用倾斜手势的偏好设置。
// https://developers.google.cn/maps/documentation/android-sdk/reference/com/google/android/libraries/maps/UiSettings?hl=zh-cn // https://developers.google.cn/maps/documentation/android-sdk/reference/com/google/android/libraries/maps/UiSettings?hl=zh-cn
it.isTiltGesturesEnabled = false
it.isMapToolbarEnabled = false it.isMapToolbarEnabled = false
it.isTiltGesturesEnabled = false it.isTiltGesturesEnabled = false
it.isCompassEnabled = false it.isCompassEnabled = true
} }
onMapLoadOk(googleMap) onMapLoadOk(googleMap)
@@ -1052,6 +1076,14 @@ abstract class BaseGoogleMapFragment :
mCameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), screenPaddingPx) mCameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), screenPaddingPx)
} }
private fun cameraUpdateMove() {
mGoogleMap?.apply {
mCameraUpdate?.let {
animateCamera(it)
}
}
}
fun getMyZoom1(distance: Double): Float { fun getMyZoom1(distance: Double): Float {
val scale = intArrayOf( val scale = intArrayOf(
3,//21 3,//21

View File

@@ -115,8 +115,6 @@ class HistoryDataGoogleMapFragment : BaseGoogleMapFragment() {
true true
} else false } else false
} }
uiSettings.isCompassEnabled = true
} }
getLastLocation() getLastLocation()

View File

@@ -38,6 +38,7 @@ import androidx.core.animation.doOnCancel
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isInvisible import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.core.view.setPadding import androidx.core.view.setPadding
import androidx.core.widget.addTextChangedListener import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
@@ -89,7 +90,6 @@ import com.qmuiteam.qmui.util.QMUIDisplayHelper
import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import java.util.Calendar import java.util.Calendar
import androidx.core.view.isVisible
/** /**
@@ -892,6 +892,12 @@ class ViewUtil private constructor() {
fun setMapSwitchLocationButtonImage(iv: ImageView, locationType: Int) { fun setMapSwitchLocationButtonImage(iv: ImageView, locationType: Int) {
viewShowFadeInAnimation(iv, 600) viewShowFadeInAnimation(iv, 600)
when (locationType) { when (locationType) {
ConstantInt.PetSpecialType -> {
iv.setBackgroundResource(R.drawable.shape_white_circle_bg)
iv.setImageResource(R.drawable.icon_pet_foot_svg)
iv.setPadding(AppUtils.dpToPx(14))
}
ConstantInt.PetLocationType -> { ConstantInt.PetLocationType -> {
iv.setBackgroundResource(R.drawable.shape_yellow_circle_bg) iv.setBackgroundResource(R.drawable.shape_yellow_circle_bg)
iv.setImageResource(R.drawable.icon_pet_foot_svg) iv.setImageResource(R.drawable.icon_pet_foot_svg)
@@ -909,6 +915,12 @@ class ViewUtil private constructor() {
iv.setImageResource(R.drawable.icon_pet_fence_svg) iv.setImageResource(R.drawable.icon_pet_fence_svg)
iv.setPadding(AppUtils.dpToPx(13)) iv.setPadding(AppUtils.dpToPx(13))
} }
ConstantInt.DefaultType -> {
iv.setBackgroundResource(R.drawable.shape_white_circle_bg)
iv.setImageResource(R.drawable.icon_map_gps)
iv.setPadding(AppUtils.dpToPx(13))
}
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 B

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 531 B

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 705 B

After

Width:  |  Height:  |  Size: 704 B

View File

@@ -1,10 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.fragment.map.MapV3Fragment"> tools:context=".ui.fragment.map.MapV3Fragment">
<include
android:id="@+id/ll_home_map_top_pet"
layout="@layout/layout_top_pet_data_small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_8" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/fc_home_map_fragment" android:id="@+id/fc_home_map_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -29,20 +41,12 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginHorizontal="@dimen/dp_8"> android:layout_marginHorizontal="@dimen/dp_8">
<include
android:id="@+id/ll_home_map_top_pet"
layout="@layout/layout_top_pet_data_small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_8" />
<include <include
android:id="@+id/il_home_map_device_msg" android:id="@+id/il_home_map_device_msg"
layout="@layout/item_home_map_device_msg" layout="@layout/item_home_map_device_msg"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/ll_home_map_top_pet" android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:layout_marginTop="@dimen/dp_6" android:layout_marginTop="@dimen/dp_6"
android:visibility="gone" /> android:visibility="gone" />
@@ -50,7 +54,6 @@
android:id="@+id/rv_home_map_device_state" android:id="@+id/rv_home_map_device_state"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/ll_home_map_top_pet"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginTop="@dimen/dp_60" android:layout_marginTop="@dimen/dp_60"
android:layout_marginEnd="@dimen/dp_2" android:layout_marginEnd="@dimen/dp_2"
@@ -128,3 +131,4 @@
</RelativeLayout> </RelativeLayout>
</FrameLayout> </FrameLayout>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -41,7 +41,6 @@
<com.abbidot.tracker.widget.VerticalTopToBottomSeekBar <com.abbidot.tracker.widget.VerticalTopToBottomSeekBar
android:id="@+id/vsb_map_route_line" android:id="@+id/vsb_map_route_line"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:visibility="gone"
android:layout_height="320dp" android:layout_height="320dp"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_marginBottom="@dimen/dp_18" android:layout_marginBottom="@dimen/dp_18"
@@ -49,7 +48,8 @@
android:maxHeight="@dimen/dp_12" android:maxHeight="@dimen/dp_12"
android:progress="0" android:progress="0"
android:progressDrawable="@drawable/shape_seek_bar_style" android:progressDrawable="@drawable/shape_seek_bar_style"
android:thumb="@drawable/shape_black_circle_bg" /> android:thumb="@drawable/shape_black_circle_bg"
android:visibility="gone" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<RelativeLayout <RelativeLayout

View File

@@ -11,7 +11,8 @@
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_pet_location_reverse_geocode" android:id="@+id/tv_pet_location_reverse_geocode"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_marginTop="@dimen/dp_28" android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_42"
android:drawablePadding="@dimen/dp_2" android:drawablePadding="@dimen/dp_2"
android:textSize="@dimen/textSize16" android:textSize="@dimen/textSize16"
app:typeface="@string/roboto_regular_font" /> app:typeface="@string/roboto_regular_font" />
@@ -21,9 +22,18 @@
android:id="@+id/tv_pet_location_update_time" android:id="@+id/tv_pet_location_update_time"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_below="@id/tv_pet_location_reverse_geocode" android:layout_below="@id/tv_pet_location_reverse_geocode"
android:layout_alignParentEnd="true" android:layout_marginTop="@dimen/dp_2"
android:layout_marginBottom="@dimen/dp_12" android:layout_marginBottom="@dimen/dp_12"
android:textColor="@color/select_color3" android:textColor="@color/select_color3"
android:textSize="@dimen/textSize12" android:textSize="@dimen/textSize12"
app:typeface="@string/roboto_regular_font" /> app:typeface="@string/roboto_regular_font" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_pet_location_navigation_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="@drawable/selector_transparent_pressed"
android:src="@drawable/ico_map_navigati_image" />
</RelativeLayout> </RelativeLayout>