diff --git a/app/src/main/java/it/reyboz/bustorino/backend/Palina.java b/app/src/main/java/it/reyboz/bustorino/backend/Palina.java --- a/app/src/main/java/it/reyboz/bustorino/backend/Palina.java +++ b/app/src/main/java/it/reyboz/bustorino/backend/Palina.java @@ -42,7 +42,7 @@ * Not in a way that makes sense and keeps the code readable, at least. */ public class Palina extends Stop implements Parcelable { - private ArrayList routes = new ArrayList<>(); + private ArrayList routes = new ArrayList<>(); // the routes with arrival times private boolean routesModified = false; private Passaggio.Source allSource = null; @@ -52,7 +52,7 @@ public Palina(Stop s){ super(s.ID,s.getStopDefaultName(),s.getStopUserName(),s.location,s.type, - s.getRoutesThatStopHere(),s.getLatitude(),s.getLongitude(), null); + s.getRoutesThatStopHere(),s.getLatitude(),s.getLongitude(), s.gtfsID); } public Palina(@NonNull String ID, @Nullable String name, @Nullable String userName, @@ -111,6 +111,21 @@ routes = new ArrayList<>(routeList); } + /** + * Remove all arrivals from this Palina + */ + public void clearRoutes(){ + routes.clear(); + } + + /** + * Check how many routes (from arrival times) we have + * @return the number of routes + */ + public int getNumRoutesWithArrivals(){ + return routes.size(); + } + @Nullable @Override protected String buildRoutesString() { diff --git a/app/src/main/java/it/reyboz/bustorino/backend/mato/MapiArrivalRequest.java b/app/src/main/java/it/reyboz/bustorino/backend/mato/MapiArrivalRequest.java --- a/app/src/main/java/it/reyboz/bustorino/backend/mato/MapiArrivalRequest.java +++ b/app/src/main/java/it/reyboz/bustorino/backend/mato/MapiArrivalRequest.java @@ -86,7 +86,7 @@ throw new AuthFailureError("Error with JSON enconding",e); } String requestBody = data.toString(); - Log.d(DEBUG_TAG, "Request variables: "+ variables); + Log.d(DEBUG_TAG, "MaTO arrivals request variables: "+ variables); return requestBody.getBytes(); } @@ -111,7 +111,7 @@ p = MatoAPIFetcher.Companion.parseStopJSON(currentObj); if (p.gtfsID != null) { - if(p.gtfsID.contains("gtt:")){ + if(p.gtfsID.contains("gtt:")){ // this is apparently sufficient //valid stop stopFound = true; break; @@ -139,15 +139,4 @@ */ return Response.success(p, HttpHeaderParser.parseCacheHeaders(response)); } - - public class StopNotFoundError extends VolleyError{ - - public StopNotFoundError(String message) { - super(message); - } - - public StopNotFoundError() { - super(); - } - } } diff --git a/app/src/main/java/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt b/app/src/main/java/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt --- a/app/src/main/java/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt +++ b/app/src/main/java/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt @@ -21,7 +21,6 @@ import android.util.Log import com.android.volley.DefaultRetryPolicy import com.android.volley.toolbox.RequestFuture -import it.reyboz.bustorino.BuildConfig import it.reyboz.bustorino.backend.* import it.reyboz.bustorino.data.gtfs.GtfsAgency import it.reyboz.bustorino.data.gtfs.GtfsFeed @@ -52,15 +51,16 @@ stopID!! val now = Calendar.getInstance().time - var numMinutes = 30 + var numMinutes = 60 var palina = Palina(stopID) - var numPassaggi = 0 var trials = 0 val numDepartures = 8 - while (numPassaggi < minNumPassaggi && trials < 2) { + var moreTime = false + var palinaOK = false + while (trials <20 && !palinaOK) { //numDepartures+=2 - numMinutes += 20 + if (moreTime) numMinutes *= 2 //duplicate time val future = RequestFuture.newFuture() val request = MapiArrivalRequest(stopID, now, numMinutes * 60, numDepartures, res, future, future) if (appContext == null || res == null) { @@ -71,15 +71,17 @@ request.setTag(getVolleyReqTag(MatoQueries.QueryType.ARRIVALS)) requestQueue.add(request) + moreTime = false try { - val palinaResult = future.get(5, TimeUnit.SECONDS) + val palinaResult = future.get(15, TimeUnit.SECONDS) if (palinaResult!=null) { - /*if (BuildConfig.DEBUG) - for (r in palinaResult.queryAllRoutes()){ - Log.d(DEBUG_TAG, "route " + r.gtfsId + " has " + r.passaggi.size + " passaggi: "+ r.passaggiToString) - }*/ + palina = palinaResult - numPassaggi = palina.minNumberOfPassages + if(palina.totalNumberOfPassages < minNumPassaggi && numMinutes < MAX_MINUTES_SEARCH) { + moreTime = true + } else{ + palinaOK = true + } } else{ Log.d(DEBUG_TAG, "Result palina is null") } @@ -109,8 +111,8 @@ const val VOLLEY_TAG = "MatoAPIFetcher" const val DEBUG_TAG = "BusTO:MatoAPIFetcher" - const val DEF_MIN_NUMPASSAGGI=2 - + const val DEF_MIN_NUMPASSAGGI = 5 + const val MAX_MINUTES_SEARCH = 24*60 // a day in minutes val REQ_PARAMETERS = mapOf( "Content-Type" to "application/json; charset=utf-8", "DNT" to "1", diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/ArrivalsFragment.kt @@ -66,7 +66,7 @@ //Views protected lateinit var addToFavorites: ImageButton protected lateinit var openInMapButton: ImageButton - protected lateinit var timesSourceTextView: TextView + protected lateinit var arrivalsSourceTextView: TextView private lateinit var messageTextView: TextView private lateinit var preMessageTextView: TextView // this hold the "Arrivals at: " text protected lateinit var arrivalsRecyclerView: RecyclerView @@ -187,21 +187,20 @@ manager.orientation ) arrivalsRecyclerView.addItemDecoration(mDividerItemDecoration) - timesSourceTextView = root.findViewById(R.id.timesSourceTextView) - timesSourceTextView.setOnLongClickListener { view: View? -> + arrivalsSourceTextView = root.findViewById(R.id.timesSourceTextView) + arrivalsSourceTextView.setOnLongClickListener { view: View? -> if (!fetchersChangeRequestPending) { rotateFetchers() //Show we are changing provider - timesSourceTextView.setText(R.string.arrival_source_changing) + arrivalsSourceTextView.setText(R.string.arrival_source_changing) - //mListener.requestArrivalsForStopID(stopID) requestArrivalsForTheFragment() fetchersChangeRequestPending = true return@setOnLongClickListener true } false } - timesSourceTextView.setOnClickListener(View.OnClickListener { view: View? -> + arrivalsSourceTextView.setOnClickListener(View.OnClickListener { view: View? -> Toast.makeText( context, R.string.change_arrivals_source_message, Toast.LENGTH_SHORT ) @@ -246,35 +245,52 @@ timesSourceTextView.setText(sourcesTextViewData); }*/ //need to do this when we recreate the fragment but we haven't updated the arrival times - lastUpdatedPalina?.let { showArrivalsSources(it) } - /*if (lastUpdatedPalina?.queryAllRoutes() != null && lastUpdatedPalina!!.queryAllRoutes()!!.size >0){ - showArrivalsSources(lastUpdatedPalina!!) - } else{ - Log.d(DEBUG_TAG, "No routes names") + if(lastUpdatedPalina == null && arrivalsViewModel.palinaLiveData.value != null) { + //this updates lastUpdatedPalina and also shows the arrival source + updateFragmentData(arrivalsViewModel.palinaLiveData.value!!) + } + //lastUpdatedPalina?.let { showArrivalsSources(it) } - */ + arrivalsViewModel.arrivalsRequestRunningLiveData.observe(viewLifecycleOwner, { running -> + //UI CHANGES TO APPLY WHEN THE REQUEST IS RUNNING + mListener.toggleSpinner(running) + if(running){ + //different way of setting this flag + if(lastUpdatedPalina == null || lastUpdatedPalina?.totalNumberOfPassages==0) { + showLoadingMessageForFirstTime() + } + } else{ + //stopped running, we can show the palina + //val uname = lastUpdatedPalina?.stopDisplayName + if (lastUpdatedPalina == null || lastUpdatedPalina?.numRoutesWithArrivals == 0) { + //no passages and result is not valid + setUIForNoStopFound() + } + } + }) arrivalsViewModel.palinaLiveData.observe(viewLifecycleOwner){ - mListener.toggleSpinner(false) - Log.d(DEBUG_TAG, "New result palina observed, has coords: ${it.hasCoords()}") - if(arrivalsViewModel.resultLiveData.value==Fetcher.Result.OK){ - //the result is true - changeUIFirstSearchActive(false) + Log.d(DEBUG_TAG, "New result palina observed, has coords: ${it.hasCoords()}, title ${it?.stopDisplayName}, number of passages: ${it.totalNumberOfPassages}") + + val palinaIsValid = it!=null && (it.totalNumberOfPassages>0 || it.stopDisplayName!=null) + if (palinaIsValid){ updateFragmentData(it) - } else{ - progressBar.visibility=View.INVISIBLE - // Avoid showing this ugly message if we have found the stop, clearly it exists but GTT doesn't provide arrival times - if (stopName==null) - loadingMessageTextView.text = getString(R.string.no_bus_stop_have_this_name) - else - loadingMessageTextView.text = getString(R.string.no_arrivals_stop) + } + if(arrivalsViewModel.arrivalsRequestRunningLiveData.value ==false) { + //finished loading + if (palinaIsValid) { + //the result is true + hideLoadingMessageAndShowResults() + } else { + setUIForNoStopFound() + } } } - + // this is only for the progress arrivalsViewModel.sourcesLiveData.observe(viewLifecycleOwner){ Log.d(DEBUG_TAG, "Using arrivals source: $it") val srcString = getDisplayArrivalsSource(it,requireContext()) @@ -282,24 +298,25 @@ } arrivalsViewModel.resultLiveData.observe(viewLifecycleOwner){res -> + val src = arrivalsViewModel.sourcesLiveData.value when (res) { Fetcher.Result.OK -> {} - Fetcher.Result.CLIENT_OFFLINE -> showToastMessage(R.string.network_error, true) + Fetcher.Result.CLIENT_OFFLINE -> showFetcherMessage(R.string.network_error, src) Fetcher.Result.SERVER_ERROR -> { if (utils.isConnected(context)) { - showToastMessage(R.string.parsing_error, true) + showFetcherMessage(R.string.parsing_error, src) } else { - showToastMessage(R.string.network_error, true) + showFetcherMessage(R.string.network_error, src) } - showToastMessage(R.string.internal_error,true) + showFetcherMessage(R.string.internal_error,src) } - Fetcher.Result.PARSER_ERROR -> showShortToast(R.string.internal_error) - Fetcher.Result.QUERY_TOO_SHORT -> showShortToast(R.string.query_too_short) - Fetcher.Result.EMPTY_RESULT_SET -> showShortToast(R.string.no_arrivals_stop) + Fetcher.Result.PARSER_ERROR -> showFetcherMessage(R.string.internal_error, src) + Fetcher.Result.QUERY_TOO_SHORT -> showFetcherMessage(R.string.query_too_short, src) + Fetcher.Result.EMPTY_RESULT_SET -> showFetcherMessage(R.string.no_arrivals_stop, src) - Fetcher.Result.NOT_FOUND -> showShortToast(R.string.no_bus_stop_have_this_name) - else -> showShortToast(R.string.internal_error) + Fetcher.Result.NOT_FOUND -> showFetcherMessage(R.string.no_bus_stop_have_this_name, src) + else -> showFetcherMessage(R.string.internal_error, src) } } return root @@ -308,8 +325,18 @@ private fun showShortToast(id: Int) = showToastMessage(id,true) + private fun showFetcherMessage(id: Int, source: Source?){ + val srcString = source?.let{ getDisplayArrivalsSource(it,requireContext())} + if (srcString!=null){ + Toast.makeText(requireContext(), id, Toast.LENGTH_SHORT).show() + } else{ + val message = getString(id) - private fun changeUIFirstSearchActive(yes: Boolean){ + Toast.makeText(requireContext(), "$srcString : $message", Toast.LENGTH_SHORT).show() + } + } + + /*private fun changeUIFirstSearchActive(yes: Boolean){ if(yes){ resultsLayout.visibility = View.GONE progressBar.visibility = View.VISIBLE @@ -321,18 +348,32 @@ } } + */ + private fun showLoadingMessageForFirstTime(){ + resultsLayout.visibility = View.GONE + progressBar.visibility = View.VISIBLE + loadingMessageTextView.visibility = View.VISIBLE + } + private fun hideLoadingMessageAndShowResults(){ + resultsLayout.visibility = View.VISIBLE + progressBar.visibility = View.GONE + loadingMessageTextView.visibility = View.GONE + } + + private fun setUIForNoStopFound(){ + progressBar.visibility=View.INVISIBLE + // Avoid showing this ugly message if we have found the stop, clearly it exists but GTT doesn't provide arrival times + if (stopName==null) + loadingMessageTextView.text = getString(R.string.no_bus_stop_have_this_name) + else + loadingMessageTextView.text = getString(R.string.no_arrivals_stop) + } + override fun onResume() { super.onResume() val loaderManager = loaderManager Log.d(DEBUG_TAG, "OnResume, justCreated $justCreated, lastUpdatedPalina is: $lastUpdatedPalina") - /*if(needUpdateOnAttach){ - updateFragmentData(null); - needUpdateOnAttach=false; - }*/ - /*if(lastUpdatedPalina!=null){ - updateFragmentData(null); - showArrivalsSources(lastUpdatedPalina); - }*/ + mListener.readyGUIfor(FragmentKind.ARRIVALS) //fix bug when the list adapter is null @@ -350,7 +391,7 @@ } else { //start first search requestArrivalsForTheFragment() - changeUIFirstSearchActive(true) + showLoadingMessageForFirstTime() justCreated = false } //start the loader @@ -421,15 +462,6 @@ setOption(requireContext(), OPTION_SHOW_LEGEND, false) } - /*val currentFetchersAsArray: Array - get() { - val arr = arrayOfNulls(fetchers!!.size) - fetchers!!.toArray(arr) - return arr - } - - */ - fun getCurrentFetchersAsArray(): Array { val r= fetchers.toTypedArray() //?: emptyArray() @@ -462,7 +494,11 @@ } val adapter = PalinaAdapter(context, lastUpdatedPalina, palinaClickListener, true) - showArrivalsSources(lastUpdatedPalina!!) + p?.let { + //only update the sources if we have actual passaggi + if (arrivalsViewModel.arrivalsRequestRunningLiveData.value == false) + showArrivalsSources(lastUpdatedPalina!!) + } resetListAdapter(adapter) lastUpdatedPalina?.let{ pal -> openInMapButton.setOnClickListener { @@ -508,13 +544,13 @@ val updatedFetchers = adjustFetchersToSource(source) if (!updatedFetchers) Log.w(DEBUG_TAG, "Tried to update the source fetcher but it didn't work") val base_message = getString(R.string.times_source_fmt, source_txt) - timesSourceTextView.text = base_message - timesSourceTextView.visibility = View.VISIBLE + arrivalsSourceTextView.text = base_message + arrivalsSourceTextView.visibility = View.VISIBLE if (p.totalNumberOfPassages > 0) { - timesSourceTextView.visibility = View.VISIBLE + arrivalsSourceTextView.visibility = View.VISIBLE } else { - timesSourceTextView.visibility = View.INVISIBLE + arrivalsSourceTextView.visibility = View.INVISIBLE } fetchersChangeRequestPending = false } @@ -716,7 +752,7 @@ override fun onDestroyView() { //arrivalsRecyclerView = null if (arguments != null) { - requireArguments().putString(SOURCES_TEXT, timesSourceTextView.text.toString()) + requireArguments().putString(SOURCES_TEXT, arrivalsSourceTextView.text.toString()) requireArguments().putString(MESSAGE_TEXT_VIEW, messageTextView.text.toString()) } super.onDestroyView() @@ -738,8 +774,7 @@ fun requestArrivalsForTheFragment(){ // Run with previous fetchers - //fragment.getCurrentFetchers().toArray() - //AsyncArrivalsSearcher(, getCurrentFetchersAsArray(), context).execute(stopID) + context?.let { mListener.toggleSpinner(true) val fetcherSources = fetchers.map { f-> f?.sourceForFetcher?.name ?: "" } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/MainScreenFragment.java @@ -101,9 +101,6 @@ private final Runnable refreshStop = new Runnable() { public void run() { if(getContext() == null) return; - List fetcherList = utils.getDefaultArrivalsFetchers(getContext()); - ArrivalsFetcher[] arrivalsFetchers = new ArrivalsFetcher[fetcherList.size()]; - arrivalsFetchers = fetcherList.toArray(arrivalsFetchers); if (childFragMan.findFragmentById(R.id.resultFrame) instanceof ArrivalsFragment) { ArrivalsFragment fragment = (ArrivalsFragment) childFragMan.findFragmentById(R.id.resultFrame); @@ -117,8 +114,12 @@ //new AsyncArrivalsSearcher(fragmentHelper, fragment.getCurrentFetchersAsArray(), getContext()).execute(stopName); fragment.requestArrivalsForTheFragment(); } - } else //we create a new fragment, which is WRONG + } else { //we create a new fragment, which is WRONG + List fetcherList = utils.getDefaultArrivalsFetchers(getContext()); + ArrivalsFetcher[] arrivalsFetchers = new ArrivalsFetcher[fetcherList.size()]; + arrivalsFetchers = fetcherList.toArray(arrivalsFetchers); new AsyncArrivalsSearcher(fragmentHelper, arrivalsFetchers, getContext()).execute(); + } } }; // diff --git a/app/src/main/java/it/reyboz/bustorino/viewmodels/ArrivalsViewModel.kt b/app/src/main/java/it/reyboz/bustorino/viewmodels/ArrivalsViewModel.kt --- a/app/src/main/java/it/reyboz/bustorino/viewmodels/ArrivalsViewModel.kt +++ b/app/src/main/java/it/reyboz/bustorino/viewmodels/ArrivalsViewModel.kt @@ -25,7 +25,7 @@ val palinaLiveData = MediatorLiveData() val sourcesLiveData = MediatorLiveData() - val resultLiveData = MediatorLiveData() + val resultLiveData = MutableLiveData() val currentFetchers = MediatorLiveData>() @@ -35,6 +35,9 @@ private var stopIdRequested = "" private val stopFromDB = MutableLiveData() + + val arrivalsRequestRunningLiveData = MutableLiveData(false) + private val oldRepoStopCallback = OldDataRepository.Callback>{ stopListRes -> if(stopIdRequested.isEmpty()) return@Callback @@ -53,23 +56,36 @@ init { appContext = application.applicationContext + palinaLiveData.addSource(stopFromDB){ s -> val hasSource = palinaLiveData.value?.passaggiSourceIfAny Log.d(DEBUG_TAG, "Have current palina ${palinaLiveData.value!=null}, source passaggi $hasSource, new incoming stop $s from database") - val newp = Palina.mergePaline(palinaLiveData.value, Palina(s)) - newp?.let { palinaLiveData.value = it } + val newp = if(palinaLiveData.value == null) Palina(s) else Palina.mergePaline(palinaLiveData.value, Palina(s)) + Log.d(DEBUG_TAG, "Merged palina: $newp, num passages: ${newp?.totalNumberOfPassages}, has coords: ${newp?.hasCoords()}") + newp?.let { pal -> palinaLiveData.postValue(pal) } } + } + fun clearPalinaArrivals(palina: Palina) : Palina{ + palina.clearRoutes() + return palina + } fun requestArrivalsForStop(stopId: String, fetchers: List){ val context = appContext //application.applicationContext currentFetchers.value = fetchers + //THIS IS TOTALLY WRONG!!! + /*palinaLiveData.value?.let{ + palinaLiveData.value = clearPalinaArrivals(it) + } + + */ //request stop from the DB stopIdRequested = stopId oldRepo.requestStopsWithGtfsIDs(listOf("gtt:$stopId"), oldRepoStopCallback) - + arrivalsRequestRunningLiveData.value = true viewModelScope.launch(Dispatchers.IO){ runArrivalsFetching(stopId, fetchers, context) } @@ -84,6 +100,7 @@ if (fetchers.isEmpty()) { //do nothing + arrivalsRequestRunningLiveData.postValue(false) return } @@ -166,7 +183,7 @@ // Se abbiamo un risultato OK, restituiamo la palina if (resultRef.get() == Fetcher.Result.OK) { setResultAndPalinaFromFetchers(palina, Fetcher.Result.OK) - //TODO: Rotate the fetchers appropriately + return } //end Fetchers loop @@ -179,10 +196,13 @@ resultPalina?.let { setResultAndPalinaFromFetchers(it, resultRef.get()) } - + //in ogni caso, settiamo la richiesta come conclusa + arrivalsRequestRunningLiveData.postValue(false) + Log.d(DEBUG_TAG, "Finished fetchers available to search arrivals for palina stop $stopId") } private fun setResultAndPalinaFromFetchers(palina: Palina, fetcherResult: Fetcher.Result) { + arrivalsRequestRunningLiveData.postValue(false) resultLiveData.postValue(fetcherResult) Log.d(DEBUG_TAG, "Have new result palina for stop ${palina.ID}, source ${palina.passaggiSourceIfAny} has coords: ${palina.hasCoords()}") Log.d(DEBUG_TAG, "Old palina liveData is: ${palinaLiveData.value?.stopDisplayName}, has Coords ${palinaLiveData.value?.hasCoords()}") diff --git a/app/src/main/res/layout/fragment_arrivals.xml b/app/src/main/res/layout/fragment_arrivals.xml --- a/app/src/main/res/layout/fragment_arrivals.xml +++ b/app/src/main/res/layout/fragment_arrivals.xml @@ -13,11 +13,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="5dp" - app:cardElevation="5dp" + app:cardElevation="4dp" android:layout_alignParentTop="true" - android:layout_marginStart="8sp" - android:layout_marginEnd="8sp" + android:layout_marginStart="10sp" + android:layout_marginEnd="10sp" android:layout_marginTop="5sp" + android:layout_marginBottom="2sp" android:padding="8sp" > @@ -231,7 +232,6 @@ android:id="@+id/timesSourceTextView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="10dp" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="20sp" diff --git a/app/src/main/res/layout/fragment_lines_detail.xml b/app/src/main/res/layout/fragment_lines_detail.xml --- a/app/src/main/res/layout/fragment_lines_detail.xml +++ b/app/src/main/res/layout/fragment_lines_detail.xml @@ -9,40 +9,49 @@ - + app:layout_constraintTop_toTopOf="parent" + android:layout_marginTop="8dp" android:gravity="center_horizontal|center_vertical" + app:layout_constraintEnd_toStartOf="@id/switchImageButton" + app:layout_constraintStart_toEndOf="@id/starCardView" + android:layout_marginStart="8dp" android:layout_marginEnd="8dp" + app:layout_constraintBottom_toBottomOf="@+id/switchImageButton"/> + android:layout_marginTop="12dp" + /> + android:layout_marginTop="6dp" app:layout_constraintTop_toBottomOf="@+id/lineDescripTextView" + android:layout_marginStart="5dp"/> + android:layout_marginStart="10sp" + android:layout_marginEnd="10sp" + android:layout_marginTop="10sp"> > - Forcer la mise à jour de la base de données à l\'arrêt Afficher les arrivées - Appli Muoversi a Torino + Muoversi a Torino Le service de localisation en temps réel MaTO live bus est en cours d\'exécution stockage Rechercher par arrêt diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -166,7 +166,7 @@ App GTT Sito GTT Sito 5T Torino - App Muoversi a Torino + Muoversi a Torino Sconosciuta Fonti orari di arrivo Scegli le fonti di orari da usare diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -104,7 +104,7 @@ GTT Applicatie GTT Website 5T Torino website - Muoversi a Torino app + Muoversi a Torino Onbepaald Ingedrukt houden om aankomsten bron te veranderen Bronnen van aankomsttijden diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -24,7 +24,6 @@ matofetcher gttjsonfetcher - fivetscraper pref_positions_source diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,7 +207,7 @@ GTT App GTT Website 5T Torino website - Muoversi a Torino app + Muoversi a Torino Undetermined Changing arrival times source… Long press to change the source of arrivals