Commit 08f5a0d0 authored by wanglei's avatar wanglei

...

parent 4a2e9f27
......@@ -2,7 +2,6 @@ package com.base.locationsharewhite.ui.locationmap
import android.animation.ValueAnimator
import android.graphics.Color
import android.os.Build
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
......@@ -19,12 +18,11 @@ import com.base.locationsharewhite.location.LocationShareListUtils
import com.base.locationsharewhite.map.MapUtils.addLocationMarker
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.ui.views.DialogView.showMapTypeDialog
import com.base.locationsharewhite.ui.views.DialogView.showViewerMoreDialog
import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.base.locationsharewhite.utils.ToastUtils.toast
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
......@@ -73,12 +71,18 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
private fun initAdapter() {
adapter = ViewingAdapter {
if (currentViewingBean != it) {
currentViewingBean = it
initFriendLocationMarker(it)
adapter = ViewingAdapter(
itemClick = {
if (currentViewingBean != it) {
currentViewingBean = it
initFriendLocationMarker(it)
}
},
moreClick = { anchorView, item ->
showViewerMoreDialog(anchorView)
}
}
)
binding.rvViewing.adapter = adapter
}
......@@ -180,11 +184,17 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
LogEx.logDebug(TAG, "onMapReady")
initMyLocationMarker()
resetMyLocation()
val flag = resetMyLocation()
if (!flag) {
locationPresenter.getGoogleServiceLocation()
locationPresenter.oneShotLocationCallBack = {
resetMyLocation()
}
}
}
private fun resetMyLocation() {
private fun resetMyLocation(): Boolean {
var myLatLng: LatLng? = getLatLngByLocationManager()
if (myLatLng == null) {
myLatLng = locationPresenter.googleLocation
......@@ -198,7 +208,9 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
myLatLng?.let {
myMarker?.position = myLatLng
map?.moveCamera(CameraUpdateFactory.newLatLngZoom(myLatLng, 15f))
return true
}
return false
}
private fun initMyLocationMarker() {
......
......@@ -30,7 +30,9 @@ class LocationPresenter(
//google的地理位置服务
private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
var googleLocation: LatLng? = null
var googleLocation: LatLng? = null
var oneShotLocationCallBack: (() -> Unit)? = null
fun startUploadMyLocation() {
if (uploadJob == null) {
......@@ -51,12 +53,18 @@ class LocationPresenter(
}
}
@SuppressLint("MissingPermission")
fun getGoogleServiceLocation() {
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
if (location != null) {
googleLocation = LatLng(location.latitude, location.longitude)
val latLng = LatLng(location.latitude, location.longitude)
googleLocation = latLng
oneShotLocationCallBack?.invoke()
oneShotLocationCallBack = null
}
}
}
......
......@@ -11,7 +11,10 @@ import com.base.locationsharewhite.ui.views.XmlEx.inflate
import com.base.locationsharewhite.utils.KotlinExt.toFormatHHMinute
import com.chad.library.adapter4.BaseQuickAdapter
class ViewingAdapter(val itemClick: (item: ViewingBean) -> Unit) : BaseQuickAdapter<ViewingBean, ViewingAdapter.ViewingViewHolder>() {
class ViewingAdapter(
val itemClick: (item: ViewingBean) -> Unit,
val moreClick: (view: View, item: ViewingBean) -> Unit,
) : BaseQuickAdapter<ViewingBean, ViewingAdapter.ViewingViewHolder>() {
inner class ViewingViewHolder(view: View) : ViewHolder(view)
override fun onBindViewHolder(holder: ViewingViewHolder, position: Int, item: ViewingBean?) {
......@@ -42,6 +45,9 @@ class ViewingAdapter(val itemClick: (item: ViewingBean) -> Unit) : BaseQuickAdap
}
val time = item.locatDate?.timezone ?: 0
binding.tvTime.text = time.toFormatHHMinute()
binding.ivMore.setOnClickListener {
moreClick.invoke(it, item)
}
binding.root.setOnClickListener {
itemClick.invoke(item)
}
......
......@@ -25,6 +25,8 @@ import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker
class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
......@@ -35,7 +37,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
}
private var map: GoogleMap? = null
private lateinit var mainPresenter: MainPresenter
private var marker: Marker? = null
override fun initView() {
LogEx.logDebug(TAG, "initView")
......@@ -43,6 +46,12 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
if (isLanguageRecreate(MyApplication.mainLanguage)) {
return
}
mainPresenter = MainPresenter(this)
if (!checkLocationPermission()) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) {
......@@ -71,6 +80,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
override fun initListener() {
super.initListener()
if (isLanguageRecreate(MyApplication.mainLanguage)) {
return
}
onBackPressedDispatcher.addCallback {
showAppExitDialog()
}
......@@ -112,12 +124,23 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
val latLng = getLatLngByLocationManager()
latLng?.let {
LogEx.logDebug(TAG, "getLastKnowLocation ${latLng.latitude} ${latLng.longitude}")
val myAvatar = LayoutInflater.from(this).inflate(R.layout.avatar_me, null)
map?.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
map?.addLocationMarker(myAvatar, latLng, "my")
val latLng: LatLng? = getLatLngByLocationManager()
if (latLng == null) {
mainPresenter.getGoogleServiceLocation()
mainPresenter.locationCallBack = {
if (marker == null) {
changeLocation(it)
}
}
} else {
changeLocation(latLng)
}
}
private fun changeLocation(latLng: LatLng) {
LogEx.logDebug(TAG, "getLastKnowLocation ${latLng.latitude} ${latLng.longitude}")
val myAvatar = LayoutInflater.from(this).inflate(R.layout.avatar_me, null)
map?.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
marker = map?.addLocationMarker(myAvatar, latLng, "my")
}
}
\ No newline at end of file
package com.base.locationsharewhite.ui.main
import android.annotation.SuppressLint
import android.app.Activity
import android.location.Location
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.model.LatLng
class MainPresenter(
val activity: Activity
) {
//google的地理位置服务
private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
var googleLocation: LatLng? = null
var locationCallBack: ((latLng: LatLng) -> Unit)? = null
@SuppressLint("MissingPermission")
fun getGoogleServiceLocation() {
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
if (location != null) {
val latLng = LatLng(location.latitude, location.longitude)
googleLocation = latLng
locationCallBack?.invoke(latLng)
}
}
}
}
\ No newline at end of file
......@@ -6,11 +6,15 @@ import android.content.Context
import android.graphics.Color
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.core.content.ContextCompat
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.DialogAppExitBinding
import com.base.locationsharewhite.databinding.DialogMapTypeBinding
import com.base.locationsharewhite.databinding.DialogViewerMoreBinding
import com.base.locationsharewhite.utils.LogEx
import com.google.android.gms.maps.GoogleMap
object DialogView {
......@@ -76,4 +80,56 @@ object DialogView {
dialog.dismiss()
}
}
fun Context.showViewerMoreDialog(
anchorView: View,
) {
val binding = DialogViewerMoreBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root)
dialog.show()
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val params = dialog.window?.attributes
params?.dimAmount = 0f
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_120)
params?.height = FrameLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.TOP
val height = resources.getDimensionPixelOffset(R.dimen.dp_90)
val isOutScreen = viewIsOutScreen(anchorView, height)
val location = IntArray(2)
anchorView.getLocationOnScreen(location)
val marginEnd = resources.getDimensionPixelOffset(R.dimen.dp_235)
LogEx.logDebug("showViewerMoreDialog", "marginEnd=$marginEnd ${location[0]}")
val x = location[0] - marginEnd
val y = if (isOutScreen) {
binding.root.background = ContextCompat.getDrawable(this, R.drawable.bg_b3000000_tlr10_bl10)
location[1] - height - resources.getDimensionPixelOffset(R.dimen.dp_48)
} else {
binding.root.background = ContextCompat.getDrawable(this, R.drawable.bg_b3000000_tl10_blr10)
location[1] + resources.getDimensionPixelOffset(R.dimen.dp_2)
}
params?.x = x
params?.y = y
dialog.window?.attributes = params
}
fun Context.viewIsOutScreen(view: View, height: Int): Boolean {
val screenHeight = resources.displayMetrics.heightPixels
val viewBottomPosition: Int = view.bottom
if (viewBottomPosition + height > screenHeight) {
// 超出了屏幕
return true
} else {
// 没有超出屏幕
return false
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#b3000000" />
<corners
android:bottomRightRadius="@dimen/dp_10"
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#b3000000" />
<corners
android:bottomLeftRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_b3000000_tl10_blr10"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="@string/rename"
android:textColor="@color/white"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#545454" />
<TextView
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="@string/delete"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
\ No newline at end of file
......@@ -10,4 +10,17 @@
<dimen name="dp_200">200dp</dimen>
<dimen name="dp_150">150dp</dimen>
<dimen name="dp_356">356dp</dimen>
<dimen name="dp_90">90dp</dimen>
<dimen name="dp_120">120dp</dimen>
<dimen name="dp_136">136dp</dimen>
<dimen name="dp_2">2dp</dimen>
<dimen name="dp_20">20dp</dimen>
<dimen name="dp_60">60dp</dimen>
<dimen name="dp_48">48dp</dimen>
<dimen name="dp_156">156dp</dimen>
<dimen name="dp_180">180dp</dimen>
<dimen name="dp_300">300dp</dimen>
<dimen name="dp_250">250dp</dimen>
<dimen name="dp_225">225dp</dimen>
<dimen name="dp_235">235dp</dimen>
</resources>
\ No newline at end of file
......@@ -54,4 +54,5 @@
<string name="enter_your_name">Enter your name</string>
<string name="name_is_empty">Name is empty</string>
<string name="me">me</string>
<string name="delete">Delete</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment