При нажатии на уведомление, а затем обратно на домашнюю страницу, данные наблюдения больше не читаются.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 При нажатии на уведомление, а затем обратно на домашнюю страницу, данные наблюдения больше не читаются.

Сообщение Anonymous »

Я работаю над новыми проектами и идеей, когда водитель получает запрос от клиента, который отображается на домашней странице с информацией о клиенте, и он решает принять поездку или отклонить ее. Проблема: у меня есть уведомление от FirebaseMessagingService при получении уведомления с новая поездка и коснитесь ее, чтобы перейти к уведомлениям. Фрагмент --> вернуться на домашнюю страницу. Информация о клиенте исчезнет, ​​пока клиент ждет принятого .
-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()

}
-notificationFragment

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»