Page Menu
Home
GitPull.it
Search
Configure Global Search
Log In
Files
F2443969
D77.1729681837.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
22 KB
Referenced Files
None
Subscribers
None
D77.1729681837.diff
View Options
diff --git a/build.gradle b/build.gradle
--- a/build.gradle
+++ b/build.gradle
@@ -104,6 +104,7 @@
implementation "com.google.android.material:material:1.4.0"
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
+ implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
implementation 'org.jsoup:jsoup:1.13.1'
diff --git a/res/layout/fragment_main_screen.xml b/res/layout/fragment_main_screen.xml
--- a/res/layout/fragment_main_screen.xml
+++ b/res/layout/fragment_main_screen.xml
@@ -56,7 +56,7 @@
android:layout_toLeftOf="@+id/searchButton"
android:layout_toRightOf="@+id/QRButton"
android:layout_toStartOf="@+id/searchButton"
-
+ android:inputType="text"
android:ems="10"
android:hint="@string/insert_bus_stop_name"
android:imeOptions="actionSearch"
@@ -101,11 +101,12 @@
android:id="@+id/howDoesItWorkTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="10dp"
+ android:layout_marginBottom="5dp"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dip"
android:layout_marginRight="16dp"
android:layout_marginStart="16dip"
+ android:layout_marginTop="10dp"
android:layout_toLeftOf="@+id/hideHintButton"
android:layout_toStartOf="@+id/hideHintButton"
android:text="@string/howDoesItWork"
@@ -129,36 +130,48 @@
android:textSize="19sp"
android:visibility="gone" />
- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
- android:id="@+id/listRefreshLayout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentEnd="true"
- android:layout_alignParentRight="true"
- android:layout_below="@+id/howDoesItWorkTextView"
- android:animateLayoutChanges="true"
- android:visibility="gone">
- <FrameLayout
- android:layout_width="match_parent"
- android:id="@+id/resultFrame"
- android:layout_height="fill_parent"
- android:layout_alignParentLeft="true" android:layout_alignParentStart="true"/>
- </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
- <com.google.android.material.floatingactionbutton.FloatingActionButton
- android:id="@+id/floatingActionButton"
- android:layout_width="wrap_content"
+ <androidx.coordinatorlayout.widget.CoordinatorLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:id="@+id/coord_layout"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_gravity="bottom|end"
- android:layout_margin="16dp"
- android:src="@drawable/alphabetical"
- fabSize="normal"
- backgroundTint="@color/teal_500"
- rippleColor="@color/teal_300"
- elevation="15dp"
+ android:layout_below="@+id/howDoesItWorkTextView"
- />
+ >
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/listRefreshLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+ android:animateLayoutChanges="true"
+ android:visibility="gone">
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:id="@+id/resultFrame"
+ android:layout_height="fill_parent"
+ android:layout_alignParentLeft="true" android:layout_alignParentStart="true"/>
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+ <com.google.android.material.floatingactionbutton.FloatingActionButton
+ android:id="@+id/floatingActionButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+ android:layout_gravity="bottom|end"
+ android:layout_margin="13dp"
+ android:src="@drawable/alphabetical"
+ fabSize="normal"
+ backgroundTint="@color/teal_500"
+ rippleColor="@color/teal_300"
+ elevation="13dp"
+
+ />
+ </androidx.coordinatorlayout.widget.CoordinatorLayout>
</RelativeLayout>
\ No newline at end of file
diff --git a/src/it/reyboz/bustorino/ActivityPrincipal.java b/src/it/reyboz/bustorino/ActivityPrincipal.java
--- a/src/it/reyboz/bustorino/ActivityPrincipal.java
+++ b/src/it/reyboz/bustorino/ActivityPrincipal.java
@@ -58,11 +58,7 @@
import it.reyboz.bustorino.backend.Stop;
import it.reyboz.bustorino.data.DBUpdateWorker;
import it.reyboz.bustorino.data.DatabaseUpdate;
-import it.reyboz.bustorino.fragments.FavoritesFragment;
-import it.reyboz.bustorino.fragments.FragmentKind;
-import it.reyboz.bustorino.fragments.FragmentListenerMain;
-import it.reyboz.bustorino.fragments.MainScreenFragment;
-import it.reyboz.bustorino.fragments.MapFragment;
+import it.reyboz.bustorino.fragments.*;
import it.reyboz.bustorino.middleware.GeneralActivity;
import static it.reyboz.bustorino.backend.utils.getBusStopIDFromUri;
@@ -154,7 +150,7 @@
if (b != null) {
busStopID = b.getString("bus-stop-ID");
- /**
+ /*
* I'm not very sure if you are coming from an Intent.
* Some launchers work in strange ways.
*/
@@ -381,10 +377,19 @@
super.onBackPressed();
}
+ /**
+ * Create and show the SnackBar with the message
+ */
private void createDefaultSnackbar() {
- if (snackbar == null) {
- snackbar = Snackbar.make(findViewById(R.id.searchButton), R.string.database_update_message, Snackbar.LENGTH_INDEFINITE);
+
+ View baseView = null;
+ final Fragment frag = getSupportFragmentManager().findFragmentById(R.id.mainActContentFrame);
+ if (frag instanceof ScreenBaseFragment){
+ baseView = ((ScreenBaseFragment) frag).getBaseViewForSnackBar();
}
+ if (baseView == null) baseView = findViewById(R.id.mainActContentFrame);
+ if (baseView == null) Log.e(DEBUG_TAG, "baseView null for default snackbar, probably exploding now");
+ snackbar = Snackbar.make(baseView, R.string.database_update_message, Snackbar.LENGTH_INDEFINITE);
snackbar.show();
}
diff --git a/src/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt b/src/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt
--- a/src/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt
+++ b/src/it/reyboz/bustorino/backend/mato/MatoAPIFetcher.kt
@@ -124,10 +124,10 @@
requestQueue.add(request)
- var palinaList:List<Palina> = mutableListOf<Palina>()
+ var palinaList:List<Palina> = mutableListOf()
try {
- palinaList = future.get(30, TimeUnit.SECONDS)
+ palinaList = future.get(60, TimeUnit.SECONDS)
res?.set(Fetcher.Result.OK)
}catch (e: InterruptedException) {
diff --git a/src/it/reyboz/bustorino/fragments/FavoritesFragment.java b/src/it/reyboz/bustorino/fragments/FavoritesFragment.java
--- a/src/it/reyboz/bustorino/fragments/FavoritesFragment.java
+++ b/src/it/reyboz/bustorino/fragments/FavoritesFragment.java
@@ -31,7 +31,6 @@
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@@ -45,21 +44,20 @@
import java.util.ArrayList;
import java.util.List;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
import it.reyboz.bustorino.*;
import it.reyboz.bustorino.adapters.AdapterListener;
-import it.reyboz.bustorino.adapters.StopAdapter;
import it.reyboz.bustorino.adapters.StopRecyclerAdapter;
import it.reyboz.bustorino.backend.Stop;
import it.reyboz.bustorino.data.FavoritesViewModel;
import it.reyboz.bustorino.middleware.AsyncStopFavoriteAction;
-public class FavoritesFragment extends BaseFragment {
+public class FavoritesFragment extends ScreenBaseFragment {
private RecyclerView favoriteRecyclerView;
private EditText busStopNameText;
private TextView favoriteTipTextView;
private ImageView angeryBusImageView;
- private LinearLayoutManager llManager;
@Nullable
private CommonFragmentListener mListener;
@@ -116,7 +114,7 @@
*/
- llManager = new LinearLayoutManager(getContext());
+ LinearLayoutManager llManager = new LinearLayoutManager(getContext());
llManager.setOrientation(LinearLayoutManager.VERTICAL);
favoriteRecyclerView.setLayoutManager(llManager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(favoriteRecyclerView.getContext(),
@@ -139,7 +137,7 @@
if (context instanceof CommonFragmentListener) {
mListener = (CommonFragmentListener) context;
} else {
- throw new RuntimeException(context.toString()
+ throw new RuntimeException(context
+ " must implement CommonFragmentListener");
}
@@ -182,7 +180,7 @@
return false;
StopRecyclerAdapter adapter = (StopRecyclerAdapter) favoriteRecyclerView.getAdapter();
- Stop busStop = (Stop) adapter.getStops().get(adapter.getPosition());
+ Stop busStop = adapter.getStops().get(adapter.getPosition());
switch (item.getItemId()) {
case R.id.action_favourite_entry_delete:
@@ -214,6 +212,11 @@
}
}
+ @Nullable
+ @Override
+ public View getBaseViewForSnackBar() {
+ return null;
+ }
void showStops(List<Stop> busStops){
// If no data is found show a friendly message
@@ -256,43 +259,32 @@
builder.setTitle(getString(R.string.dialog_rename_bus_stop_username_title));
builder.setView(renameDialogLayout);
- builder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- String busStopUsername = busStopNameText.getText().toString();
- String oldUserName = busStop.getStopUserName();
-
- // changed to none
- if(busStopUsername.length() == 0) {
- // unless it was already empty, set new
- if(oldUserName != null) {
- busStop.setStopUserName(null);
-
- }
- } else { // changed to something
- // something different?
- if(!busStopUsername.equals(oldUserName)) {
- busStop.setStopUserName(busStopUsername);
-
- }
+ builder.setPositiveButton(getString(android.R.string.ok), (dialog, which) -> {
+ String busStopUsername = busStopNameText.getText().toString();
+ String oldUserName = busStop.getStopUserName();
+
+ // changed to none
+ if(busStopUsername.length() == 0) {
+ // unless it was already empty, set new
+ if(oldUserName != null) {
+ busStop.setStopUserName(null);
+
+ }
+ } else { // changed to something
+ // something different?
+ if(!busStopUsername.equals(oldUserName)) {
+ busStop.setStopUserName(busStopUsername);
+
}
- launchUpdate(busStop);
- }
- });
- builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
}
+ launchUpdate(busStop);
});
- builder.setNeutralButton(R.string.dialog_rename_bus_stop_username_reset_button, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // delete user name from database
- busStop.setStopUserName(null);
- launchUpdate(busStop);
+ builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel());
+ builder.setNeutralButton(R.string.dialog_rename_bus_stop_username_reset_button, (dialog, which) -> {
+ // delete user name from database
+ busStop.setStopUserName(null);
+ launchUpdate(busStop);
- }
});
builder.show();
}
@@ -300,11 +292,8 @@
private void launchUpdate(Stop busStop){
if (getContext()!=null)
new AsyncStopFavoriteAction(getContext().getApplicationContext(), AsyncStopFavoriteAction.Action.UPDATE,
- new AsyncStopFavoriteAction.ResultListener() {
- @Override
- public void doStuffWithResult(Boolean result) {
- //Toast.makeText(getApplicationContext(), R.string.tip_add_favorite, Toast.LENGTH_SHORT).show();
- }
+ result -> {
+ //Toast.makeText(getApplicationContext(), R.string.tip_add_favorite, Toast.LENGTH_SHORT).show();
}).execute(busStop);
}
}
diff --git a/src/it/reyboz/bustorino/fragments/MainScreenFragment.java b/src/it/reyboz/bustorino/fragments/MainScreenFragment.java
--- a/src/it/reyboz/bustorino/fragments/MainScreenFragment.java
+++ b/src/it/reyboz/bustorino/fragments/MainScreenFragment.java
@@ -15,6 +15,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageButton;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -58,7 +59,7 @@
* Use the {@link MainScreenFragment#newInstance} factory method to
* create an instance of this fragment.
*/
-public class MainScreenFragment extends BaseFragment implements FragmentListenerMain{
+public class MainScreenFragment extends ScreenBaseFragment implements FragmentListenerMain{
private static final String OPTION_SHOW_LEGEND = "show_legend";
@@ -191,6 +192,7 @@
private CommonFragmentListener mListener;
private String pendingStopID = null;
+ private CoordinatorLayout coordLayout;
public MainScreenFragment() {
// Required empty public constructor
@@ -219,7 +221,7 @@
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_main_screen, container, false);
- addToFavorites = (ImageButton) root.findViewById(R.id.addToFavorites);
+ addToFavorites = root.findViewById(R.id.addToFavorites);
busStopSearchByIDEditText = root.findViewById(R.id.busStopSearchByIDEditText);
busStopSearchByNameEditText = root.findViewById(R.id.busStopSearchByNameEditText);
progressBar = root.findViewById(R.id.progressBar);
@@ -251,6 +253,8 @@
.setOnRefreshListener(() -> mainHandler.post(refreshStop));
swipeRefreshLayout.setColorSchemeResources(R.color.blue_500, R.color.orange_500);
+ coordLayout = root.findViewById(R.id.coord_layout);
+
floatingActionButton.setOnClickListener((this::onToggleKeyboardLayout));
hideHintButton.setOnClickListener(this::onHideHint);
@@ -274,7 +278,7 @@
cr.setCostAllowed(true);
cr.setPowerRequirement(Criteria.NO_REQUIREMENT);
- locationManager = AppLocationManager.getInstance(getContext());
+ locationManager = AppLocationManager.getInstance(getContext());
Log.d(DEBUG_TAG, "OnCreateView, savedInstanceState null: "+(savedInstanceState==null));
@@ -324,6 +328,7 @@
*/
}
+
/**
* Cancel the reload of the arrival times
* because we are going to pop the fragment
@@ -543,6 +548,13 @@
//actionHelpMenuItem.setVisible(true);
}
+ @Nullable
+ @org.jetbrains.annotations.Nullable
+ @Override
+ public View getBaseViewForSnackBar() {
+ return coordLayout;
+ }
+
@Override
public void toggleSpinner(boolean enable) {
if (enable) {
diff --git a/src/it/reyboz/bustorino/fragments/MapFragment.java b/src/it/reyboz/bustorino/fragments/MapFragment.java
--- a/src/it/reyboz/bustorino/fragments/MapFragment.java
+++ b/src/it/reyboz/bustorino/fragments/MapFragment.java
@@ -69,7 +69,7 @@
import it.reyboz.bustorino.middleware.GeneralActivity;
import it.reyboz.bustorino.util.Permissions;
-public class MapFragment extends BaseFragment {
+public class MapFragment extends ScreenBaseFragment {
private static final String TAG = "Busto-MapActivity";
private static final String MAP_CURRENT_ZOOM_KEY = "map-current-zoom";
@@ -131,27 +131,24 @@
};
private final ActivityResultLauncher<String[]> positionRequestLauncher =
- registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
- @Override
- @SuppressLint("MissingPermission")
- public void onActivityResult(Map<String, Boolean> result) {
- if(result.get(Manifest.permission.ACCESS_COARSE_LOCATION) && result.get(Manifest.permission.ACCESS_FINE_LOCATION)){
-
- map.getOverlays().remove(mLocationOverlay);
- startLocationOverlay(true, map);
- if(getContext()==null || getContext().getSystemService(Context.LOCATION_SERVICE)==null)
- return;
- LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
- Location userLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
- if (userLocation != null) {
- map.getController().setZoom(POSITION_FOUND_ZOOM);
- GeoPoint startPoint = new GeoPoint(userLocation);
- setLocationFollowing(true);
- map.getController().setCenter(startPoint);
- }
+ registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> {
+ if(result.get(Manifest.permission.ACCESS_COARSE_LOCATION) && result.get(Manifest.permission.ACCESS_FINE_LOCATION)){
+
+ map.getOverlays().remove(mLocationOverlay);
+ startLocationOverlay(true, map);
+ if(getContext()==null || getContext().getSystemService(Context.LOCATION_SERVICE)==null)
+ return;
+ LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
+ @SuppressLint("MissingPermission")
+ Location userLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+ if (userLocation != null) {
+ map.getController().setZoom(POSITION_FOUND_ZOOM);
+ GeoPoint startPoint = new GeoPoint(userLocation);
+ setLocationFollowing(true);
+ map.getController().setCenter(startPoint);
}
- else Log.w(DEBUG_TAG,"No location permission");
}
+ else Log.w(DEBUG_TAG,"No location permission");
});
public MapFragment() {
@@ -583,6 +580,13 @@
return marker;
}
+ @Nullable
+ @org.jetbrains.annotations.Nullable
+ @Override
+ public View getBaseViewForSnackBar() {
+ return null;
+ }
+
/**
* Simple asyncTask class to load the stops in the background
* Holds a weak reference to the fragment to do callbacks
diff --git a/src/it/reyboz/bustorino/fragments/BaseFragment.java b/src/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
rename from src/it/reyboz/bustorino/fragments/BaseFragment.java
rename to src/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
--- a/src/it/reyboz/bustorino/fragments/BaseFragment.java
+++ b/src/it/reyboz/bustorino/fragments/ScreenBaseFragment.java
@@ -6,13 +6,15 @@
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
import it.reyboz.bustorino.BuildConfig;
import static android.content.Context.MODE_PRIVATE;
-public abstract class BaseFragment extends Fragment {
+public abstract class ScreenBaseFragment extends Fragment {
protected String PREF_FILE= BuildConfig.APPLICATION_ID+".fragment_prefs";
@@ -35,6 +37,7 @@
}
public void hideKeyboard() {
+ if (getActivity()==null) return;
View view = getActivity().getCurrentFocus();
if (view != null) {
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
@@ -42,4 +45,11 @@
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
+
+ /**
+ * Find the view on which the snackbar should be shown
+ * @return
+ */
+ @Nullable
+ public abstract View getBaseViewForSnackBar();
}
diff --git a/src/it/reyboz/bustorino/middleware/AsyncStopsSearcher.java b/src/it/reyboz/bustorino/middleware/AsyncStopsSearcher.java
--- a/src/it/reyboz/bustorino/middleware/AsyncStopsSearcher.java
+++ b/src/it/reyboz/bustorino/middleware/AsyncStopsSearcher.java
@@ -115,7 +115,7 @@
protected void onPostExecute(List<Stop> stops) {
final FragmentHelper fh = helperWR.get();
- if (stops==null || fh==null || theQuery==null) {
+ if (stops==null || stops.size() == 0 || fh==null || theQuery==null) {
if (fh!=null) fh.toggleSpinner(false);
cancel(true);
return;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Oct 23, 13:10 (3 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
639171
Default Alt Text
D77.1729681837.diff (22 KB)
Attached To
Mode
D77: UI improvements
Attached
Detach File
Event Timeline
Log In to Comment