-homePage
Код: Выделить всё
class HomeFragment : Fragment() {
companion object {
private const val TAG = "HomeFragment"
private const val ACCEPT_TIMEOUT = 60000L // 60 seconds
const val ACTIVE = 1
const val INACTIVE = 0
}
private var acceptTripTimer: CountDownTimer? = null
private lateinit var binding: FragmentHomeBinding
private lateinit var parent: MainActivity
private lateinit var serviceIntent: Intent
private lateinit var tripReceiver: Receiver
private lateinit var trip: Trip
private lateinit var mFusedLocationClient: FusedLocationProviderClient
private lateinit var currentLatLng: LatLng
private lateinit var googleMap: GoogleMap
private val database = Firebase.database
private val driverRef = database.getReference("Drivers")
private val viewModel: HomeViewModel by viewModels()
// private val viewModelImage:ProfileViewModel by viewModels()
private var status = ACTIVE
private var isTripExist = false
private var mGeoApiContext: GeoApiContext? = null
private var isCancelled = false
private var isLocationFetched = false
private val mapCallback = OnMapReadyCallback { googleMap ->
this.googleMap = googleMap
getCurrentLocation()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentHomeBinding.inflate(inflater)
parent = requireActivity() as MainActivity
tripReceiver = Receiver()
// getTripid() to call the gettripby id
parent.registerReceiver(tripReceiver, IntentFilter("com.tawajood.Driver.Notify"))
serviceIntent = Intent(parent, LocationService::class.java)
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext())
onClick()
Log.e("trip id from create", PrefsHelper.getCurrentTrip().toString())
if( PrefsHelper.getCurrentTrip() != -1 && PrefsHelper.getCurrentTripId() != 0 && PrefsHelper.getAccepted() != 1){
Log.e("trip id from inside","trip id from inside ${PrefsHelper.getCurrentTrip()}")
}
observeData()
listenToTripUpdates()
if (PrefsHelper.getCurrentTripId() != -1 && PrefsHelper.getCurrentTripId() != 0) {
if (PrefsHelper.getCancelledTrip() != 1) {
startLocationService()
parent.navController.navigate(R.id.action_homeFragment_to_tripFragment)
}
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.e("trip id from viewCreated",PrefsHelper.getCurrentTrip().toString())
val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(mapCallback)
if (mGeoApiContext == null) {
mGeoApiContext = GeoApiContext.Builder()
.apiKey(getString(R.string.google_maps_key))
.build()
}
}
private fun startAcceptTripTimer() {
acceptTripTimer = object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {
// Update the UI if needed to show the remaining time
}
override fun onFinish() {
// If the timer finishes, reject the trip automatically
viewModel.rejectTrip(trip.id)
}
}.start()
// acceptTripTimer = lifecycleScope.launch {
// delay(ACCEPT_TIMEOUT)
// if (isActive) {
// // Auto-reject the trip if the timer runs out
// viewModel.rejectTrip(trip.id)
// }
// }
}
//=========================================================================================================
override fun onResume() {
super.onResume()
viewModel.getStatus()
Log.e("trip id from resume1",PrefsHelper.getCurrentTrip().toString())
// Log.e("trip id from resume accepted",PrefsHelper.getAccepted().toString())
if( PrefsHelper.getCurrentTrip() != -1 && PrefsHelper.getCurrentTripId() != 0 && PrefsHelper.getAccepted() != 1){
Log.e("trip id from resume inside"," ${PrefsHelper.getCurrentTrip()}")
}
viewModel.updateFCMToken()
if (isCancelled){
hideTripInfo()
viewModel.makeTripIdle()
googleMap.clear()
googleMap.addMarker(MarkerOptions().position(currentLatLng))
isCancelled = false
updateDriverInfoToFirebase(1)
}
}
Код: Выделить всё
private fun observeData() {
lifecycleScope.launchWhenStarted {
viewModel.userBillingInfo.collectLatest {
parent.hideLoading()
when (it) {
is Resource.Error -> showAlertDialog(
requireContext(),
getString(R.string.error),
it.message.toString()
)
is Resource.Idle -> {}
is Resource.Loading -> parent.showLoading()
is Resource.Success -> {
val billingAdress=it.data
// if (billingAdress != null) {
if (billingAdress != null) {
// if(billingAdress.address == null){
// }
Log.e("No error",billingAdress.toString())
}else{
// showBillingInfoPopup()
}
// }
// binding.priceTv.text =
// "${it.data!!.balance} ${getString(R.string.currency)}"
}
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.status.collectLatest {
parent.hideLoading()
when (it) {
is Resource.Error -> showAlertDialog(
requireContext(),
getString(R.string.error),
it.message.toString()
)
is Resource.Idle -> {
}
is Resource.Loading -> parent.showLoading()
is Resource.Success -> {
status = it.data!!
updateDriverInfoToFirebase(status)
startLocationService()
when (status) {
ACTIVE -> setActiveClicked()
INACTIVE -> setInactiveClicked()
}
}
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.changeStatus.collectLatest {
parent.hideLoading()
when (it) {
is Resource.Error -> showAlertDialog(
requireContext(),
getString(R.string.error),
it.message.toString()
)
is Resource.Idle -> {
}
is Resource.Loading -> parent.showLoading()
is Resource.Success -> {
val statusMap = mutableMapOf()
when (status) {
ACTIVE -> {
setActiveClicked()
statusMap["status"] = ACTIVE
driverRef.child(PrefsHelper.getUserId().toString())
.updateChildren(statusMap)
}
INACTIVE -> {
setInactiveClicked()
statusMap["status"] = INACTIVE
driverRef.child(PrefsHelper.getUserId().toString())
.updateChildren(statusMap)
}
}
}
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.trip.collectLatest {
parent.hideLoading()
when (it) {
is Resource.Error ->{}
is Resource.Idle -> {
}
is Resource.Loading -> parent.showLoading()
is Resource.Success -> {
if (it.data != null && isTripExist && it.data.cancelled!=1 && it.data.finished!=1 ) {
trip = it.data
PrefsHelper.setCurrentTripId(trip.id)
Log.d(TAG, "observeData: $trip")
//
showTripInfo()
if (trip.srcLat != 0.0 && trip.srcLng != 0.0) {
calculateSourceDestinationDirections(
com.google.maps.model.LatLng(trip.srcLat, trip.srcLng),
com.google.maps.model.LatLng(trip.destLat, trip.destLng)
)
}
} else {
hideTripInfo()
viewModel.makeTripIdle()
googleMap.clear()
googleMap.addMarker(MarkerOptions().position(currentLatLng))
}
}
}
}
}
- mainActivity
Код: Выделить всё
MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "MainActivity"
}
private lateinit var binding: ActivityMainBinding
lateinit var navController: NavController
private lateinit var filter: IntentFilter
private lateinit var loadingUtil: LoadingUtil
private lateinit var header: View
private val viewModel: MainViewModel by viewModels()
private val database = Firebase.database
private val driverRef = database.getReference("Drivers")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
header = binding.navView.getHeaderView(0)
filter = IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION)
loadingUtil = LoadingUtil(this)
setupNavController()
if (intent.hasExtra("technical_support") && intent.getStringExtra("technical_support") == "1"){
navController.navigate(R.id.techSupportFragment)
}
else if
(intent.action == Constants.OPEN_NOTIFICATION)
{
//change=---------------------
navController.navigate(R.id.notificationsFragment)
}
if (isVpnActive(this)) {
// Show error and prevent further actions
showVpnError()
showVpnErrorDialog()
} else {
// Proceed with normal activity flow
}
val intent = Intent(applicationContext, AppService::class.java)
startService(intent)
askForNotificationsPermission()
onClick()
viewModel.updateFCMToken()
}
Код: Выделить всё
package com.tawajood.minutedriver.ui.main.fragments.notifications
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.tawajood.minutedriver.utils.Resource
import com.tawajood.minutedriver.R
import com.tawajood.minutedriver.adapters.NotificationsAdapter
import com.tawajood.minutedriver.databinding.FragmentNotificationsBinding
import com.tawajood.minutedriver.ui.main.MainActivity
import com.tawajood.minutedriver.utils.showAlertDialog
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import java.text.SimpleDateFormat
import java.util.Locale
@AndroidEntryPoint
class NotificationsFragment : Fragment(R.layout.fragment_notifications) {
private lateinit var binding: FragmentNotificationsBinding
private lateinit var parent: MainActivity
private lateinit var adapter: NotificationsAdapter
private val viewModel: NotificationsViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentNotificationsBinding.bind(requireView())
parent = requireActivity() as MainActivity
setupRecycler()
onClick()
observeData()
}
private fun setupRecycler(){
adapter = NotificationsAdapter()
binding.notificationsRv.adapter = adapter
}
private fun onClick(){
binding.backImg.setOnClickListener {
// parent.navController.navigate(R.id.homeFragment)
parent.onBackPressed()
}
}
private fun observeData() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.notifications.collectLatest {
binding.shimmer.stopShimmer()
binding.shimmer.isVisible = false
when (it) {
is Resource.Error -> showAlertDialog(
requireContext(),
getString(R.string.error),
it.message.toString()
)
is Resource.Idle -> {
}
is Resource.Loading -> {
binding.shimmer.isVisible = true
binding.shimmer.startShimmer()
}
is Resource.Success -> {
val sortedNotifications = it.data?.sortedByDescending { notification ->
//or format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.getDefault()).parse(notification.date)
} ?.toMutableList() ?: mutableListOf()
adapter.notifications = sortedNotifications
}
}
}
}
}
}
Код: Выделить всё
private inner class Receiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent != null) {
isTripExist = true
Log.e("messageTrip id", intent.getIntExtra(Constants.TRIP_ID, -1).toString())
viewModel.getTripById(intent.getIntExtra(Constants.TRIP_ID, -1))
PrefsHelper.setCurrentTrip(intent.getIntExtra(Constants.TRIP_ID, -1))
// viewModel.getTripById(intent.getIntExtra(PrefsHelper.getCurrentTripId().toString(), -1))
}
}
}
(https://i.sstatic.net/rUSw0lPk.png)
(https://i.sstatic.net/ YFF5VoNx.png)
но когда вернулся из NotificationFragment, он показал getTrip id -1 без информации о клиенте и не закрасил данные наблюдения
(https: //i.sstatic.net/YOUaeMx7.png)
(https://i.sstatic.net/it6F7GIj.png)
Мне нужно, чтобы информация о поездке отображалась, если он еще не принят или фрагмент изменился.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-reading