mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-31 14:53:59 +01:00 
			
		
		
		
	Replace temporary experimental fixes part 2
This commit is contained in:
		
							parent
							
								
									e3deffcde9
								
							
						
					
					
						commit
						fcc427e724
					
				
					 2 changed files with 64 additions and 25 deletions
				
			
		|  | @ -356,7 +356,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment | |||
| //        justExperimenting = new JustExperimenting(this); | ||||
| 
 | ||||
|         initNetworkBroadCastReceiver(); | ||||
|         presenter = new NearbyParentFragmentPresenter(bookmarkLocationDao); | ||||
|         presenter = new NearbyParentFragmentPresenter(bookmarkLocationDao, placesRepository); | ||||
|         progressDialog = new ProgressDialog(getActivity()); | ||||
|         progressDialog.setCancelable(false); | ||||
|         progressDialog.setMessage("Saving in progress..."); | ||||
|  |  | |||
|  | @ -15,12 +15,14 @@ import fr.free.nrw.commons.nearby.Label | |||
| import fr.free.nrw.commons.nearby.MarkerPlaceGroup | ||||
| import fr.free.nrw.commons.nearby.NearbyController | ||||
| import fr.free.nrw.commons.nearby.Place | ||||
| import fr.free.nrw.commons.nearby.PlacesRepository | ||||
| import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract | ||||
| import fr.free.nrw.commons.utils.LocationUtils | ||||
| import fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT | ||||
| import fr.free.nrw.commons.wikidata.WikidataEditListener.WikidataP18EditListener | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.Job | ||||
| import kotlinx.coroutines.channels.Channel | ||||
| import kotlinx.coroutines.delay | ||||
| import kotlinx.coroutines.launch | ||||
| import kotlinx.coroutines.withContext | ||||
|  | @ -30,8 +32,10 @@ import java.lang.reflect.Method | |||
| import java.lang.reflect.Proxy | ||||
| 
 | ||||
