diff --git a/app/build.gradle b/app/build.gradle index 156a1f7..5acfe20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { defaultConfig { applicationId "it.danieleverducci.nextcloudmaps" minSdkVersion 23 - targetSdkVersion 34 + targetSdkVersion 36 compileSdkVersion 34 versionCode 9 versionName "0.4.0" diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/NextcloudMapsStyledActivity.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/NextcloudMapsStyledActivity.java index f5b6a0a..fcc4307 100644 --- a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/NextcloudMapsStyledActivity.java +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/NextcloudMapsStyledActivity.java @@ -9,6 +9,8 @@ import androidx.appcompat.app.AppCompatActivity; import org.osmdroid.views.overlay.TilesOverlay; +import it.danieleverducci.nextcloudmaps.utils.EdgeToEdgeUtils; + public class NextcloudMapsStyledActivity extends AppCompatActivity { @Override diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/about/AboutActivity.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/about/AboutActivity.java index e157b74..09a23ba 100644 --- a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/about/AboutActivity.java +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/about/AboutActivity.java @@ -31,12 +31,14 @@ import androidx.appcompat.widget.Toolbar; import it.danieleverducci.nextcloudmaps.BuildConfig; import it.danieleverducci.nextcloudmaps.R; import it.danieleverducci.nextcloudmaps.activity.NextcloudMapsStyledActivity; +import it.danieleverducci.nextcloudmaps.utils.EdgeToEdgeUtils; public class AboutActivity extends NextcloudMapsStyledActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); + EdgeToEdgeUtils.clearSystemInsets(this); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/main/MainActivity.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/main/MainActivity.java index ff89b8e..5b63e2f 100644 --- a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/main/MainActivity.java +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/main/MainActivity.java @@ -49,6 +49,7 @@ import it.danieleverducci.nextcloudmaps.api.ApiProvider; import it.danieleverducci.nextcloudmaps.fragments.GeofavoriteListFragment; import it.danieleverducci.nextcloudmaps.fragments.GeofavoriteMapFragment; import it.danieleverducci.nextcloudmaps.repository.GeofavoriteRepository; +import it.danieleverducci.nextcloudmaps.utils.EdgeToEdgeUtils; import it.danieleverducci.nextcloudmaps.utils.SettingsManager; public class MainActivity extends NextcloudMapsStyledActivity { @@ -118,6 +119,7 @@ public class MainActivity extends NextcloudMapsStyledActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + EdgeToEdgeUtils.clearSystemInsets(this); boolean showMap = SettingsManager.isGeofavoriteListShownAsMap(this); if (showMap) diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/mappicker/MapPickerActivity.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/mappicker/MapPickerActivity.java index 821ac31..71fcc12 100644 --- a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/mappicker/MapPickerActivity.java +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/mappicker/MapPickerActivity.java @@ -32,6 +32,7 @@ import it.danieleverducci.nextcloudmaps.R; import it.danieleverducci.nextcloudmaps.activity.NextcloudMapsStyledActivity; import it.danieleverducci.nextcloudmaps.activity.detail.GeofavoriteDetailActivity; import it.danieleverducci.nextcloudmaps.databinding.ActivityMapPickerBinding; +import it.danieleverducci.nextcloudmaps.utils.EdgeToEdgeUtils; import it.danieleverducci.nextcloudmaps.utils.GeoUriParser; import it.danieleverducci.nextcloudmaps.utils.MapUtils; @@ -70,6 +71,7 @@ public class MapPickerActivity extends NextcloudMapsStyledActivity { mViewHolder.centerMapOn(l.getLatitude(), l.getLongitude()); setContentView(mViewHolder.getRootView()); + EdgeToEdgeUtils.clearSystemInsets(this); } /** diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/settings/SettingsActivity.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/settings/SettingsActivity.java index 93068de..0db81e2 100644 --- a/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/settings/SettingsActivity.java +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/activity/settings/SettingsActivity.java @@ -25,6 +25,7 @@ import androidx.appcompat.widget.Toolbar; import it.danieleverducci.nextcloudmaps.R; import it.danieleverducci.nextcloudmaps.activity.NextcloudMapsStyledActivity; +import it.danieleverducci.nextcloudmaps.utils.EdgeToEdgeUtils; import it.danieleverducci.nextcloudmaps.utils.SettingsManager; public class SettingsActivity extends NextcloudMapsStyledActivity { @@ -32,6 +33,7 @@ public class SettingsActivity extends NextcloudMapsStyledActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); + EdgeToEdgeUtils.clearSystemInsets(this); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); diff --git a/app/src/main/java/it/danieleverducci/nextcloudmaps/utils/EdgeToEdgeUtils.java b/app/src/main/java/it/danieleverducci/nextcloudmaps/utils/EdgeToEdgeUtils.java new file mode 100644 index 0000000..a1f99d0 --- /dev/null +++ b/app/src/main/java/it/danieleverducci/nextcloudmaps/utils/EdgeToEdgeUtils.java @@ -0,0 +1,50 @@ +package it.danieleverducci.nextcloudmaps.utils; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; + +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; + +import it.danieleverducci.nextcloudmaps.R; + +public class EdgeToEdgeUtils { + + /** + * Called in an activity's onCreate method, adds paddings to clear the system bars, in any orientation, + * to make all the content visible. Useful to adapt an old android project to the mandatory introduction + * of edge to edge in Android 15. + * @param a the activity to pad + */ + public static void clearSystemInsets(Activity a) { + // This color will be used as background in the system bars in case of edge to edge. + // Defaults to R.color.colorAccent, if defined, black otherwise. + int accentColor = ContextCompat.getColor(a, R.color.defaultBackground); + + ViewGroup rootLayout = a.findViewById(android.R.id.content); + rootLayout.setBackgroundColor(accentColor); + + // Register to receive insets callbacks + ViewCompat.setOnApplyWindowInsetsListener(rootLayout, (v, insets) -> { + // Top padding is the device insets plus the actionbar height + boolean hasActionBar = a.getActionBar() != null && a.getActionBar().isShowing(); + int actionbarHeightInPixels = 0; + if (hasActionBar && Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + Context context = rootLayout.getContext(); + TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) + actionbarHeightInPixels = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); + } + int topPadding = insets.getStableInsetTop() + actionbarHeightInPixels; + v.setPadding(insets.getStableInsetLeft(), topPadding, insets.getStableInsetRight(), insets.getStableInsetBottom()); + return insets; + }); + } +} +