Page Menu
Home
GitPull.it
Search
Configure Global Search
Log In
Files
F12570613
D186.1775818233.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
D186.1775818233.diff
View Options
diff --git a/app/build.gradle b/app/build.gradle
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,14 +4,14 @@
android {
- compileSdk 34
+ compileSdk 35
namespace "it.reyboz.bustorino"
defaultConfig {
applicationId "it.reyboz.bustorino"
minSdkVersion 21
- targetSdkVersion 34
- buildToolsVersion = '34.0.0'
+ targetSdkVersion 35
+ buildToolsVersion = '35.0.1'
versionCode 62
versionName "2.3.1"
vectorDrawables.useSupportLibrary = true
@@ -65,6 +65,10 @@
androidResources {
generateLocaleConfig true
}
+
+ buildFeatures{
+ buildConfig = true
+ }
}
dependencies {
@@ -114,8 +118,7 @@
implementation 'com.google.protobuf:protobuf-java:3.19.6'
// mqtt library
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
- implementation 'com.github.fabmazz:paho.mqtt.android:v1.0.0'
-
+ implementation 'com.github.hannesa2:paho.mqtt.android:4.4'
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
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
@@ -24,6 +24,7 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
@@ -39,6 +40,7 @@
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.GravityCompat;
+import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -84,6 +86,10 @@
super.onCreate(savedInstanceState);
Log.d(DEBUG_TAG, "onCreate, savedInstanceState is: "+savedInstanceState);
setContentView(R.layout.activity_principal);
+ /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ getWindow().setNavigationBarContrastEnforced(false);
+ }
+ */
boolean showingArrivalsFromIntent = false;
Toolbar mToolbar = findViewById(R.id.default_toolbar);
@@ -94,7 +100,6 @@
mToolbar.setOnMenuItemClickListener(new ToolbarItemClickListener(this));
-
mDrawer = findViewById(R.id.drawer_layout);
drawerToggle = setupDrawerToggle(mToolbar);
diff --git a/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java b/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java
--- a/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java
+++ b/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java
@@ -1,6 +1,7 @@
package it.reyboz.bustorino;
import android.os.Bundle;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.appcompat.app.ActionBar;
@@ -14,10 +15,11 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
-
+ Toolbar mToolbar = findViewById(R.id.default_toolbar);
+ setSupportActionBar(mToolbar);
ActionBar ab = getSupportActionBar();
if(ab!=null) {
- ab.setIcon(R.drawable.ic_launcher);
+ //ab.setIcon(R.drawable.ic_launcher);
ab.setDisplayHomeAsUpEnabled(true);
} else {
Log.e("SETTINGS_ACTIV","ACTION BAR IS NULL");
diff --git a/app/src/main/java/it/reyboz/bustorino/backend/mato/MQTTMatoClient.kt b/app/src/main/java/it/reyboz/bustorino/backend/mato/MQTTMatoClient.kt
--- a/app/src/main/java/it/reyboz/bustorino/backend/mato/MQTTMatoClient.kt
+++ b/app/src/main/java/it/reyboz/bustorino/backend/mato/MQTTMatoClient.kt
@@ -143,23 +143,27 @@
fun stopMatoRequests(responder: MQTTMatoListener){
var removed = false
- for ((line,v)in respondersMap.entries){
+ for ((linekey,responderList)in respondersMap.entries){
var done = false
- for (el in v){
+ for (el in responderList){
if (el.get()==null){
- v.remove(el)
+ responderList.remove(el)
} else if(el.get() == responder){
- v.remove(el)
+ responderList.remove(el)
done = true
}
if (done)
break
}
- if(done) Log.d(DEBUG_TAG, "Removed one listener for line $line, listeners: $v")
+ if(done) Log.d(DEBUG_TAG, "Removed one listener for line $linekey, listeners: $responderList")
//if (done) break
- if (v.isEmpty()){
+ if (responderList.isEmpty()){
//actually unsubscribe
- client?.unsubscribe( mapTopic(line))
+ try {
+ client?.unsubscribe(mapTopic(linekey))
+ } catch (e: Exception){
+ Log.e(DEBUG_TAG, "Tried unsubscribing but there was an error in the client library:\n$e")
+ }
}
removed = done || removed
}
diff --git a/app/src/main/java/it/reyboz/bustorino/data/MatoPatternsDownloadWorker.kt b/app/src/main/java/it/reyboz/bustorino/data/MatoPatternsDownloadWorker.kt
--- a/app/src/main/java/it/reyboz/bustorino/data/MatoPatternsDownloadWorker.kt
+++ b/app/src/main/java/it/reyboz/bustorino/data/MatoPatternsDownloadWorker.kt
@@ -86,7 +86,7 @@
Log.d(DEBUG_TAG, "Request to download and insert patterns for ${routesIds.size} routes, proceed: $runNewWork, workstate: $addDat")
if(runNewWork){
- val routeIdsArray = routesIds.toTypedArray()
+ val routeIdsArray: Array<String?> = routesIds.toTypedArray()
val dataBuilder = Data.Builder().putStringArray(ROUTES_KEYS,routeIdsArray)
val requ = OneTimeWorkRequest.Builder(MatoPatternsDownloadWorker::class.java)
diff --git a/app/src/main/java/it/reyboz/bustorino/data/MatoTripsDownloadWorker.kt b/app/src/main/java/it/reyboz/bustorino/data/MatoTripsDownloadWorker.kt
--- a/app/src/main/java/it/reyboz/bustorino/data/MatoTripsDownloadWorker.kt
+++ b/app/src/main/java/it/reyboz/bustorino/data/MatoTripsDownloadWorker.kt
@@ -125,7 +125,7 @@
null else info[0].state
Log.d(debugTag, "Request to download and insert ${trips.size} trips, proceed: $runNewWork, workstate: $addDat")
if(runNewWork) {
- val tripsArr = trips.toTypedArray()
+ val tripsArr: Array<String?> = trips.toTypedArray()
val dataBuilder = Data.Builder().putStringArray(TRIPS_KEYS, tripsArr)
//build()
val requ = OneTimeWorkRequest.Builder(MatoTripsDownloadWorker::class.java)
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt
--- a/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt
@@ -6,7 +6,6 @@
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.preference.PreferenceManager
import com.google.gson.JsonObject
import it.reyboz.bustorino.backend.Stop
import it.reyboz.bustorino.data.PreferencesHolder
@@ -76,6 +75,7 @@
}
}
+ @Deprecated("Deprecated in Java")
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
@@ -104,25 +104,32 @@
//For extra stuff to do when the map is destroyed
abstract fun onMapDestroy()
- protected fun restoreMapStateFromBundle(bundle: Bundle){
+ protected fun restoreMapStateFromBundle(bundle: Bundle): Boolean{
val nullDouble = -10_000.0
- val latCenter = bundle.getDouble("center_map_lat", -10.0)
- val lonCenter = bundle.getDouble("center_map_lon",-10.0)
- val zoom = bundle.getDouble("map_zoom", -10.0)
+ var boundsRestored =false
+ val latCenter = bundle.getDouble("center_map_lat", nullDouble)
+ val lonCenter = bundle.getDouble("center_map_lon",nullDouble)
+ val zoom = bundle.getDouble("map_zoom", nullDouble)
val bearing = bundle.getDouble("map_bearing", nullDouble)
val tilt = bundle.getDouble("map_tilt", nullDouble)
- if(lonCenter>=0 &&latCenter>=0) map?.let {
- val newPos = CameraPosition.Builder().target(LatLng(latCenter,lonCenter))
+ if(lonCenter!=nullDouble &&latCenter!=nullDouble) map?.let {
+ val center = LatLng(latCenter, lonCenter)
+ val newPos = CameraPosition.Builder().target(center)
if(zoom>0) newPos.zoom(zoom)
if(bearing!=nullDouble) newPos.bearing(bearing)
if(tilt != nullDouble) newPos.tilt(tilt)
it.cameraPosition=newPos.build()
+ Log.d(DEBUG_TAG, "Restored map state from Bundle, center: $center, zoom: $zoom, bearing $bearing, tilt $tilt")
+ boundsRestored =true
+ } else{
+ Log.d(DEBUG_TAG, "Not restoring map state, center: $latCenter,$lonCenter; zoom: $zoom, bearing: $bearing, tilt $tilt")
}
val mStop = bundle.getBundle("shown_stop")?.let {
Stop.fromBundle(it)
}
mStop?.let { openStopInBottomSheet(it) }
+ return boundsRestored
}
protected fun saveMapStateBeforePause(bundle: Bundle){
diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/MapLibreFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/MapLibreFragment.kt
--- a/app/src/main/java/it/reyboz/bustorino/fragments/MapLibreFragment.kt
+++ b/app/src/main/java/it/reyboz/bustorino/fragments/MapLibreFragment.kt
@@ -346,8 +346,7 @@
}
}
- mapReady.addOnCameraMoveStartedListener {
-
+ mapReady.addOnCameraMoveStartedListener { v->
map?.let { setFollowingUser(it.locationComponent.cameraMode == CameraMode.TRACKING) }
//setFollowingUser()
@@ -361,13 +360,14 @@
// we start requesting the bus positions now
startRequestingPositions()
}
- savedMapStateOnPause?.let{
- restoreMapStateFromBundle(it)
+ var boundsRestored = false
+ stopsViewModel.savedState?.let{
+ boundsRestored = restoreMapStateFromBundle(it)
pendingLocationActivation = false
- Log.d(DEBUG_TAG, "Restored map state from the saved bundle")
+ Log.d(DEBUG_TAG, "Restored map state from the saved bundle: ")
}
//reset saved State at the end
- if( savedMapStateOnPause == null) {
+ if((!boundsRestored)) {
//set initial position
val zoom = 15.0
//center position
@@ -377,7 +377,7 @@
mapReady.cameraPosition = CameraPosition.Builder().target(latlngTarget).zoom(zoom).build()
}
//reset saved state
- savedMapStateOnPause = null
+ stopsViewModel.savedState = null
}
private fun onMapClickReact(point: LatLng): Boolean{
@@ -584,6 +584,13 @@
override fun onStart() {
super.onStart()
mapView.onStart()
+
+ //restore state from viewModel
+ stopsViewModel.savedState?.let {
+ restoreMapStateFromBundle(it)
+ //reset state
+ stopsViewModel.savedState = null
+ }
}
override fun onResume() {
@@ -611,6 +618,8 @@
}
fragmentListener?.readyGUIfor(FragmentKind.MAP)
+ //restore saved state
+ savedMapStateOnPause?.let { restoreMapStateFromBundle(it) }
}
override fun onPause() {
@@ -816,8 +825,8 @@
val samePosition = oldPos?.let { (oldPos.latitude==pos.latitude)&&(oldPos.longitude == pos.longitude) }?:false
if(!samePosition) {
val isPositionInBounds = isInsideVisibleRegion(
- pos.latitude, pos.longitude, true
- ) || (oldPos?.let { isInsideVisibleRegion(it.latitude,it.longitude,true) } ?: false)
+ pos.latitude, pos.longitude, false
+ ) || (oldPos?.let { isInsideVisibleRegion(it.latitude,it.longitude, false) } ?: false)
if (isPositionInBounds) {
//animate = true
//this moves both the icon and the label
diff --git a/app/src/main/java/it/reyboz/bustorino/middleware/AppLocationManager.kt b/app/src/main/java/it/reyboz/bustorino/middleware/AppLocationManager.kt
--- a/app/src/main/java/it/reyboz/bustorino/middleware/AppLocationManager.kt
+++ b/app/src/main/java/it/reyboz/bustorino/middleware/AppLocationManager.kt
@@ -178,6 +178,7 @@
}
}
+ @Deprecated("Deprecated in Java")
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {
//IF ANOTHER LOCATION SOURCE IS READY, USE IT
//OTHERWISE, SIGNAL THAT WE HAVE NO LOCATION
diff --git a/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java b/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java
--- a/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java
+++ b/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java
@@ -22,10 +22,8 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
-import android.content.res.Resources;
import android.graphics.Rect;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
+import android.os.Build;
import com.google.android.material.snackbar.Snackbar;
import androidx.annotation.Nullable;
@@ -169,4 +167,25 @@
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
+
+ protected void setSystemBarAppearance(boolean isSystemInDarkTheme) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ if (isSystemInDarkTheme) {
+ if (getWindow() != null && getWindow().getInsetsController() != null) {
+ getWindow().getInsetsController().setSystemBarsAppearance(
+ 0,
+ android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
+ );
+ }
+ } else {
+ if (getWindow() != null && getWindow().getInsetsController() != null) {
+ getWindow().getInsetsController().setSystemBarsAppearance(
+ android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
+ android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
+ );
+ }
+ }
+ }
+ }
+
}
diff --git a/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt b/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
--- a/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
+++ b/app/src/main/java/it/reyboz/bustorino/util/ViewUtils.kt
@@ -13,18 +13,41 @@
import android.view.animation.Animation
import android.view.animation.Transformation
import android.widget.Toast
+import androidx.core.view.OnApplyWindowInsetsListener
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.core.widget.NestedScrollView
import it.reyboz.bustorino.R
import it.reyboz.bustorino.backend.Stop
-import it.reyboz.bustorino.fragments.LinesDetailFragment
-import it.reyboz.bustorino.fragments.LinesDetailFragment.Companion
import java.io.IOException
class ViewUtils {
companion object{
+
const val DEBUG_TAG="BusTO:ViewUtils"
+
+ /**
+ * This should help in setting the padding of the last component down
+ */
+ @JvmStatic
+ fun doOnApplyWindowInsetsForNavigationBars(view: View, listener: OnNavigationBarInsetsAppliedListener) {
+ ViewCompat.setOnApplyWindowInsetsListener(
+ view,
+ OnApplyWindowInsetsListener { v: View?, insets: WindowInsetsCompat? ->
+ val navigationBarsInsetsBottom = insets!!.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
+ listener.onInsetsApplied(v, navigationBarsInsetsBottom)
+ insets
+ })
+ view.requestApplyInsets()
+ }
+
+
+ interface OnNavigationBarInsetsAppliedListener {
+ fun onInsetsApplied(view: View?, navigationBarHeight: Int)
+ }
+
fun isViewFullyVisibleInScroll(view: View, scrollView: NestedScrollView): Boolean {
val scrollBounds = Rect()
scrollView.getDrawingRect(scrollBounds)
diff --git a/app/src/main/res/layout/activity_principal.xml b/app/src/main/res/layout/activity_principal.xml
--- a/app/src/main/res/layout/activity_principal.xml
+++ b/app/src/main/res/layout/activity_principal.xml
@@ -4,7 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_height="match_parent">
- <LinearLayout
+ <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@@ -13,16 +13,24 @@
<include
layout="@layout/default_toobar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentEnd="true"/>
<!-- The main content view where fragments are loaded -->
<FrameLayout
android:id="@+id/mainActContentFrame"
+ android:layout_below="@id/default_toolbar"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentEnd="true"
+ />
- </LinearLayout>
+ </RelativeLayout>
<com.google.android.material.navigation.NavigationView
@@ -39,4 +47,6 @@
android:fitsSystemWindows="true"
app:menu="@menu/drawer_main" />
+
+
</androidx.drawerlayout.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -14,8 +14,19 @@
android:layout_gravity="start">
</fragment>
-->
+
+ <include
+ layout="@layout/default_toobar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentEnd="true"/>
<FrameLayout
+ android:layout_below="@id/default_toolbar"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentEnd="true"
android:id="@+id/setting_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/default_toobar.xml b/app/src/main/res/layout/default_toobar.xml
--- a/app/src/main/res/layout/default_toobar.xml
+++ b/app/src/main/res/layout/default_toobar.xml
@@ -3,15 +3,13 @@
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/default_toolbar"
+ android:layout_height="?attr/actionBarSize"
+ android:id="@+id/default_toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:background="?attr/colorPrimary"
android:fitsSystemWindows="true"
- android:minHeight="?attr/actionBarSize"
-
android:elevation="4dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
</androidx.appcompat.widget.Toolbar>
\ No newline at end of file
diff --git a/app/src/main/res/values-v35/styles.xml b/app/src/main/res/values-v35/styles.xml
new file mode 100644
--- /dev/null
+++ b/app/src/main/res/values-v35/styles.xml
@@ -0,0 +1,10 @@
+<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!
+ -->
+ <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
+
+ </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
@@ -290,8 +290,7 @@
<item>@string/positions_source_mato_descr</item>
<item>@string/positions_source_gtfsrt_descr</item>
</array>
- <string name="positions_source_mato_descr">MaTO (updated more frequently, might be offline)</string>
- <string name="positions_source_gtfsrt_descr">GTFS RT (more stable, less frequently updated)</string>
+
<string name="map_style_pref_title">Style of the map</string>
<string name="map_style_versatiles">Versatiles (vector)</string>
<string name="map_style_legacy_raster">OSM legacy (raster, lighter)</string>
diff --git a/build.gradle b/build.gradle
--- a/build.gradle
+++ b/build.gradle
@@ -9,12 +9,13 @@
}
+ //TODO: Migrate tfrom kapt to KSP
//kotlin
- ext.kotlin_version = '1.9.21'
- ext.coroutines_version = "1.8.0"
+ ext.kotlin_version = '2.1.10'
+ ext.coroutines_version = "1.10.2"
dependencies {
- classpath 'com.android.tools.build:gradle:8.5.2'
+ classpath 'com.android.tools.build:gradle:8.6.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
@@ -27,7 +28,7 @@
//libraries versions
fragment_version = "1.6.1"
activity_version = "1.7.2"
- appcompat_version = "1.6.1"
+ appcompat_version = "1.7.0"
preference_version = "1.2.1"
work_version = "2.9.0"
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 10, 12:50 (19 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1834668
Default Alt Text
D186.1775818233.diff (22 KB)
Attached To
Mode
D186: Update libraries (MQTT, Kotlin), raise SDK to android 15
Attached
Detach File
Event Timeline
Log In to Comment