diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ee6cff67..e2a18cec 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -96,6 +96,7 @@ dependencies { implementation("androidx.compose.material3:material3") implementation("androidx.navigation:navigation-compose:2.7.6") implementation("androidx.hilt:hilt-navigation-compose:1.1.0") + implementation("com.google.firebase:firebase-firestore-ktx:24.10.1") // Test testImplementation("junit:junit:4.13.2") @@ -137,5 +138,8 @@ dependencies { implementation("com.google.maps.android:maps-compose:4.3.0") + // Paging + implementation("androidx.paging:paging-compose:3.2.1") + implementation(project(":data")) } diff --git a/app/src/main/java/com/canopas/catchme/ui/component/UserProfile.kt b/app/src/main/java/com/canopas/catchme/ui/component/UserProfile.kt index 93ec6320..9d8f4e75 100644 --- a/app/src/main/java/com/canopas/catchme/ui/component/UserProfile.kt +++ b/app/src/main/java/com/canopas/catchme/ui/component/UserProfile.kt @@ -3,7 +3,6 @@ package com.canopas.catchme.ui.component import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -61,4 +60,4 @@ fun UserProfile( ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt index 1f84aedc..3f04e26b 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapScreen.kt @@ -4,16 +4,11 @@ import androidx.annotation.DrawableRes import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -37,7 +32,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.canopas.catchme.R import com.canopas.catchme.ui.flow.home.map.component.MapMarker -import com.canopas.catchme.ui.flow.home.map.component.MapUserItem import com.canopas.catchme.ui.flow.home.map.member.MemberDetailBottomSheetContent import com.canopas.catchme.ui.theme.AppTheme import com.google.android.gms.maps.CameraUpdateFactory @@ -49,7 +43,6 @@ import com.google.maps.android.compose.MapProperties import com.google.maps.android.compose.MapUiSettings import com.google.maps.android.compose.rememberCameraPositionState import kotlinx.coroutines.launch -import timber.log.Timber private const val DEFAULT_CAMERA_ZOOM = 15f private const val DEFAULT_CAMERA_ZOOM_FOR_SELECTED_USER = 17f @@ -69,7 +62,7 @@ fun MapScreen() { val scaffoldState = rememberBottomSheetScaffoldState( bottomSheetState = bottomSheetState ) - + LaunchedEffect(bottomSheetState) { snapshotFlow { bottomSheetState.currentValue } .collect { @@ -82,7 +75,7 @@ fun MapScreen() { BottomSheetScaffold( scaffoldState = scaffoldState, sheetContainerColor = AppTheme.colorScheme.surface, - sheetPeekHeight = if(state.showUserDetails) (screenHeight / 3).dp else 0.dp, + sheetPeekHeight = if (state.showUserDetails) (screenHeight / 3).dp else 0.dp, sheetContent = { state.selectedUser?.let { MemberDetailBottomSheetContent(state.selectedUser!!) } } @@ -174,7 +167,7 @@ fun MapScreenContent(modifier: Modifier) { @Composable private fun MapView( - cameraPositionState: CameraPositionState, + cameraPositionState: CameraPositionState ) { val viewModel = hiltViewModel() val state by viewModel.state.collectAsState() diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt index dc0dbfc1..88efa3e6 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/MapViewModel.kt @@ -66,7 +66,7 @@ class MapViewModel @Inject constructor( } } - fun dismissMemberDetail() { + fun dismissMemberDetail() { _state.value = _state.value.copy(showUserDetails = false, selectedUser = null) } } diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapMarker.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapMarker.kt index 8df2dd50..498d064f 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapMarker.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapMarker.kt @@ -1,9 +1,5 @@ package com.canopas.catchme.ui.flow.home.map.component -import android.util.Log -import androidx.compose.animation.animateContentSize -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box @@ -11,23 +7,12 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.scale import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import coil.compose.rememberAsyncImagePainter -import coil.request.ImageRequest import com.canopas.catchme.data.models.location.ApiLocation import com.canopas.catchme.data.models.user.ApiUser import com.canopas.catchme.ui.component.UserProfile @@ -86,4 +71,4 @@ fun MarkerContent(user: ApiUser, isSelected: Boolean) { user = user ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapUserItem.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapUserItem.kt index e04c6952..68d6524e 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapUserItem.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/component/MapUserItem.kt @@ -1,14 +1,9 @@ package com.canopas.catchme.ui.flow.home.map.component import android.content.Context -import android.location.Geocoder -import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -26,32 +21,24 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import coil.compose.rememberAsyncImagePainter -import coil.request.ImageRequest import com.canopas.catchme.R -import com.canopas.catchme.data.models.user.ApiUser import com.canopas.catchme.data.models.user.UserInfo import com.canopas.catchme.ui.component.UserProfile import com.canopas.catchme.ui.theme.AppTheme import com.canopas.catchme.ui.theme.InterFontFamily import com.canopas.catchme.utils.getAddress import com.google.android.gms.maps.model.LatLng -import timber.log.Timber -import java.io.IOException import java.text.SimpleDateFormat import java.util.Date -import java.util.Locale import java.util.concurrent.TimeUnit import kotlin.math.abs @@ -155,7 +142,7 @@ fun MapUserItem( } } -private fun getTimeAgoString(context: Context, timestamp: Long): String { +private fun getTimeAgoString(context: Context, timestamp: Long): String { val now = System.currentTimeMillis() val duration = abs(timestamp - now) val days = TimeUnit.MILLISECONDS.toDays(duration) @@ -181,4 +168,3 @@ private fun getTimeAgoString(context: Context, timestamp: Long): String { } } } - diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/LocationHistoryPagingSource.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/LocationHistoryPagingSource.kt new file mode 100644 index 00000000..e8d8e6a0 --- /dev/null +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/LocationHistoryPagingSource.kt @@ -0,0 +1,36 @@ +package com.canopas.catchme.ui.flow.home.map.member + +import androidx.paging.PagingSource +import androidx.paging.PagingState +import com.canopas.catchme.data.models.location.ApiLocation +import com.google.firebase.firestore.Query +import com.google.firebase.firestore.QuerySnapshot +import kotlinx.coroutines.tasks.await + +class LocationHistoryPagingSource(private var query: Query) : + PagingSource() { + + override fun getRefreshKey(state: PagingState): QuerySnapshot? = + null + + override suspend fun load(params: LoadParams): LoadResult = + try { + val currentPage = params.key ?: query.get().await() + if (currentPage.isEmpty) { + val lists = currentPage.toObjects(ApiLocation::class.java) + LoadResult.Page(data = lists, prevKey = null, nextKey = null) + } else { + val lastVisibleProduct = currentPage.documents[currentPage.size() - 1] + val nextPage = query.startAfter(lastVisibleProduct).get().await() + val lists = currentPage.toObjects(ApiLocation::class.java) + + LoadResult.Page( + data = lists, + prevKey = null, + nextKey = nextPage + ) + } + } catch (e: Exception) { + LoadResult.Error(e) + } +} diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailBottomSheet.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailBottomSheet.kt index 8b880bc4..91d2b53d 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailBottomSheet.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailBottomSheet.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight @@ -17,10 +16,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.LocationOn +import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.Divider @@ -47,39 +46,41 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.paging.LoadState +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.collectAsLazyPagingItems import com.canopas.catchme.R import com.canopas.catchme.data.models.location.ApiLocation import com.canopas.catchme.data.models.user.UserInfo +import com.canopas.catchme.ui.component.AppProgressIndicator import com.canopas.catchme.ui.component.UserProfile import com.canopas.catchme.ui.theme.AppTheme import com.canopas.catchme.utils.getAddress import com.google.android.gms.maps.model.LatLng import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import timber.log.Timber import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date import java.util.Locale import java.util.concurrent.TimeUnit -import kotlin.math.abs @Composable fun MemberDetailBottomSheetContent( - userInfo: UserInfo, + userInfo: UserInfo ) { val viewModel = hiltViewModel() val state by viewModel.state.collectAsState() + val locations = viewModel.location.collectAsLazyPagingItems() LaunchedEffect(userInfo) { - Timber.d("XXX fetchUserLocationHistory") val calendar = Calendar.getInstance() calendar.add(Calendar.HOUR_OF_DAY, -24) val timestamp = calendar.timeInMillis viewModel.fetchUserLocationHistory( - userInfo, from = timestamp, - to = System.currentTimeMillis() + to = System.currentTimeMillis(), + userInfo ) } @@ -96,27 +97,49 @@ fun MemberDetailBottomSheetContent( val calendar = Calendar.getInstance() calendar.timeInMillis = it calendar.add(Calendar.DAY_OF_MONTH, 1) - viewModel.fetchLocationHistory(from = it, to = calendar.timeInMillis) + viewModel.fetchUserLocationHistory(from = it, to = calendar.timeInMillis) } - - LocationHistory(state.location, state.isLoading) - + LocationHistory(locations) } - } @Composable fun LocationHistory( - locations: List, - isLoading: Boolean + locations: LazyPagingItems ) { Box { - if (locations.isEmpty() && !isLoading) { - EmptyHistory() - } else { - LazyColumn(contentPadding = PaddingValues(bottom = 30.dp)) { - itemsIndexed(locations) { index, location -> - LocationHistoryItem(location, index, isLastItem = index == locations.lastIndex) + when { + locations.loadState.refresh == LoadState.Loading -> { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center + ) { AppProgressIndicator() } + } + + locations.itemCount == 0 -> { + EmptyHistory() + } + + else -> { + LazyColumn { + items(locations.itemCount) { index -> + val location = locations[index] + + LocationHistoryItem( + location!!, + index, + isLastItem = index == locations.itemCount - 1 + ) + } + + if (locations.loadState.append == LoadState.Loading) { + item { + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center + ) { AppProgressIndicator() } + } + } } } } @@ -135,7 +158,7 @@ private fun EmptyHistory() { contentDescription = "", modifier = Modifier .padding(bottom = 30.dp) - .alpha(0.8f), + .alpha(0.8f) ) Text( @@ -183,8 +206,9 @@ private fun LocationHistoryItem(location: ApiLocation, index: Int, isLastItem: B ), contentAlignment = Alignment.Center ) { + Icon( - Icons.Default.LocationOn, + if(address.isEmpty()) Icons.Outlined.Refresh else Icons.Default.LocationOn, contentDescription = "", tint = AppTheme.colorScheme.surface, modifier = Modifier @@ -193,7 +217,7 @@ private fun LocationHistoryItem(location: ApiLocation, index: Int, isLastItem: B ) } Spacer(modifier = Modifier.height(10.dp)) - if (!isLastItem) + if (!isLastItem) { Divider( thickness = 2.dp, modifier = Modifier @@ -201,6 +225,7 @@ private fun LocationHistoryItem(location: ApiLocation, index: Int, isLastItem: B .height(48.dp), color = AppTheme.colorScheme.containerHigh ) + } } Column( @@ -230,10 +255,8 @@ private fun LocationHistoryItem(location: ApiLocation, index: Int, isLastItem: B style = AppTheme.appTypography.label2.copy(color = AppTheme.colorScheme.textSecondary) ) } - } } - } @Composable @@ -252,7 +275,6 @@ fun FilterOption( .padding(bottom = 10.dp), verticalAlignment = Alignment.CenterVertically ) { - Text( text = stringResource(id = R.string.member_detail_location_history), style = AppTheme.appTypography.body2.copy(color = AppTheme.colorScheme.textSecondary) @@ -276,19 +298,20 @@ fun FilterOption( ) } } - } if (showDatePicker) { - ShowDatePicker(selectedFromTimestamp, + ShowDatePicker( + selectedFromTimestamp, confirmButtonClick = { timestamp -> showDatePicker = false onTimeSelected(timestamp) - - }, dismissButtonClick = { + }, + dismissButtonClick = { showDatePicker = false - }) + } + ) } } @@ -303,7 +326,8 @@ fun ShowDatePicker( val datePickerState = rememberDatePickerState( initialSelectedDateMillis = selectedTimestamp ?: calendar.timeInMillis ) - DatePickerDialog(onDismissRequest = {}, + DatePickerDialog( + onDismissRequest = {}, confirmButton = { TextButton(onClick = { confirmButtonClick( @@ -317,13 +341,13 @@ fun ShowDatePicker( TextButton(onClick = dismissButtonClick) { Text(text = "Cancel") } - }) { + } + ) { DatePicker( state = datePickerState, dateValidator = { date -> date <= System.currentTimeMillis() } ) } - } @Composable @@ -339,14 +363,15 @@ fun UserInfoContent(userInfo: UserInfo) { Column( modifier = Modifier .padding(start = 16.dp) - .weight(1f), verticalArrangement = Arrangement.Center + .weight(1f), + verticalArrangement = Arrangement.Center ) { Text( text = userInfo.user.fullName, style = AppTheme.appTypography.header3, - maxLines = 1, + maxLines = 1 ) - if (!userInfo.isLocationEnable) + if (!userInfo.isLocationEnable) { Text( text = stringResource(id = R.string.map_user_item_location_off), style = AppTheme.appTypography.label1.copy( @@ -354,10 +379,9 @@ fun UserInfoContent(userInfo: UserInfo) { fontWeight = FontWeight.Normal ) ) - + } } - Box( modifier = Modifier .size(38.dp) @@ -377,10 +401,8 @@ fun UserInfoContent(userInfo: UserInfo) { ) } } - } - private fun getFormattedTimeString(context: Context, timestamp: Long): String { val now = System.currentTimeMillis() val elapsedTime = now - timestamp @@ -409,4 +431,4 @@ fun getFormattedFilterLabel(startTimestamp: Long, endTimestamp: Long): String { val endDateFormatted = endDateFormat.format(endDate) return "$startDateFormatted • $endDateFormatted" -} \ No newline at end of file +} diff --git a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailViewModel.kt b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailViewModel.kt index 2c36a481..91662e50 100644 --- a/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailViewModel.kt +++ b/app/src/main/java/com/canopas/catchme/ui/flow/home/map/member/MemberDetailViewModel.kt @@ -2,14 +2,15 @@ package com.canopas.catchme.ui.flow.home.map.member import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.canopas.catchme.data.models.location.ApiLocation +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.cachedIn import com.canopas.catchme.data.models.user.UserInfo import com.canopas.catchme.data.service.location.ApiLocationService import com.canopas.catchme.data.utils.AppDispatcher import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -23,31 +24,41 @@ class MemberDetailViewModel @Inject constructor( private val _state = MutableStateFlow(MemberDetailState()) var state = _state.asStateFlow() - fun fetchUserLocationHistory(userInfo: UserInfo, from: Long, to: Long) { - _state.value = - _state.value.copy(selectedUser = userInfo, selectedTimeFrom = from, selectedTimeTo = to) - fetchLocationHistory(from, to) - } - - fun fetchLocationHistory(from: Long, to: Long) = viewModelScope.launch(appDispatcher.IO) { - _state.emit(_state.value.copy(selectedTimeFrom = from, selectedTimeTo = to)) + private var _dataPagingSource: LocationHistoryPagingSource? = null - try { - _state.emit(_state.value.copy(isLoading = true)) - locationService.getLocationHistory( + val location = Pager( + config = PagingConfig( + pageSize = 8 + ) + ) { + LocationHistoryPagingSource( + query = locationService.getLocationHistoryQuery( _state.value.selectedUser?.user?.id ?: "", - from, to - ).collectLatest { - val locations = it - .distinctBy { it.latitude } - .distinctBy { it.longitude }.sortedByDescending { it.created_at } + _state.value.selectedTimeFrom ?: 0, + _state.value.selectedTimeTo ?: 0 + ) + ).also { + _dataPagingSource = it + } + }.flow.cachedIn(viewModelScope) - _state.emit(_state.value.copy(isLoading = false, location = locations)) - } + fun fetchUserLocationHistory( + from: Long, + to: Long, + userInfo: UserInfo? = _state.value.selectedUser + ) = viewModelScope.launch(appDispatcher.IO) { + _state.emit( + _state.value.copy( + selectedUser = userInfo, + selectedTimeFrom = from, + selectedTimeTo = to + ) + ) + try { + _dataPagingSource?.invalidate() } catch (e: Exception) { Timber.e(e, "Failed to fetch location history") - _state.emit(_state.value.copy(isLoading = false, error = e.message)) - + _state.emit(_state.value.copy(error = e.message)) } } } @@ -56,7 +67,5 @@ data class MemberDetailState( val selectedUser: UserInfo? = null, val selectedTimeFrom: Long? = null, val selectedTimeTo: Long? = null, - val location: List = emptyList(), - val isLoading: Boolean = false, val error: String? = null -) \ No newline at end of file +) diff --git a/app/src/main/java/com/canopas/catchme/utils/LatLngExt.kt b/app/src/main/java/com/canopas/catchme/utils/LatLngExt.kt index b6c6020a..fab48cfb 100644 --- a/app/src/main/java/com/canopas/catchme/utils/LatLngExt.kt +++ b/app/src/main/java/com/canopas/catchme/utils/LatLngExt.kt @@ -19,4 +19,4 @@ fun LatLng.getAddress(context: Context): String? { Timber.e(e) } return null -} \ No newline at end of file +} diff --git a/data/src/main/java/com/canopas/catchme/data/receiver/location/LocationUpdateReceiver.kt b/data/src/main/java/com/canopas/catchme/data/receiver/location/LocationUpdateReceiver.kt index f7d3483b..01948587 100644 --- a/data/src/main/java/com/canopas/catchme/data/receiver/location/LocationUpdateReceiver.kt +++ b/data/src/main/java/com/canopas/catchme/data/receiver/location/LocationUpdateReceiver.kt @@ -11,7 +11,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -import timber.log.Timber import java.util.Date import javax.inject.Inject @@ -29,7 +28,6 @@ class LocationUpdateReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { LocationResult.extractResult(intent)?.let { locationResult -> - Timber.d("XXX onReceive ${locationResult.locations}") scope.launch { locationResult.locations.map { locationService.saveCurrentLocation( diff --git a/data/src/main/java/com/canopas/catchme/data/service/location/ApiLocationService.kt b/data/src/main/java/com/canopas/catchme/data/service/location/ApiLocationService.kt index 7857fd44..8400e955 100644 --- a/data/src/main/java/com/canopas/catchme/data/service/location/ApiLocationService.kt +++ b/data/src/main/java/com/canopas/catchme/data/service/location/ApiLocationService.kt @@ -5,11 +5,7 @@ import com.canopas.catchme.data.utils.FirestoreConst import com.canopas.catchme.data.utils.snapshotFlow import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.Query -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.tasks.await -import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -43,11 +39,9 @@ class ApiLocationService @Inject constructor( .orderBy("created_at", Query.Direction.DESCENDING).limit(1) .snapshotFlow(ApiLocation::class.java) - suspend fun getLocationHistory(userId: String, from: Long, to:Long) = + fun getLocationHistoryQuery(userId: String, from: Long, to: Long) = locationRef.whereEqualTo("user_id", userId) .whereGreaterThanOrEqualTo("created_at", from) .whereLessThan("created_at", to) - .orderBy("created_at", Query.Direction.DESCENDING) - .snapshotFlow(ApiLocation::class.java) - + .orderBy("created_at", Query.Direction.DESCENDING).limit(8) }