Page MenuHomeGitPull.it

D243.1783796537.diff
No OneTemporary

Authored By
Unknown
Size
57 KB
Referenced Files
None
Subscribers
None

D243.1783796537.diff

diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityExperiments.java b/app/src/main/java/it/reyboz/bustorino/ActivityExperiments.java
--- a/app/src/main/java/it/reyboz/bustorino/ActivityExperiments.java
+++ b/app/src/main/java/it/reyboz/bustorino/ActivityExperiments.java
@@ -76,9 +76,20 @@
}
@Override
- public void showMapCenteredOnStop(Stop stop) {
+ public void showMapCenteredOnStop(@Nullable Stop stop) {
}
+
+ @Override
+ public void openLinesFragment() {
+ Log.d(DEBUG_TAG, "Asked to open lines grid fragment");
+ }
+
+ @Override
+ public void openFavoritesFragment() {
+
+ }
+
@Override
public void openLineFromStop(String routeGtfsId, @Nullable String stopIDFrom){
@@ -101,4 +112,9 @@
tr.commit();
}
+ @Override
+ public void openNearbyStopsFragment() {
+ Log.d(DEBUG_TAG, "Requested to open nearby stops fragment");
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
--- a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
+++ b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java
@@ -552,9 +552,10 @@
* @param fraMan the fragmentManager
* @param arguments args for the fragment
*/
- private static void createShowMainFragment(FragmentManager fraMan,@Nullable Bundle arguments, boolean addToBackStack){
+ private static MainScreenFragment createShowMainFragment(FragmentManager fraMan,@Nullable Bundle arguments, boolean addToBackStack){
+ var frag = MainScreenFragment.newInstance(null);
FragmentTransaction ft = fraMan.beginTransaction()
- .replace(R.id.mainActContentFrame, MainScreenFragment.class, arguments, MainScreenFragment.FRAGMENT_TAG)
+ .replace(R.id.mainActContentFrame, frag, MainScreenFragment.FRAGMENT_TAG)
.setReorderingAllowed(false)
/*.setCustomAnimations(
R.anim.slide_in, // enter
@@ -565,6 +566,7 @@
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (addToBackStack) ft.addToBackStack(null);
ft.commit();
+ return frag;
}
private void requestMapFragment(final boolean allowReturn){
@@ -630,12 +632,12 @@
.commit();
}
- private void showMainFragment(boolean addToBackStack){
+ private MainScreenFragment showMainFragment(boolean addToBackStack){
FragmentManager fraMan = getSupportFragmentManager();
Fragment fragment = fraMan.findFragmentByTag(MainScreenFragment.FRAGMENT_TAG);
final MainScreenFragment mainScreenFragment;
if (fragment==null | !(fragment instanceof MainScreenFragment)){
- createShowMainFragment(fraMan, null, addToBackStack);
+ mainScreenFragment = createShowMainFragment(fraMan, null, addToBackStack);
}
else if(!fragment.isVisible()){
@@ -646,7 +648,7 @@
} else{
mainScreenFragment = (MainScreenFragment) fragment;
}
- //return mainScreenFragment;
+ return mainScreenFragment;
}
@Nullable
private MainScreenFragment getMainFragmentIfVisible(){
@@ -661,6 +663,7 @@
public void showFloatingActionButton(boolean yes) {
//TODO
}
+
/*
public void setDrawerSelectedItem(String fragmentTag){
switch (fragmentTag){
@@ -773,6 +776,27 @@
tr.commit();
}
+ @Override
+ public void openNearbyStopsFragment() {
+ var fr = getMainFragmentIfVisible();
+ if (fr == null){
+ // it is not visible,
+ fr = showMainFragment(false);
+
+ }
+ fr.openNearbyStopsFragment();
+ }
+
+ @Override
+ public void openLinesFragment() {
+ showLinesFragment(getSupportFragmentManager(), true, null);
+ }
+
+ @Override
+ public void openFavoritesFragment() {
+ checkAndShowFavoritesFragment(getSupportFragmentManager(), true);
+ }
+
@Override
public void toggleSpinner(boolean state) {
MainScreenFragment probableFragment = getMainFragmentIfVisible();
@@ -791,10 +815,12 @@
@Override
- public void showMapCenteredOnStop(Stop stop) {
+ public void showMapCenteredOnStop(@Nullable Stop stop) {
createAndShowMapFragment(stop, true);
}
+
+
//Map Fragment stuff
void createAndShowMapFragment(@Nullable Stop stop, boolean addToBackStack){
final FragmentManager fm = getSupportFragmentManager();
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
@@ -758,11 +758,15 @@
return null
}
- fun isFragmentForTheSameStop(p: Palina): Boolean {
- return if (tag != null) tag == getFragmentTag(p)
+ fun isFragmentForTheSameStop(stopID: String) : Boolean{
+ return if (tag != null) tag == getFragmentTag(stopID)
else false
}
+ fun isFragmentForTheSameStop(p: Palina): Boolean {
+ return isFragmentForTheSameStop(p.ID)
+ }
+
/**
* Request arrivals in the fragment
@@ -812,10 +816,13 @@
return fragment
}
+
+ //return "palina_" + p.ID
+
@JvmStatic
- fun getFragmentTag(p: Palina): String {
- return "palina_" + p.ID
- }
+ fun getFragmentTag(stopID: String) = "palina_$stopID"
+ @JvmStatic
+ fun getFragmentTag(p: Palina) = getFragmentTag(p.ID)
@JvmStatic
fun getArrivalsWorkID(stopID: String) = "arrivals_search_$stopID"
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/ButtonsFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/ButtonsFragment.kt
new file mode 100644
--- /dev/null
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/ButtonsFragment.kt
@@ -0,0 +1,145 @@
+package it.reyboz.bustorino.fragments
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.GridLayout
+import android.widget.ImageView
+import android.widget.TextView
+import it.reyboz.bustorino.ActivitySettings
+import it.reyboz.bustorino.R
+
+
+/**
+ * A simple [Fragment] subclass.
+ * Use the [ButtonsFragment.newInstance] factory method to
+ * create an instance of this fragment.
+ */
+class ButtonsFragment : ScreenBaseFragment() {
+
+ private lateinit var gridLayout: GridLayout
+
+ private var listener: CommonFragmentListener? = null
+ private lateinit var items: List<CardMenuItem>
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ arguments?.let {
+
+ }
+ if(listener is FragmentListenerMain){
+ val ll = listener as FragmentListenerMain
+ ll.enableRefreshLayout(false)
+ }
+ }
+ private val marginHoriz = 30
+ private val marginVer = 25
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ val root = inflater.inflate(R.layout.fragment_buttons, container, false)
+ items = listOf(
+ CardMenuItem(CardAction.NEARBY, getString(R.string.nearby_me), R.drawable.compass_3_fill),
+ CardMenuItem(CardAction.MAP, getString(R.string.map), R.drawable.map),
+ CardMenuItem(CardAction.FAVORITES_STOPS, getString(R.string.action_favorites), R.drawable.ic_star_filled_white),
+ CardMenuItem(CardAction.LINES, getString(R.string.lines), R.drawable.ic_moving_emph),
+ CardMenuItem(CardAction.SETTINGS, getString(R.string.action_settings), R.drawable.ic_baseline_settings_24),
+ )
+ gridLayout = root.findViewById(R.id.homeGridLayout)
+
+ items.forEach { item ->
+ // Inflate base layout
+ val cardView = LayoutInflater.from(requireContext())
+ .inflate(R.layout.item_card_button, gridLayout, false)
+
+ // Popola icona e testo
+ cardView.findViewById<ImageView>(R.id.cardIcon).setImageResource(item.iconRes)
+ cardView.findViewById<TextView>(R.id.cardLabel).text = item.label
+ // Parametri griglia: colonna flessibile + margini
+ cardView.layoutParams = GridLayout.LayoutParams().apply {
+ width = 0
+ height = GridLayout.LayoutParams.WRAP_CONTENT
+ columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f)
+ setMargins(marginHoriz, marginVer, marginHoriz, marginVer) // margini tra le card
+ }
+
+ // Click
+ cardView.setOnClickListener { onCardClicked(item) }
+
+ gridLayout.addView(cardView)
+ }
+ return root
+ }
+
+
+ private fun onCardClicked(item: CardMenuItem) {
+ Log.d(DEBUG_TAG, "onCardClicked - item: ${item}, listener: ${listener}")
+ // reagisci al tap
+ val list = listener
+ if(list == null){
+ Log.w(DEBUG_TAG, "onCardClicked - listener is null")
+ } else
+ when(item.action) {
+ CardAction.NEARBY -> {
+ list.openNearbyStopsFragment()
+ }
+ CardAction.MAP -> { list.showMapCenteredOnStop(null)}
+ CardAction.LINES -> { list.openLinesFragment();}
+ CardAction.SETTINGS -> { startActivity(Intent(requireContext(), ActivitySettings::class.java)) }
+ CardAction.FAVORITES_STOPS -> { list.openFavoritesFragment();}
+ }
+ }
+
+ override fun getBaseViewForSnackBar(): View? {
+ return null
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ if (context is CommonFragmentListener) {
+ listener = context
+ Log.d(DEBUG_TAG, "onAttach")
+ } else{
+ throw RuntimeException("$context must implement CommonFragmentListener")
+ }
+ }
+
+ override fun onDetach() {
+ listener = null
+ Log.d(DEBUG_TAG, "onDetach")
+ super.onDetach()
+ }
+
+ companion object {
+ /**
+ * @return A new instance of fragment ButtonsFragment.
+ */
+ @JvmStatic
+ fun newInstance() =
+ ButtonsFragment().apply {
+ arguments = Bundle().apply {
+ }
+ }
+ const val DEBUG_TAG = "BusTO-ButtonsFragment"
+
+ enum class CardAction {
+ NEARBY, MAP, FAVORITES_STOPS, LINES, SETTINGS
+ }
+
+ data class CardMenuItem(
+ val action: CardAction,
+ val label: String,
+ val iconRes: Int
+ )
+
+ const val FRAGMENT_TAG = "HomeButtonsFragment"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/CommonFragmentListener.java b/app/src/main/java/it/reyboz/bustorino/fragments/CommonFragmentListener.java
--- a/app/src/main/java/it/reyboz/bustorino/fragments/CommonFragmentListener.java
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/CommonFragmentListener.java
@@ -35,7 +35,7 @@
* We want to open the map on the specified stop
* @param stop needs to have location data (latitude, longitude)
*/
- void showMapCenteredOnStop(Stop stop);
+ void showMapCenteredOnStop(@Nullable Stop stop);
/**
* We want to show the line in detail for route coming from a stop
@@ -50,4 +50,16 @@
* @param args extra arguments given as Bundle
*/
void openLineFromVehicle(String routeGtfsId, @Nullable String optionalPatternId, @Nullable Bundle args);
+
+ /**
+ * Show the nearby stops fragment
+ */
+ void openNearbyStopsFragment();
+
+ /**
+ * Show the lines
+ */
+ void openLinesFragment();
+
+ void openFavoritesFragment();
}
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/FragmentHelper.java b/app/src/main/java/it/reyboz/bustorino/fragments/FragmentHelper.java
--- a/app/src/main/java/it/reyboz/bustorino/fragments/FragmentHelper.java
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/FragmentHelper.java
@@ -20,11 +20,12 @@
import android.content.Context;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
-import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
@@ -84,48 +85,43 @@
* Called when you need to create a fragment for a specified Palina
* @param p the Stop that needs to be displayed
*/
- public void createOrUpdateStopFragment(Palina p, boolean addToBackStack){
- boolean sameFragment;
+ public void showArrivalsFragmentForStop(@NonNull Palina p, boolean addToBackStack){
+ boolean sameFragment = false;
ArrivalsFragment arrivalsFragment = null;
+ final FragmentManager fm = managerWeakRef.get();
+ if(fm == null) return;
- if(managerWeakRef.get()==null || shouldHaltAllActivities) {
- //SOMETHING WENT VERY WRONG
- Log.e(DEBUG_TAG, "We are asked for a new stop but we can't show anything");
- return;
- }
+ if(fm.findFragmentById(primaryFrameLayout) instanceof ArrivalsFragment frag) {
+ sameFragment = frag.isFragmentForTheSameStop(p);
+ if(sameFragment) {
+ arrivalsFragment = frag;
+ Log.d("BusTO", "Same bus stop, accessing existing fragment");
- FragmentManager fm = managerWeakRef.get();
-
- if(fm.findFragmentById(primaryFrameLayout) instanceof ArrivalsFragment) {
- arrivalsFragment = (ArrivalsFragment) fm.findFragmentById(primaryFrameLayout);
- //Log.d(DEBUG_TAG, "Arrivals are for fragment with same stop?");
- if (arrivalsFragment == null) sameFragment = false;
- else sameFragment = arrivalsFragment.isFragmentForTheSameStop(p);
- } else {
- sameFragment = false;
- Log.d(DEBUG_TAG, "We aren't showing an ArrivalsFragment");
-
- }
- setLastSuccessfullySearchedBusStop(p);
- if (sameFragment){
- Log.d("BusTO", "Same bus stop, accessing existing fragment");
- arrivalsFragment = (ArrivalsFragment) fm.findFragmentById(primaryFrameLayout);
- if (arrivalsFragment == null) sameFragment = false;
+ }
}
- if(!sameFragment) {
- //set the String to be displayed on the fragment
- String displayName = p.getStopDisplayName();
- if (displayName != null && displayName.length() > 0) {
- arrivalsFragment = ArrivalsFragment.newInstance(p.ID,displayName);
- } else {
- arrivalsFragment = ArrivalsFragment.newInstance(p.ID);
+ if(!sameFragment) {
+ // get old fragment
+ var frag = fm.findFragmentByTag(ArrivalsFragment.getFragmentTag(p));
+ if(frag instanceof ArrivalsFragment) {
+ attachFragmentToContainer(fm, frag, null, true, addToBackStack);
+ arrivalsFragment = (ArrivalsFragment) frag;
+ } else { // create new fragment
+ //set the String to be displayed on the fragment
+ String displayName = p.getStopDisplayName();
+ if (displayName != null && !displayName.isEmpty()) {
+ arrivalsFragment = ArrivalsFragment.newInstance(p.ID, displayName);
+ } else {
+ arrivalsFragment = ArrivalsFragment.newInstance(p.ID);
+ }
+ String probableTag = ArrivalsFragment.getFragmentTag(p);
+ attachFragmentToContainer(fm, arrivalsFragment, probableTag, true, addToBackStack);
}
- String probableTag = ArrivalsFragment.getFragmentTag(p);
- attachFragmentToContainer(fm,arrivalsFragment,new AttachParameters(probableTag, true, addToBackStack));
}
- // DO NOT CALL `setListAdapter` ever on arrivals fragment
- arrivalsFragment.updateFragmentData(p);
+ setLastSuccessfullySearchedBusStop(p);
+ // update the data only if I have information about the passaggi
+ if(p.getTotalNumberOfPassages() > 0)
+ arrivalsFragment.updateFragmentData(p);
// enable fragment auto refresh
arrivalsFragment.setReloadOnResume(true);
@@ -146,8 +142,8 @@
Log.e(DEBUG_TAG, "We are asked for a new stop but we can't show anything");
return;
}
- attachFragmentToContainer(managerWeakRef.get(),listfragment,
- new AttachParameters("search_"+query, false,addToBackStack));
+ attachFragmentToContainer(managerWeakRef.get(),
+ listfragment, "search_"+query, false, addToBackStack);
listfragment.setStopList(resultList);
//listenerMain.readyGUIfor(FragmentKind.STOPS);
toggleSpinner(false);
@@ -163,30 +159,34 @@
}
/**
- * Attach a new fragment to a cointainer
+ * Attach a new fragment to the appropriate container
* @param fm the FragmentManager
* @param fragment the Fragment
- * @param parameters attach parameters
+ * @param tagAttach attach tag (can be null, the fragment's own tag has preference)
+ * @param addToBackStack if the transaction is to be added to the stack
+ * @param toSecondaryFrame if the fragment goes to the secondary frame
*/
- protected void attachFragmentToContainer(FragmentManager fm,Fragment fragment, AttachParameters parameters){
+ protected void attachFragmentToContainer(FragmentManager fm, Fragment fragment, @Nullable String tagAttach, boolean toSecondaryFrame, boolean addToBackStack){
if(shouldHaltAllActivities) //nothing to do
return;
FragmentTransaction ft = fm.beginTransaction();
int frameID;
- if(parameters.attachToSecondaryFrame && secondaryFrameLayout!=NO_FRAME)
- // ft.replace(secondaryFrameLayout,fragment,tag);
+ if(toSecondaryFrame && secondaryFrameLayout!=NO_FRAME)
frameID = secondaryFrameLayout;
- else frameID = primaryFrameLayout;
- switch (parameters.transaction){
- case REPLACE:
- ft.replace(frameID,fragment,parameters.tag);
-
- }
- if (parameters.addToBackStack)
- ft.addToBackStack("state_"+parameters.tag);
+ else
+ frameID = primaryFrameLayout;
+ var tag = fragment.getTag();
+ if(tag == null) tag = tagAttach;
+ // there is only one case
+ //switch (pars.transaction){
+ // case REPLACE:
+ ft.replace(frameID,fragment,tag);
+ //}
+ if (addToBackStack)
+ ft.addToBackStack("state_"+tag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
- if(!fm.isDestroyed() && !shouldHaltAllActivities)
- ft.commit();
+ //if(!fm.isDestroyed() && !shouldHaltAllActivities)
+ ft.commit();
//fm.executePendingTransactions();
}
@@ -260,11 +260,12 @@
private void showShortToast(int messageID){
showToastMessage(messageID, true);
}
-
+ /*
+ // 18/05/2026: Commenting, do not remove, might be useful later
enum Transaction{
REPLACE,
}
- static final class AttachParameters {
+ private static final class AttachParameters {
String tag;
boolean attachToSecondaryFrame;
Transaction transaction;
@@ -284,4 +285,6 @@
this.transaction = Transaction.REPLACE;
}
}
+
+ */
}
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
@@ -36,9 +36,9 @@
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
+import androidx.lifecycle.ViewModelProvider;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -53,16 +53,15 @@
import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import java.util.List;
import java.util.Map;
import it.reyboz.bustorino.R;
import it.reyboz.bustorino.backend.*;
-import it.reyboz.bustorino.data.PreferencesHolder;
import it.reyboz.bustorino.middleware.BarcodeScanContract;
import it.reyboz.bustorino.middleware.BarcodeScanOptions;
import it.reyboz.bustorino.middleware.BarcodeScanUtils;
import it.reyboz.bustorino.util.Permissions;
+import it.reyboz.bustorino.viewmodels.IntroViewModel;
import static it.reyboz.bustorino.backend.utils.getBusStopIDFromUri;
import static it.reyboz.bustorino.util.Permissions.LOCATION_PERMISSIONS;
@@ -107,7 +106,7 @@
//private ImageButton addToFavorites;
//// HIDDEN BUT IMPORTANT ELEMENTS ////
private FragmentManager childFragMan;
-
+ private IntroViewModel introViewModel;
private void refreshStop() {
if(getContext() == null){
Log.w(DEBUG_TAG,"Asked to refresh stop but context is null");
@@ -158,6 +157,7 @@
/// LOCATION STUFF ///
boolean pendingIntroRun = false;
boolean pendingNearbyStopsFragmentRequest = false;
+ boolean pendingNearbyAddToBackStack = false;
boolean locationPermissionGranted, locationPermissionAsked = false;
//AppLocationManager locationManager;
private final ActivityResultLauncher<String[]> requestPermissionLauncher =
@@ -186,7 +186,7 @@
//showNearbyStopsFragment();
Log.d(DEBUG_TAG, "We have location permission");
if (pendingNearbyStopsFragmentRequest) {
- showNearbyFragmentIfPossible();
+ showNearbyFragmentIfPossible(pendingNearbyAddToBackStack);
pendingNearbyStopsFragmentRequest = false;
}
}
@@ -206,8 +206,12 @@
}
- public static MainScreenFragment newInstance() {
- return new MainScreenFragment();
+ public static MainScreenFragment newInstance(@Nullable String pendingStopID) {
+ var frag = new MainScreenFragment();
+ var bundle = new Bundle();
+ bundle.putString(PENDING_STOP_SEARCH, pendingStopID);
+ frag.setArguments(bundle);
+ return frag;
}
@Override
@@ -216,9 +220,11 @@
if (getArguments() != null) {
//do nothing
Log.d(DEBUG_TAG, "ARGS ARE NOT NULL: "+getArguments());
- if (getArguments().getString(PENDING_STOP_SEARCH)!=null)
- pendingStopID = getArguments().getString(PENDING_STOP_SEARCH);
+ var eventualStopSearch = getArguments().getString(PENDING_STOP_SEARCH);
+ if (eventualStopSearch!=null)
+ pendingStopID = eventualStopSearch;
}
+
}
@Override
@@ -283,6 +289,13 @@
cr.setPowerRequirement(Criteria.NO_REQUIREMENT);
*/
//locationManager = AppLocationManager.getInstance(requireContext());
+ introViewModel = new ViewModelProvider(requireActivity()).get(IntroViewModel.class);
+ introViewModel.getIntroIsRunning().observe(getViewLifecycleOwner(), isRunning -> {
+ pendingIntroRun = isRunning;
+ });
+
+ if(pendingStopID == null)
+ showButtonsFragment(true);
Log.d(DEBUG_TAG, "OnCreateView, savedInstanceState null: "+(savedInstanceState==null));
@@ -361,7 +374,6 @@
throw new RuntimeException(context
+ " must implement CommonFragmentListener");
}
-
}
@Override
public void onDetach() {
@@ -377,18 +389,9 @@
if (setupOnStart) {
if (pendingStopID==null){
- if(PreferencesHolder.hasIntroFinishedOneShot(requireContext())){
- Log.d(DEBUG_TAG, "Showing nearby stops");
- if(!checkLocationPermission()){
- requestLocationPermission();
- pendingNearbyStopsFragmentRequest = true;
- }
- else {
- showNearbyFragmentIfPossible();
- }
- } else {
- //The Introductory Activity is about to be started, hence pause the request and show later
- pendingIntroRun = true;
+ if(!pendingIntroRun){
+ //show the fragment
+ //showButtonsFragment();
}
}
@@ -400,6 +403,33 @@
}
}
+ private void showButtonsFragment(boolean addInsteadOfReplace){
+
+ swipeRefreshLayout.setVisibility(View.VISIBLE);
+ var ft = childFragMan.beginTransaction();
+ var frag = ButtonsFragment.newInstance();
+ if(addInsteadOfReplace)
+ ft.add(R.id.resultFrame,frag, ButtonsFragment.FRAGMENT_TAG);
+ else{
+ ft.replace(R.id.resultFrame, frag, ButtonsFragment.FRAGMENT_TAG);
+ ft.addToBackStack(null);
+ }
+ ft.commit();
+ }
+
+ private void showNearbyStopsFragmentChecking(boolean addToBackStack){
+ if(!checkLocationPermission()){
+ requestLocationPermission();
+ pendingNearbyStopsFragmentRequest = true;
+ pendingNearbyAddToBackStack = addToBackStack;
+ Log.d(DEBUG_TAG, "requesting location permission for nearby fragment");
+ }
+ else {
+ Log.d(DEBUG_TAG, "Showing nearby stops fragment");
+ showNearbyFragmentIfPossible(addToBackStack);
+ }
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -409,18 +439,6 @@
//if (locationManager == null)
// locationManager = AppLocationManager.getInstance(con);
//recheck the introduction activity has been run
- if(pendingIntroRun && PreferencesHolder.hasIntroFinishedOneShot(con)){
- //request position permission if needed
- if(!checkLocationPermission()){
- requestLocationPermission();
- pendingNearbyStopsFragmentRequest = true;
- }
- else {
- showNearbyFragmentIfPossible();
- }
- //deactivate flag
- pendingIntroRun = false;
- }
if(Permissions.bothLocationPermissionsGranted(con)){
Log.d(DEBUG_TAG, "Location permission OK");
//if(!locationManager.isRequesterRegistered(requester))
@@ -430,18 +448,22 @@
Log.d(DEBUG_TAG, "Pending stop ID for arrivals: "+pendingStopID);
//this is the second time we are attaching this fragment ->
Log.d(DEBUG_TAG, "Waiting for new stop request: "+ suppressArrivalsReload);
- //TODO: if we come back to this from another fragment, and the user has given again the permission
- // for the Location, we should show the Nearby Stops
+
if(!suppressArrivalsReload && pendingStopID==null){
//none of the following cases are true
// check if we are showing any fragment
+ /*
+ //TODO: check if this is needed
final Fragment fragment = getChildFragmentManager().findFragmentById(R.id.resultFrame);
+
if(fragment==null || swipeRefreshLayout.getVisibility() != View.VISIBLE){
//we are not showing anything
if(Permissions.anyLocationPermissionsGranted(getContext())){
showNearbyFragmentIfPossible();
}
}
+
+ */
}
if (suppressArrivalsReload){
// we have to suppress the reloading of the (possible) ArrivalsFragment
@@ -476,8 +498,6 @@
}
-
-
/*
GUI METHODS
*/
@@ -613,25 +633,6 @@
//actionHelpMenuItem.setVisible(false);
}
- private void actuallyShowNearbyStopsFragment(){
- swipeRefreshLayout.setVisibility(View.VISIBLE);
- final Fragment existingFrag = childFragMan.findFragmentById(R.id.resultFrame);
- // fragment;
- if (!(existingFrag instanceof NearbyStopsFragment)){
- Log.d(DEBUG_TAG, "actually showing Nearby Stops Fragment");
- //there is no fragment showing
- final NearbyStopsFragment fragment = NearbyStopsFragment.newInstance(NearbyStopsFragment.FragType.STOPS);
-
- FragmentTransaction ft = childFragMan.beginTransaction();
-
- ft.replace(R.id.resultFrame, fragment, NearbyStopsFragment.FRAGMENT_TAG);
- if (getActivity()!=null && !getActivity().isFinishing())
- ft.commit();
- else Log.e(DEBUG_TAG, "Not showing nearby fragment because activity null or is finishing");
- }
- }
-
-
@Override
public void showFloatingActionButton(boolean yes) {
mListener.showFloatingActionButton(yes);
@@ -678,12 +679,27 @@
@Override
public void openLineFromStop(String routeGtfsId, @Nullable String stopIDFrom) {
//pass to activity
- mListener.openLineFromStop(routeGtfsId, stopIDFrom);
+ if(mListener!=null) mListener.openLineFromStop(routeGtfsId, stopIDFrom);
}
@Override
public void openLineFromVehicle(String routeGtfsId, @Nullable String optionalPatternId, @Nullable Bundle args) {
- mListener.openLineFromVehicle(routeGtfsId, optionalPatternId, args);
+ if(mListener!=null) mListener.openLineFromVehicle(routeGtfsId, optionalPatternId, args);
+ }
+
+ @Override
+ public void openNearbyStopsFragment() {
+ showNearbyStopsFragmentChecking(true);
+ }
+
+ @Override
+ public void openLinesFragment() {
+ if(mListener!=null) mListener.openLinesFragment();
+ }
+
+ @Override
+ public void openFavoritesFragment() {
+ if(mListener!=null) mListener.openFavoritesFragment();
}
@Override
@@ -709,29 +725,28 @@
Log.e(DEBUG_TAG, "Asked for arrivals with null context");
return;
}
- ArrivalsFetcher[] fetchers = utils.getDefaultArrivalsFetchers(getContext()).toArray(new ArrivalsFetcher[0]);
- if (ID == null || ID.length() <= 0) {
+ if (ID == null || ID.isEmpty()) {
// we're still in UI thread, no need to mess with Progress
showToastMessage(R.string.insert_bus_stop_number_error, true);
toggleSpinner(false);
- } else if (framan.findFragmentById(R.id.resultFrame) instanceof ArrivalsFragment) {
- ArrivalsFragment fragment = (ArrivalsFragment) framan.findFragmentById(R.id.resultFrame);
- if (fragment != null && fragment.getStopID() != null && fragment.getStopID().equals(ID)){
- // Run with previous fetchers
- //fragment.getCurrentFetchers().toArray()
- fragment.requestArrivalsForTheFragment();
- } else{
- //SHOW NEW ARRIVALS FRAGMENT
- //new AsyncArrivalsSearcher(fragmentHelper, fetchers, getContext()).execute(ID);
- fragmentHelper.createOrUpdateStopFragment(new Palina(ID), true);
+ } else{
+ var palinaTrial = new Palina(ID);
+ if (framan.findFragmentById(R.id.resultFrame) instanceof ArrivalsFragment fragment) {
+ if (fragment.isFragmentForTheSameStop(palinaTrial)){
+ // Run with previous fetchers
+ //fragment.getCurrentFetchers().toArray()
+ fragment.requestArrivalsForTheFragment();
+ } else{
+ // The rest of the case is handled by the fragment Helper
+ fragmentHelper.showArrivalsFragmentForStop(palinaTrial, true);
+ }
}
- }
- else {
- Log.d(DEBUG_TAG, "This is probably the first arrivals search, preparing GUI");
- //prepareGUIForArrivals();
- //new AsyncArrivalsSearcher(fragmentHelper,fetchers, getContext()).execute(ID);
- fragmentHelper.createOrUpdateStopFragment(new Palina(ID), true);
+ else {
+ // this is not needed any more
+ //prepareGUIForArrivals();
+ fragmentHelper.showArrivalsFragmentForStop(palinaTrial, true);
+ }
}
}
@@ -747,13 +762,16 @@
}
private void requestLocationPermission(){
+ if(shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)){
+ makeToast(R.string.enable_position_message_nearby);
+ }
requestPermissionLauncher.launch(LOCATION_PERMISSIONS);
}
- private void showNearbyFragmentIfPossible() {
+ private void showNearbyFragmentIfPossible(boolean addToBackStack) {
if (isNearbyFragmentShown()) {
//nothing to do
- Log.w(DEBUG_TAG, "Asked to show nearby fragment but we already are showing it");
+ Log.d(DEBUG_TAG, "Asked to show nearby fragment but we already are showing it");
return;
}
if (getContext() == null) {
@@ -764,10 +782,24 @@
if (fragmentHelper.getLastSuccessfullySearchedBusStop() == null
&& !childFragMan.isDestroyed()) {
//Go ahead with the request
-
- actuallyShowNearbyStopsFragment();
+ swipeRefreshLayout.setVisibility(View.VISIBLE);
+ final Fragment existingFrag = childFragMan.findFragmentById(R.id.resultFrame);
+ // fragment;
+ if (!(existingFrag instanceof NearbyStopsFragment)){
+ Log.d(DEBUG_TAG, "actually showing Nearby Stops Fragment");
+ //there is no fragment showing
+ final NearbyStopsFragment fragment = NearbyStopsFragment.newInstance(NearbyStopsFragment.FragType.STOPS);
+
+ FragmentTransaction ft = childFragMan.beginTransaction();
+
+ ft.replace(R.id.resultFrame, fragment, NearbyStopsFragment.FRAGMENT_TAG);
+ if(addToBackStack) ft.addToBackStack(null);
+ if (getActivity()!=null && !getActivity().isFinishing())
+ ft.commit();
+ else Log.e(DEBUG_TAG, "Not showing nearby fragment because activity null or is finishing");
+ }
pendingNearbyStopsFragmentRequest = false;
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
--- a/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
@@ -2,11 +2,7 @@
import android.Manifest;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
import android.content.SharedPreferences;
-import android.net.Uri;
-import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
@@ -15,7 +11,6 @@
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
-import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
@@ -44,12 +39,18 @@
return getOption(mContext, optionName, optDefault);
}
- protected void showToastMessage(int messageID, boolean short_lenght) {
- final int length = short_lenght ? Toast.LENGTH_SHORT : Toast.LENGTH_LONG;
+ protected void showToastMessage(int messageID, boolean shortT) {
+ final int length = shortT ? Toast.LENGTH_SHORT : Toast.LENGTH_LONG;
final Context context = getContext();
if(context!=null)
Toast.makeText(context, messageID, length).show();
}
+ protected void makeToast(String message){
+ Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
+ }
+ protected void makeToast(int messageID){
+ Toast.makeText(getContext(), messageID, Toast.LENGTH_SHORT).show();
+ }
public void hideKeyboard() {
if (getActivity()==null) return;
diff --git a/app/src/main/java/it/reyboz/bustorino/middleware/StopSearcher.kt b/app/src/main/java/it/reyboz/bustorino/middleware/StopSearcher.kt
--- a/app/src/main/java/it/reyboz/bustorino/middleware/StopSearcher.kt
+++ b/app/src/main/java/it/reyboz/bustorino/middleware/StopSearcher.kt
@@ -1,6 +1,5 @@
package it.reyboz.bustorino.middleware
-import android.content.Context
import android.util.Log
import it.reyboz.bustorino.backend.Fetcher
import it.reyboz.bustorino.backend.FiveTStopsFetcher
@@ -11,8 +10,6 @@
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.lang.ref.WeakReference
diff --git a/app/src/main/java/it/reyboz/bustorino/viewmodels/FavoritesViewModel.kt b/app/src/main/java/it/reyboz/bustorino/viewmodels/FavoritesViewModel.kt
--- a/app/src/main/java/it/reyboz/bustorino/viewmodels/FavoritesViewModel.kt
+++ b/app/src/main/java/it/reyboz/bustorino/viewmodels/FavoritesViewModel.kt
@@ -1,21 +1,15 @@
package it.reyboz.bustorino.viewmodels
import android.app.Application
-import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MediatorLiveData
-import androidx.lifecycle.application
import androidx.lifecycle.map
import androidx.lifecycle.switchMap
-import androidx.lifecycle.viewModelScope
import androidx.work.WorkInfo
import it.reyboz.bustorino.backend.Stop
import it.reyboz.bustorino.backend.StopFavoritesData
import it.reyboz.bustorino.data.DBUpdateWorker.Companion.getWorkInfoLiveData
-import it.reyboz.bustorino.data.FavoritesLiveData
import it.reyboz.bustorino.data.OldDataRepository
-import it.reyboz.bustorino.data.QueryLiveData
-import kotlinx.coroutines.launch
import java.util.concurrent.Executors
class FavoritesViewModel(application: Application) : AndroidViewModel(application) {
diff --git a/app/src/main/java/it/reyboz/bustorino/viewmodels/IntroViewModel.kt b/app/src/main/java/it/reyboz/bustorino/viewmodels/IntroViewModel.kt
new file mode 100644
--- /dev/null
+++ b/app/src/main/java/it/reyboz/bustorino/viewmodels/IntroViewModel.kt
@@ -0,0 +1,11 @@
+package it.reyboz.bustorino.viewmodels
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class IntroViewModel: ViewModel() {
+
+
+ var introIsRunning = MutableLiveData(false)
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/reyboz/bustorino/viewmodels/LinesViewModel.kt b/app/src/main/java/it/reyboz/bustorino/viewmodels/LinesViewModel.kt
--- a/app/src/main/java/it/reyboz/bustorino/viewmodels/LinesViewModel.kt
+++ b/app/src/main/java/it/reyboz/bustorino/viewmodels/LinesViewModel.kt
@@ -3,12 +3,9 @@
import android.app.Application
import android.util.Log
import androidx.lifecycle.*
-import it.reyboz.bustorino.backend.Result
import it.reyboz.bustorino.backend.Stop
import it.reyboz.bustorino.data.GtfsRepository
-import it.reyboz.bustorino.data.NextGenDB
import it.reyboz.bustorino.data.OldDataRepository
-import it.reyboz.bustorino.data.gtfs.GtfsDatabase
import it.reyboz.bustorino.data.gtfs.GtfsRoute
import it.reyboz.bustorino.data.gtfs.MatoPatternWithStops
import it.reyboz.bustorino.data.gtfs.PatternStop
diff --git a/app/src/main/res/drawable-hdpi/ic_star.png b/app/src/main/res/drawable-hdpi/ic_star.png
deleted file mode 100644
index 7337fed6ef223388e380ab5eb665da0d3f3abd02..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 761
zc$@+G0tWqwP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00006VoOIv03HB{
z0Oc9g&QkyY010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U|;4Ffcxu9|iyb0)|OM
zK~!ko?U=o56hRoqpSeUZ<Ot?W;`u?020LwR%n=lY5VSKAkh4mezaoD`T1B)BS|tG+
zG1qBj3b9EMga`p8T7*F0JbpHBbXo6X?`~&r7w>^#mtppu=b3qT=9!WD=p(%VazM^!
zA30CNPhKBe3D#w51}Z=$tLZZZ99WskObP{3r7WpnrJR{G0t6I*UH)R%>N1l)v;2$M
zOpLxg*XsyaPjwmv$S=?s4^#gy02@sNY@|Jfiokvo0sBBP&C6(6QZs_ZlO;8cqdx(B
zr8V||i9}~0;!k%~(!~hvE=jr)Q=f8ej`CSa4<wZ&osx9gcG_`C=OkT@80w3pZ<4-C
z`XT99QdQD>NpGBU2T?h>5WxXS_axnvG%9IE(%l|sXGPKnNk1ihl(glXtF<y=+oTWM
zkxd~m46LMx{0cDKt|1!)o&vQV60aGD!H#!tV7Z3^mgDgC0!lzNLE=@Q)b5hn%B0<~
zO~^O)fZMT}zJQ1ez@|s?o4|Q5jx``+2w3w#ehnB(%x(j(V<i77F*h0*otH6=$BRx!
zz8gEe5Tk%ciOqm>f9%us7zNx2#r8V`K;9f^To|{QiKWn}q<oA5@{-OZDd35uu^0u6
zS<FOMp#eL6MZsGuQ7~<>6S+3rX|b;V0v3V1l|`#-hMh#NAML<%*nq?_umw!l`R*F<
z&f3(&q0d|FAd#5{1U><C4cu(-ea_m}!>uF)EY<0_42(3hzabGL_DvW|NeFmuogG<9
zOtxzS0>*ICVjNk_XFiELdjfn0=DRs?gl1&kViN4jhm~Hn&I)mymO>&5z<prV*LlEo
ra&y+n&7Zd!@Ik)YtHnP0_}}pxDUm#v1xOpi00000NkvXXu0mjfqBukf
diff --git a/app/src/main/res/drawable-mdpi/ic_star.png b/app/src/main/res/drawable-mdpi/ic_star.png
deleted file mode 100644
index 0f91201f5dc0aa926540bdf929ef2dd31a0979ca..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 484
zc$@*`0UQ2_P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv03HB{
z0Oc9g&QkyY010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U|;4Fc1azKh6LE0dYx0
zK~z}7?UuhzLNOG^f4x_ti#iyM%HnKD*d@Bljt>AXxbX%Ky6OwybMOGh!GVPbAZ{wb
zU8m2b#s)4>djGKSB~6pI=X|H9=TBjc6p&PsR7#^GN@+vOj+J?!FR8x@VkA}ckBX$?
zp1>Fb&~%oXcCE16?`j%5Azp|AZ{JSXx+&5NqXZ9(iXy+(Y%HCU8y<w`z#*^&906Bz
zj<+T40q?*!@L`O3p8KQ@(I)T&oB*|)9QXpf0WD+9Pf~OrOByOa3@yjp6x)_G$bo!d
zbuZ3yJNGgq@433YijAG`Ga$cPiaf!XdJ6K(ta85=Kz^1<DYmZL53u{d$L*14?XLzH
zQ1$5zzRl<~zyL29;~4`%A#6Nc5P9_eiy7Nvpl-)_Rv!sYKSxO?A;NDZMb4Snu1%to
zMGAHug|CvzlZC}8TxEOa58bRjA77Fhiz=F9NW;o}X7TfVkQ4{V$C4h?{FtY1mbc6r
aE5R>G5FzYk27y)p0000<MNUMnLSTX-`N`7&
diff --git a/app/src/main/res/drawable-xhdpi/ic_star.png b/app/src/main/res/drawable-xhdpi/ic_star.png
deleted file mode 100644
index 6994f1591af42c5f0057eeac154512c6754922da..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 1091
zc$@)41ibr+P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv03HB{
z0Oc9g&QkyY010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U|;4FD;P8eL(;K1JFrC
zK~#9!?V3?*6jv0-e`gb7)vRd~78I*!SDQ42B3RpKu@7Qx#Z<&seUN+r^`+2)U&1dS
zl=_rlUwrmODMg8oBBE*YV1qA0)wmc<`}gHUhq&v`&fcAw?9LyCnO*M8Ip=@RJ?Gpr
z0|g2cD3Adp)xGXD5~`A_z3c_klBToNp+7_S9|FGe-$TF?GwZ3@Kcu%f)N{d4((MQV
zvpp3IC2iNc*xoC~o1|-X2)HK6dcpO#NqSs|fX9-yrM(nNX$dm36~ndy!*zxX16w7L
zW;U=4JmJ6h5dXiK^`)s#DP`k-X(F>E>F2H^KoTC{j>Q;0>4CEAg5bEMMK#Bwr15TC
z0!M(2F~)5KzU!JGxDwUXqEDNdrI8Uj?g4K6ZwZL|HH~yw>h$dUPVbupw;z-=)ahVY
zN@7%uG5wOtKn2(XY)+utX5b5;BB?B?KZI^gV?f+>Cutq9+h_M%V9@&u1AhIX@A)_Q
zISHNsH9!9gECMfqWxu`-`~loIv!%H4sA&-NHq~C>1E364frG%8Yb5K=0yls;;2H1&
zxNT;0aoxNu>7u#^7kx>_OM||a47dcG&Z>150L#E-U<y#ZrEM{S%8$VBYmkIx;3RPM
zeKD<R7BI7`z**q=8Z!PlaMpEiuM&(@a^t|C9u)K1xseCG2{XGJC!@7wh@=g`9biXJ
z377{yH?vysLde;y0b{_;92$QU7&Eh4D+N((0wS)oWM&f{81sTFuG7*gT{~Cf`*|t{
zIsQ!2GB^|o2P7?LVE8LZ``b0%+9km=#7^L^l->RlGyA*Uo<UpN;fUaQV8m<hPUC^g
znoniDx3UG5^nD7hf4H6PZ}5i5su?(*0_P_h$j-JS<g@Wv3Iqi07?%PXKkR*jPNOR6
zqflut2m$VjgMM@xgFrb{@C(@#9i{$D&(IilS-B&il49~13H6|0NmSATuq7n|{xP$U
zb3s7TH$MU5PLMZ8LFxcWQweT;2%PfcVFKdM<mR(FNi!{0b3aMi6uEzs|JMp;@?!je
zq+2nSo?R(r>wPOM>4=YsgIkgYGT#SCsz_Rhq40#HzD6~CgoHjH+YAdXJ97^hlk~KK
zk~RMx*y3(pB1D+qTWj#_r;<kVummO>DEJ_Rf|5oh%{7oQnTJAX^#<q>aL&wjnc2N|
zT-4LtJu|BU=l$7He3}Ojh~k2zO6VS4WLZ>P#v9~?fIE_Yhy=z?1>BYEqb^ff8$Tmy
zpQQDnXFY~Dte5n4X7xZMvRj4|K-M~t*39QYW`P0)3KZxzyaw8)I0MPWRjL30002ov
JPDHLkV1nl#^7;S(
diff --git a/app/src/main/res/drawable-xxhdpi/ic_star.png b/app/src/main/res/drawable-xxhdpi/ic_star.png
deleted file mode 100644
index bc99ac86917c0ce1c8ba594eea8caafb9db1a380..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 1655
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
B07d`+
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_star.png b/app/src/main/res/drawable-xxxhdpi/ic_star.png
deleted file mode 100644
index d0ff07eb8631535b7f731afd9440c0adb9f7b913..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 1929
zc$@)=2X^?0P)<h;3K|Lk000e1NJLTq004jh004jp1^@s6!#-il00006VoOIv03HB{
z0Oc9g&QkyY010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U|;4D<q9|0O0@t2Np?0
zK~#9!?VU?(6;&L@zmM`Nv?8rE8UsRk2{FD{Xb=<@kPsu`u_56V9!3Qh>RzMW;L^nC
z(q~*jR16B@LX8sR3OA@orQj>J4G$406w2pf&Xu9GxA!qK_uMo8UoyE9=$$#|eBb$>
z=iC7d!!QiPFbu;m48t%C!!UwI5+yOuWiTqo;sd}&02|%8kwX(4mUP%kB8RnK(tKTK
zzD0rjnP7L!0K4;A4$QFuZm9Akb6FOnaw`6-L;Tw=YX<UTfL`59kCjY5I)5uQJWp5@
z2;T%h6fuAe2?H0uRU^}4oxpH;yM(`a$A*F7Mu1BI#*Of2mr0Jd2oPT9@1+vN2Y_*s
zUbN0&cqZsp>2zBJ2&?u#0HCdmueC|K&!Rv$Cg@c89J5YfI0mSwD(7K+AP-Hzo+`e(
z+af^y8{i^<#tOgQM{<HifcowHZK*<h0BDr7IpoeD1F!w(0Zgp&GUrJ)TLh>-@!Jv*
z9{`#p-DU=;Kfd?$TGj-l-S(4&q=5ttevM>9;o24fe0Fps{_6?nZIq<fLYx+0Xtm!7
zKakQb8eBB62;gh&2e357TPz7J3WOE`2;d@swAS<c08At)ivWIdYl`9n(WKHO>je7C
zz6|d1i8TR!cK#Y&_|Jj~h}H=#0(jK<dn&_QJ{d}9kb%_x(EzSweCsg)uGYH|Mg>y)
zAFRQx?++mguwH6;vBH-07l1o5PSzhJr&gNgTpOSSK_>vX#U0J=xE(<IpyRH>S89-#
z_&rYm=mKy&c60+c2jE}#d5+{o-weZy1RalPX*PaL0Wb@|YydN3=b`UX5`bd>IsyC|
zJMRT>A%2j&l(u15iNKP^BARe%jD5B`0p|di>(1u_7z?8s`T-nuMmY-L7k7RN(ahwf
z!Y9f8at*>VYWZjYf1<qo^+xve0JxLn)l`}QNv8m`SUG#iX_Bp}4g=i{I<2g|qqAJ`
zE1m}+IUB$MD|2r+;50!d25=pW6#zP{>}yU3$rY7uU9Wf?5!-vW48TFtp(ZRR`9(ED
z!ldQ_rULlQ^vINHB!ACj9-u@MG`b;3lWCJG=K-{l>`UTeNiGKUA=;61)HF(spAqdy
z>PzZ^i5bAPK?5Z32C&z(N}P{L&O^exk`rAHcAY|yTm@j4X_gqfNUly}!6=o5m)Hnl
z6M%P3zpB_w^1ZZH3sYNpi<#gN0N<L96|soqp){9@Gg*3-G!4-jd4p+M5(5C*Nv1xu
z&SXoN%SbbTlcw#6oCMIEh4`5npfF4%IUT?^rtz?R?aHVxs~cu!fY=D(Q2-y9);IA!
z$t78D4a;;_aLfc70K8(F|If=LH`QWaU`;oLN?HqGPtL_(L-M1#-V|D;8QKv|ACJzN
z@K*rLA$g*fiSWSyh0{E3H9JkR)rV&XYW`$Up#a==rmh@_f7}=Gy)eKa6SM>PE@1Hw
zk(?RNvl-xKGb}`yuWfmY<Rae^<>kYnB)0%~HX!kzA-T=Vvi7yaT<35#fDh|j{8a$<
z`ud=#?~jK+96;@V$mhg)YXDbc76)K}$9#TF-0LTCC7nUE&#<03L$bvpK>6ZN4nTYW
zm@H|M8KC?Q;KqPP0UOK!<+uN90y4l_GeG&w3djJneNC9p^8i7;sK?h=(D~X2Sc$-p
z^tc(IbhaZrw)+^=d^Ny50UF?5A6o%0+a*c;h<=JSB>G8?vj{M<`11l39{|Qmnqvki
zE<OP4K)CGitsg)SBS05`>46%c%k6ry2vCI9fFpo+d822wzZSpypEV66uUP~by8X{`
z8`u>9TLEm#*mOHXej9nUCiqF|b4}9zg6RrkNZRlIFKv!k6EM61(%t}a0nu~!J;U6;
z4bkryOiVEiXGu=BCSYjN+&HnGWD}yFvKx*b_c!b7G>>&1{#T?Fat}yqi1jl{>5D*8
zgQSBgrD?e-KB&+oeV%Y3UzIc^fwWC=*GiJleCY`K^k`U;Tfo-=7(=qRnu2!E@AV>@
znqHS+`WA-xD*9?`T7LpHYrmwXQp0_jLsUp=N+?qGo8mVX@Qf-8^pd0*Nef@Z2s0#I
zt}@NjtO>Zz3srn~E6MRByJF2rnoSi*cDbe9tu@MXa1r323Tn_k_v}Ee)7~QK(+bjm
z)|9WT{XZ>fLE7QIf@WcXq%+nJD8B&5lu>BU`67G~BRpS5e(aZ1CGD)2aGyf6@U$5~
zI$orJ{+6`V*IHjfG*~LBr%3*e<z0MA8W^T<I_gdMB1Y&KCXWM>m{;)&1{k~q`=xt(
zcwLJ>gb5}}`f7-!Y36o+fTSgZ!u_&PgfC)*<&wH%`Cg2?;-+pT>5Uxb{mnuLH_z?=
zkwP1or!Y8Z$@$0J_5<=Jyye|648t%C!!QiPFbu;m48t%C!!QiP$cX;{I`t?ZaC59>
P00000NkvXXu0mjfSA22Y
diff --git a/app/src/main/res/drawable/compass_3_fill.xml b/app/src/main/res/drawable/compass_3_fill.xml
new file mode 100644
--- /dev/null
+++ b/app/src/main/res/drawable/compass_3_fill.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="30dp" android:viewportHeight="24" android:viewportWidth="24" android:width="30dp">
+
+ <path android:fillColor="?colorOnPrimary" android:pathData="M12,22C6.477,22 2,17.523 2,12C2,6.477 6.477,2 12,2C17.523,2 22,6.477 22,12C22,17.523 17.523,22 12,22ZM16.5,7.5L10,10L7.5,16.5L14,14L16.5,7.5ZM12,13C11.448,13 11,12.552 11,12C11,11.448 11.448,11 12,11C12.552,11 13,11.448 13,12C13,12.552 12.552,13 12,13Z"/>
+
+</vector>
diff --git a/app/src/main/res/drawable/ic_moving_emph.xml b/app/src/main/res/drawable/ic_moving_emph.xml
--- a/app/src/main/res/drawable/ic_moving_emph.xml
+++ b/app/src/main/res/drawable/ic_moving_emph.xml
@@ -4,6 +4,6 @@
android:viewportWidth="48"
android:viewportHeight="48">
<path
- android:fillColor="#FF000000"
+ android:fillColor="?colorOnPrimary"
android:pathData="M6.25,36.9 L3.25,33.9 14.65,22.5Q16.5,20.7 19.025,20.7Q21.55,20.7 23.35,22.5L25.65,24.8Q26.2,25.35 26.975,25.35Q27.75,25.35 28.3,24.8L37.45,15.65H32.5V11.35H44.8V23.65H40.5V18.7L31.3,27.85Q29.5,29.7 26.95,29.7Q24.4,29.7 22.6,27.85L20.25,25.5Q19.7,24.95 18.95,24.95Q18.2,24.95 17.65,25.5Z"/>
</vector>
diff --git a/app/src/main/res/drawable/ic_star_filled_white.xml b/app/src/main/res/drawable/ic_star_filled_white.xml
--- a/app/src/main/res/drawable/ic_star_filled_white.xml
+++ b/app/src/main/res/drawable/ic_star_filled_white.xml
@@ -4,6 +4,6 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
- android:fillColor="#FFFFFF"
+ android:fillColor="@color/white"
android:pathData="M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z"/>
</vector>
diff --git a/app/src/main/res/layout/fragment_buttons.xml b/app/src/main/res/layout/fragment_buttons.xml
new file mode 100644
--- /dev/null
+++ b/app/src/main/res/layout/fragment_buttons.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".fragments.ButtonsFragment"
+ android:padding="5dp"
+>
+ <!--
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Home"
+ android:textSize="20sp"
+ android:layout_centerHorizontal="true"
+ android:layout_alignParentTop="true"
+ android:id="@+id/homeTitleTextView"
+ />
+ -->
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentEnd="true"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="40dp"
+ >
+
+ <GridLayout
+ android:id="@+id/homeGridLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:columnCount="2"
+ android:padding="0dp" />
+
+ </ScrollView>
+
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_main_screen.xml b/app/src/main/res/layout/fragment_main_screen.xml
--- a/app/src/main/res/layout/fragment_main_screen.xml
+++ b/app/src/main/res/layout/fragment_main_screen.xml
@@ -13,7 +13,6 @@
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignBottom="@+id/searchButton"
- android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:background="@drawable/qrcode_button_custom"
android:contentDescription="@string/qrcode"
@@ -27,8 +26,6 @@
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_toEndOf="@+id/QRButton"
- android:layout_toLeftOf="@+id/searchButton"
- android:layout_toRightOf="@+id/QRButton"
android:layout_toStartOf="@+id/searchButton"
android:ems="10"
android:hint="@string/insert_bus_stop_number"
@@ -37,8 +34,6 @@
android:selectAllOnFocus="true"
android:singleLine="true"
>
-
- <requestFocus />
</EditText>
<!--android:layout_alignParentLeft="true"
@@ -60,8 +55,6 @@
android:imeOptions="actionSearch"
android:singleLine="true"
android:visibility="gone">
-
- <requestFocus />
</EditText>
<ImageButton
diff --git a/app/src/main/res/layout/item_card_button.xml b/app/src/main/res/layout/item_card_button.xml
new file mode 100644
--- /dev/null
+++ b/app/src/main/res/layout/item_card_button.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.google.android.material.card.MaterialCardView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/cardView"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:cardCornerRadius="10dp"
+ app:cardElevation="1dp"
+ app:cardBackgroundColor="?colorPrimary"
+ app:rippleColor="?attr/colorControlHighlight">
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:padding="20dp">
+
+ <ImageView
+ android:id="@+id/cardIcon"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintBottom_toTopOf="@id/cardLabel"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:contentDescription="@null"
+ app:tint="@color/grey_700"
+ />
+
+ <TextView
+ android:id="@+id/cardLabel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="12dp"
+ android:textSize="18sp"
+ android:text="Trial"
+ android:textColor="@color/grey_700"
+ android:textAlignment="center"
+ android:fontFamily="@font/lato_bold"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/cardIcon"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:textStyle="bold" />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+
+</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
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
@@ -74,6 +74,7 @@
<string name="action_view_on_map">Visualizza sulla mappa</string>
<string name="cannot_show_on_map_no_activity">Non trovo un\'applicazione dove mostrarla</string>
<string name="cannot_show_on_map_no_position">Posizione della fermata non trovata</string>
+ <string name="nearby_me">Vicino a me</string>
<string name="nearby_stops_message">Fermate vicine</string>
<string name="position_searching_message">Ricerca della posizione</string>
<string name="no_stops_nearby">Nessuna fermata nei dintorni</string>
diff --git a/app/src/main/res/values-v35/styles.xml b/app/src/main/res/values-v35/styles.xml
--- a/app/src/main/res/values-v35/styles.xml
+++ b/app/src/main/res/values-v35/styles.xml
@@ -1,15 +1,4 @@
<resources>
- <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
- <!--
- This forces the app to not use Edge-to-Edge. However, on API 36 it will be ignored!
- -->
- </style>
-
- <style name="AppMaterialTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
- <!--
- This forces the app to not use Edge-to-Edge. However, on API 36 it will be ignored!
- -->
- </style>
</resources>
\ No newline at end of file
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
@@ -151,7 +151,8 @@
<string name="list_fragment_debug" translatable="false">ListFragment - BusTO</string>
<string name="mainSharedPreferences" translatable="false">it.reyboz.bustorino.preferences</string>
<string name="databaseUpdatingPref" translatable="false">db_is_updating</string>
- <!-- Settings -->
+ <!-- used in the buttons as generic title for "show what is near me" -->
+ <string name="nearby_me">Nearby me</string>
<string name="nearby_stops_message">Nearby stops</string>
<string name="nearby_arrivals_message">Nearby connections</string>
<string name="app_version">App version</string>

File Metadata

Mime Type
text/plain
Expires
Sat, Jul 11, 21:02 (14 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1997791
Default Alt Text
D243.1783796537.diff (57 KB)

Event Timeline