diff --git a/app/build.gradle b/app/build.gradle --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,9 @@ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + testOptions { + unitTests.returnDefaultValues = true + } sourceSets { androidTest.assets.srcDirs += files("$projectDir/assets/schemas/".toString()) @@ -132,3 +135,4 @@ androidTestImplementation "androidx.room:room-testing:$room_version" } + diff --git a/app/src/main/java/it/reyboz/bustorino/data/FavoritesLiveData.java b/app/src/main/java/it/reyboz/bustorino/data/FavoritesLiveData.java --- a/app/src/main/java/it/reyboz/bustorino/data/FavoritesLiveData.java +++ b/app/src/main/java/it/reyboz/bustorino/data/FavoritesLiveData.java @@ -104,6 +104,10 @@ } + public void forceReload(){ + loadData(true); + } + @Override protected void onActive() { //Log.d(TAG, "onActive()"); diff --git a/app/src/main/java/it/reyboz/bustorino/data/FavoritesViewModel.java b/app/src/main/java/it/reyboz/bustorino/data/FavoritesViewModel.java --- a/app/src/main/java/it/reyboz/bustorino/data/FavoritesViewModel.java +++ b/app/src/main/java/it/reyboz/bustorino/data/FavoritesViewModel.java @@ -14,11 +14,10 @@ public class FavoritesViewModel extends AndroidViewModel { FavoritesLiveData favoritesLiveData; - final Context appContext; public FavoritesViewModel(@NonNull Application application) { super(application); - appContext = application.getApplicationContext(); + //appContext = application.getApplicationContext(); } @Override @@ -27,9 +26,9 @@ super.onCleared(); } - public LiveData> getFavorites(){ + public FavoritesLiveData getFavorites(){ if (favoritesLiveData==null){ - favoritesLiveData= new FavoritesLiveData(appContext, true); + favoritesLiveData= new FavoritesLiveData(getApplication(), true); } return favoritesLiveData; } diff --git a/app/src/main/java/it/reyboz/bustorino/data/NextGenDB.java b/app/src/main/java/it/reyboz/bustorino/data/NextGenDB.java --- a/app/src/main/java/it/reyboz/bustorino/data/NextGenDB.java +++ b/app/src/main/java/it/reyboz/bustorino/data/NextGenDB.java @@ -165,6 +165,7 @@ /** * Query some bus stops inside a map view + * @return stoplist, if empty it means that an error occurred * * You can obtain the coordinates from OSMDroid using something like this: * BoundingBoxE6 bb = mMapView.getBoundingBox(); @@ -198,7 +199,12 @@ Log.e(DEBUG_TAG, "SQLiteException occurred"); e.printStackTrace(); return stops; - }finally { + }catch (Exception e){ + Log.e(DEBUG_TAG, "Exception occurred when getting stops"); + e.printStackTrace(); + return stops; + } + finally { db.close(); } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/FavoritesFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/FavoritesFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/FavoritesFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/FavoritesFragment.java @@ -35,6 +35,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; @@ -43,10 +44,12 @@ import java.util.ArrayList; import java.util.List; +import androidx.work.WorkInfo; import it.reyboz.bustorino.*; import it.reyboz.bustorino.adapters.StopAdapterListener; import it.reyboz.bustorino.adapters.StopRecyclerAdapter; import it.reyboz.bustorino.backend.Stop; +import it.reyboz.bustorino.data.DatabaseUpdate; import it.reyboz.bustorino.data.FavoritesViewModel; import it.reyboz.bustorino.middleware.AsyncStopFavoriteAction; @@ -57,10 +60,16 @@ private TextView favoriteTipTextView; private ImageView angeryBusImageView; + private boolean dbUpdateRunning = false; + private FavoritesViewModel model; + + @Nullable private CommonFragmentListener mListener; public static final String FRAGMENT_TAG = "BusTOFavFragment"; + private final static String DEBUG_TAG = FRAGMENT_TAG; + private final StopAdapterListener adapterListener = new StopAdapterListener() { @Override @@ -130,9 +139,26 @@ //register for the context menu registerForContextMenu(favoriteRecyclerView); - FavoritesViewModel model = new ViewModelProvider(this).get(FavoritesViewModel.class); + model.getFavorites().observe(getViewLifecycleOwner(), this::showStops); + // watch the DB update + DatabaseUpdate.watchUpdateWorkStatus(getContext(), this, workInfos -> { + if(workInfos.isEmpty()) return; + + WorkInfo wi = workInfos.get(0); + if(wi.getState() == WorkInfo.State.RUNNING){ + dbUpdateRunning = true; + } else { + //force reload if it was previously running + if(model!=null && dbUpdateRunning) { + Log.d(DEBUG_TAG,"DB Finished updating, reload favorites"); + model.getFavorites().forceReload(); + } + dbUpdateRunning = false; + } + }); + showStops(new ArrayList<>()); return root; } @@ -145,6 +171,7 @@ throw new RuntimeException(context + " must implement CommonFragmentListener"); } + model = new ViewModelProvider(this).get(FavoritesViewModel.class); } @@ -222,7 +249,7 @@ @Nullable @Override public View getBaseViewForSnackBar() { - return null; + return favoriteRecyclerView; } void showStops(List busStops){ diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/MapFragment.java @@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable; import android.location.Location; import android.location.LocationManager; -import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -39,6 +38,7 @@ import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.content.res.ResourcesCompat; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; @@ -68,13 +68,11 @@ import org.osmdroid.views.overlay.infowindow.InfoWindow; import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; -import java.lang.ref.WeakReference; import java.util.*; import kotlin.Pair; import it.reyboz.bustorino.R; import it.reyboz.bustorino.backend.Stop; -import it.reyboz.bustorino.data.NextGenDB; import it.reyboz.bustorino.middleware.GeneralActivity; import it.reyboz.bustorino.util.Permissions; @@ -114,6 +112,8 @@ private Bundle savedMapState = null; protected ImageButton btCenterMap; protected ImageButton btFollowMe; + + protected CoordinatorLayout coordLayout; private boolean hasMapStartFinished = false; private boolean followingLocation = false; @@ -202,7 +202,7 @@ @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //use the same layout as the activity - View root = inflater.inflate(R.layout.activity_map, container, false); + View root = inflater.inflate(R.layout.fragment_map, container, false); if (getContext() == null){ throw new IllegalStateException(); } @@ -218,6 +218,7 @@ btCenterMap = root.findViewById(R.id.icon_center_map); btFollowMe = root.findViewById(R.id.icon_follow); + coordLayout = root.findViewById(R.id.coord_layout); //setup FolderOverlay stopsFolderOverlay = new FolderOverlay(); @@ -786,10 +787,9 @@ } @Nullable - @org.jetbrains.annotations.Nullable @Override public View getBaseViewForSnackBar() { - return null; + return coordLayout; } } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.java @@ -212,6 +212,7 @@ return; } if(!stops.isEmpty()) { + Log.d(DEBUG_TAG, "Showing "+stops.size()+" stops nearby"); currentNearbyStops =stops; showStopsInViews(currentNearbyStops, lastPosition); } 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 @@ -48,7 +48,7 @@ /** * Find the view on which the snackbar should be shown - * @return + * @return a view or null if you don't want the snackbar shown */ @Nullable public abstract View getBaseViewForSnackBar(); 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 @@ -95,6 +95,7 @@ android:layout_marginRight="16dp" android:layout_marginStart="16dip" android:indeterminateOnly="true" + android:minWidth="10dp" android:visibility="gone" /> diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/fragment_map.xml rename from app/src/main/res/layout/activity_map.xml rename to app/src/main/res/layout/fragment_map.xml --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -2,9 +2,20 @@ + + android:layout_width="match_parent" + android:layout_height="match_parent" /> +