| class NearbyParentFragmentPresenter | ||||
|     (var bookmarkLocationDao: BookmarkLocationsDao) : NearbyParentFragmentContract.UserActions, | ||||
|     (val bookmarkLocationDao: BookmarkLocationsDao, val placesRepository: PlacesRepository) : | ||||
|     NearbyParentFragmentContract.UserActions, | ||||
|     WikidataP18EditListener, LocationUpdateListener { | ||||
| 
 | ||||
|     private var isNearbyLocked = false | ||||
|     private var currentLatLng: LatLng? = null | ||||
| 
 | ||||
|  | @ -42,23 +46,30 @@ class NearbyParentFragmentPresenter | |||
|     private var nearbyParentFragmentView: NearbyParentFragmentContract.View = DUMMY | ||||
| 
 | ||||
|     private var loadPlacesDataAyncJob: Job? = null | ||||
|     private object LoadPlacesAsyncOptions { | ||||
|         val batchSize = 3 | ||||
|         val connectionCount = 5 | ||||
|     } | ||||
| 
 | ||||
|     private var schedulePlacesUpdateJob: Job? = null | ||||
|     private object schedulePlacesUpdateOptions { | ||||
|     private object SchedulePlacesUpdateOptions { | ||||
|         var skippedCount = 0 | ||||
|         val skipLimit = 2 | ||||
|         val skipDelayMs = 1000L | ||||
|         val skipLimit = 3 | ||||
|         val skipDelayMs = 500L | ||||
|     } | ||||
|     suspend fun schedulePlacesUpdate(markerPlaceGroups: List<MarkerPlaceGroup>) = withContext(Dispatchers.Main) { | ||||
|         if (markerPlaceGroups.isEmpty()) return@withContext | ||||
|         schedulePlacesUpdateJob?.cancel() | ||||
|         schedulePlacesUpdateJob = launch { | ||||
|             if (schedulePlacesUpdateOptions.skippedCount++ < schedulePlacesUpdateOptions.skipLimit) { | ||||
|                 delay(schedulePlacesUpdateOptions.skipDelayMs) | ||||
| 
 | ||||
|     suspend fun schedulePlacesUpdate(markerPlaceGroups: List<MarkerPlaceGroup>) = | ||||
|         withContext(Dispatchers.Main) { | ||||
|             if (markerPlaceGroups.isEmpty()) return@withContext | ||||
|             schedulePlacesUpdateJob?.cancel() | ||||
|             schedulePlacesUpdateJob = launch { | ||||
|                 if (SchedulePlacesUpdateOptions.skippedCount++ < SchedulePlacesUpdateOptions.skipLimit) { | ||||
|                     delay(SchedulePlacesUpdateOptions.skipDelayMs) | ||||
|                 } | ||||
|                 SchedulePlacesUpdateOptions.skippedCount = 0 | ||||
|                 updatePlaceGroupsToControllerAndRender(markerPlaceGroups) | ||||
|             } | ||||
|             schedulePlacesUpdateOptions.skippedCount = 0 | ||||
|             updatePlaceGroupsToControllerAndRender(markerPlaceGroups) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     override fun attachView(view: NearbyParentFragmentContract.View) { | ||||
|         this.nearbyParentFragmentView = view | ||||
|  | @ -200,27 +211,55 @@ class NearbyParentFragmentPresenter | |||
|         nearbyPlaces: List<Place>?, currentLatLng: LatLng, | ||||
|         scope: LifecycleCoroutineScope? | ||||
|     ) { | ||||
|         val nearbyPlaces: MutableList<Place> = | ||||
|             nearbyPlaces?.sortedBy { it.getDistanceInDouble(currentLatLng) } | ||||
|         val nearbyPlaceGroups = nearbyPlaces?.sortedBy { it.getDistanceInDouble(currentLatLng) } | ||||
|                 ?.take(NearbyController.MAX_RESULTS) | ||||
|                 ?.toMutableList() | ||||
|                 ?.map { | ||||
|                     // currently only the place's location is known but bookmarks are stored by name | ||||
|                     MarkerPlaceGroup( | ||||
|                         false, | ||||
|                         it | ||||
|                     ) | ||||
|                 } | ||||
|                 ?: return | ||||
| 
 | ||||
|         loadPlacesDataAyncJob?.cancel() | ||||
|         lockUnlockNearby(false) // So that new location updates wont come | ||||
|         nearbyParentFragmentView.setProgressBarVisibility(false) | ||||
| 
 | ||||
|         updatePlaceGroupsToControllerAndRender(nearbyPlaces.map { | ||||
|             MarkerPlaceGroup( | ||||
|                 // currently only the place's location is known, but bookmarks are stored by name | ||||
|                 false, | ||||
|                 it | ||||
|             ) | ||||
|         }) | ||||
|         updatePlaceGroupsToControllerAndRender(nearbyPlaceGroups) | ||||
| 
 | ||||
|         loadPlacesDataAyncJob = scope?.launch(Dispatchers.IO) { | ||||
|             withContext(Dispatchers.Main) { | ||||
|             val updatedGroups = nearbyPlaceGroups.toMutableList() | ||||
|             // first load cached places: | ||||
|             val indicesToUpdate = mutableListOf<Int>() | ||||
|             for (i in 0..updatedGroups.lastIndex) { | ||||
|                 val repoPlace = placesRepository.fetchPlace(updatedGroups[i].place.entityID) | ||||
|                 if (repoPlace != null && repoPlace.name != ""){ | ||||
|                     updatedGroups[i] = MarkerPlaceGroup( | ||||
|                         bookmarkLocationDao.findBookmarkLocation(repoPlace), | ||||
|                         repoPlace | ||||
|                     ) | ||||
|                 } else { | ||||
|                     indicesToUpdate.add(i) | ||||
|                 } | ||||
|             } | ||||
|             if (indicesToUpdate.size < updatedGroups.size) { | ||||
|                 schedulePlacesUpdate(updatedGroups) | ||||
|             } | ||||
|             val fetchPlacesChannel = Channel<List<Int>>(Channel.UNLIMITED); | ||||
|             for (i in indicesToUpdate.indices step LoadPlacesAsyncOptions.batchSize) { | ||||
|                 fetchPlacesChannel.send( | ||||
|                     indicesToUpdate.slice( | ||||
|                         i until (i + LoadPlacesAsyncOptions.batchSize).coerceAtMost( | ||||
|                             indicesToUpdate.size | ||||
|                         ) | ||||
|                     ) | ||||
|                 ) | ||||
|             } | ||||
|             repeat(LoadPlacesAsyncOptions.connectionCount) { | ||||
|                 launch(Dispatchers.IO) { | ||||
| 
 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 savsch
						savsch