From 33a202ca72d16bc6078df6284de32a5ba59b7601 Mon Sep 17 00:00:00 2001 From: Gerhard Olsson Date: Wed, 16 Oct 2024 23:45:39 +0200 Subject: [PATCH 1/3] feat: Target Android 15.0/SDK 35 bump version Update lint suppressions --- ANT-Android-SDKs | 2 +- app/build.gradle | 19 ++++++++++++------- app/lint-baseline.xml | 13 ++++++++++++- app/src/main/AndroidManifest.xml | 3 ++- .../dialogs/LapSummaryDialog.java | 1 + build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/ANT-Android-SDKs b/ANT-Android-SDKs index 9320023..0e8cea7 160000 --- a/ANT-Android-SDKs +++ b/ANT-Android-SDKs @@ -1 +1 @@ -Subproject commit 9320023db361a6140168aede685279be1dee2ce2 +Subproject commit 0e8cea714a231fb9565170d4ed01eafa868f9798 diff --git a/app/build.gradle b/app/build.gradle index 174f46b..54670fd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,13 +6,18 @@ def getGitHash = providers.exec { android { // Travis update separately - compileSdkVersion = 34 - buildToolsVersion = '35.0.0' + compileSdkVersion = 35 + buildToolsVersion = '36.0.0' namespace "com.atrainingtracker" + compileOptions { + sourceCompatibility JavaVersion.toVersion("17") + targetCompatibility JavaVersion.toVersion("17") + } + defaultConfig { minSdkVersion 26 // Android 8 - targetSdkVersion 34 // Android 14 + targetSdkVersion 35 // Android 15 multiDexEnabled true versionName "4.2.99.1" versionCode 217 @@ -73,14 +78,14 @@ dependencies { implementation 'androidx.preference:preference:1.2.1' implementation 'androidx.appcompat:appcompat:1.7.0' - implementation 'androidx.work:work-runtime:2.9.0' - implementation 'androidx.activity:activity:1.9.1' + implementation 'androidx.work:work-runtime:2.10.1' + implementation 'androidx.activity:activity:1.10.1' implementation 'com.google.android.material:material:1.12.0' - implementation 'com.google.android.gms:play-services-maps:19.0.0' + implementation 'com.google.android.gms:play-services-maps:19.2.0' implementation 'com.google.android.gms:play-services-location:21.3.0' - implementation platform('com.google.firebase:firebase-bom:33.1.2') + implementation platform('com.google.firebase:firebase-bom:33.14.0') implementation 'com.google.firebase:firebase-analytics' // No version needed with BOM implementation 'com.dropbox.core:dropbox-core-sdk:7.0.0' diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index d32931c..2d407b2 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -1,5 +1,5 @@ - + + + + + - + Date: Fri, 30 May 2025 23:39:46 +0200 Subject: [PATCH 2/3] fix: Android 15 edge-to-edge Mostly adding insets so it is similar as before --- .../activities/ConfigViewsActivity.java | 24 +++++++++++ .../MainActivityWithNavigation.java | 21 ++++++++++ .../activities/SegmentDetailsActivity.java | 22 ++++++++++ .../activities/WorkoutDetailsActivity.java | 22 ++++++++++ .../fragments/EditWorkoutFragment.java | 40 +++++++++++++++++-- app/src/main/res/layout/edit_workout.xml | 1 + .../main_activity_without_navigation.xml | 1 + 7 files changed, 128 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/ConfigViewsActivity.java b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/ConfigViewsActivity.java index 3ed3ad7..0002689 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/ConfigViewsActivity.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/ConfigViewsActivity.java @@ -18,14 +18,22 @@ package com.atrainingtracker.trainingtracker.activities; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; + +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import android.util.Log; +import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; import com.atrainingtracker.R; @@ -81,6 +89,22 @@ protected void onCreate(Bundle savedInstanceState) { // supportAB.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha); // supportAB.setDisplayHomeAsUpEnabled(true); + View rootView = findViewById(R.id.main_activity_without_navigation_layout); + + ViewCompat.setOnApplyWindowInsetsListener( + rootView, + new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets( + @NonNull View v, @NonNull WindowInsetsCompat windowInsets) { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(insets.left, 0, insets.right, insets.bottom); + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.topMargin = insets.top; + return WindowInsetsCompat.CONSUMED; + } + }); showMainFragment(); } diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/MainActivityWithNavigation.java b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/MainActivityWithNavigation.java index a6dcfd0..76dc856 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/MainActivityWithNavigation.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/MainActivityWithNavigation.java @@ -21,6 +21,7 @@ import android.Manifest; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import android.annotation.SuppressLint; @@ -45,6 +46,10 @@ import com.google.android.material.navigation.NavigationView; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.core.view.GravityCompat; @@ -61,6 +66,8 @@ import android.provider.Settings; import android.util.Log; import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; @@ -321,6 +328,20 @@ protected void onCreate(Bundle savedInstanceState) { dialog.show(); } } + ViewCompat.setOnApplyWindowInsetsListener( + mDrawerLayout, + new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets( + @NonNull View v, @NonNull WindowInsetsCompat windowInsets) { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(insets.left, 0, insets.right, insets.bottom); + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.topMargin = insets.top; + return WindowInsetsCompat.CONSUMED; + } + }); getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/SegmentDetailsActivity.java b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/SegmentDetailsActivity.java index 82b54c0..4ba53de 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/SegmentDetailsActivity.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/SegmentDetailsActivity.java @@ -25,6 +25,11 @@ import com.google.android.material.navigation.NavigationView; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.core.view.GravityCompat; @@ -35,6 +40,8 @@ import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; import com.atrainingtracker.R; @@ -121,6 +128,21 @@ public void onCreate(Bundle savedInstanceState) { // now, create and show the main fragment onNavigationItemSelected(mNavigationView.getMenu().findItem(mSelectedFragmentId)); + ViewCompat.setOnApplyWindowInsetsListener( + mDrawerLayout, + new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets( + @NonNull View v, @NonNull WindowInsetsCompat windowInsets) { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(insets.left, 0, insets.right, insets.bottom); + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.topMargin = insets.top; + return WindowInsetsCompat.CONSUMED; + } + }); + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/WorkoutDetailsActivity.java b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/WorkoutDetailsActivity.java index 440fd4a..f522b81 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/activities/WorkoutDetailsActivity.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/activities/WorkoutDetailsActivity.java @@ -27,7 +27,12 @@ import com.google.android.material.navigation.NavigationView; import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.core.view.GravityCompat; @@ -39,6 +44,7 @@ import android.util.Log; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; import com.atrainingtracker.R; @@ -141,6 +147,22 @@ public void onCreate(Bundle savedInstanceState) { // now, calc the extrema values in the background (new CalcExtremaValuesThread(this, findViewById(R.id.tvProgressMessage), mWorkoutID)).start(); } + // knappar beskärda + + ViewCompat.setOnApplyWindowInsetsListener( + mDrawerLayout, + new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets( + @NonNull View v, @NonNull WindowInsetsCompat windowInsets) { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(insets.left, 0, insets.right, insets.bottom); + ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); + mlp.topMargin = insets.top; + return windowInsets; + } + }); getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java b/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java index 5da83b1..76fe01b 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java @@ -19,6 +19,9 @@ package com.atrainingtracker.trainingtracker.fragments; import android.app.Activity; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; @@ -32,6 +35,10 @@ import android.os.Bundle; import androidx.core.content.ContextCompat; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkManager; @@ -396,15 +403,42 @@ public void onClick(View v) { } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (DEBUG) Log.d(TAG, "onActivityCreated"); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (DEBUG) Log.d(TAG, "onViewCreated"); // register receivers ContextCompat.registerReceiver(getActivity(), mFinishedCalculatingExtremaValueReceiver, mFinishedCalculatingExtremaValueFilter, ContextCompat.RECEIVER_NOT_EXPORTED); ContextCompat.registerReceiver(getActivity(), mFinishedGuessingCommuteAndTrainerReceiver, mFinishedGuessingCommuteAndTrainerFilter, ContextCompat.RECEIVER_NOT_EXPORTED); ContextCompat.registerReceiver(getActivity(), mFinishedCalculatingFancyNameReceiver, mFinishedCalculatingFancyNameFilter, ContextCompat.RECEIVER_NOT_EXPORTED); + ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() { + @NonNull + @Override + public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowInsetsCompat windowInsets) { + Insets navBarInsets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()); + Insets imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime()); + int bottomPadding = navBarInsets.bottom + imeInsets.bottom; + v.setPadding( + v.getPaddingLeft(), + v.getPaddingTop(), + v.getPaddingRight(), + bottomPadding + ); + Insets systemGestureInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemGestures()); + return WindowInsetsCompat.CONSUMED; + } + }); + + // Request initial insets apply in case the listener was set up after the first dispatch + // (though with setOnApplyWindowInsetsListener, it usually gets called immediately if insets are available) + ViewCompat.requestApplyInsets(view); + // register receivers (moved from onActivityCreated for modern Fragment lifecycle) + if (getActivity() != null) { + ContextCompat.registerReceiver(getActivity(), mFinishedCalculatingExtremaValueReceiver, mFinishedCalculatingExtremaValueFilter, ContextCompat.RECEIVER_NOT_EXPORTED); + ContextCompat.registerReceiver(getActivity(), mFinishedGuessingCommuteAndTrainerReceiver, mFinishedGuessingCommuteAndTrainerFilter, ContextCompat.RECEIVER_NOT_EXPORTED); + ContextCompat.registerReceiver(getActivity(), mFinishedCalculatingFancyNameReceiver, mFinishedCalculatingFancyNameFilter, ContextCompat.RECEIVER_NOT_EXPORTED); + } // fill the views // first, remove all TODO: still necessary? diff --git a/app/src/main/res/layout/edit_workout.xml b/app/src/main/res/layout/edit_workout.xml index 9690f4d..0b15542 100644 --- a/app/src/main/res/layout/edit_workout.xml +++ b/app/src/main/res/layout/edit_workout.xml @@ -18,6 +18,7 @@ --> diff --git a/app/src/main/res/layout/main_activity_without_navigation.xml b/app/src/main/res/layout/main_activity_without_navigation.xml index a9c0dc7..616b77d 100644 --- a/app/src/main/res/layout/main_activity_without_navigation.xml +++ b/app/src/main/res/layout/main_activity_without_navigation.xml @@ -19,6 +19,7 @@ From 49fd49a12aaa0f064c723d7be83380ccfaa7fdd8 Mon Sep 17 00:00:00 2001 From: Gerhard Olsson Date: Sat, 31 May 2025 22:25:51 +0200 Subject: [PATCH 3/3] fix: onBack for pairing Regression from a previous change --- .../RemoteDevicesFragmentTabbedContainer.java | 30 ++----------------- .../fragments/EditWorkoutFragment.java | 2 +- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/atrainingtracker/banalservice/fragments/RemoteDevicesFragmentTabbedContainer.java b/app/src/main/java/com/atrainingtracker/banalservice/fragments/RemoteDevicesFragmentTabbedContainer.java index 5841168..09e5e45 100644 --- a/app/src/main/java/com/atrainingtracker/banalservice/fragments/RemoteDevicesFragmentTabbedContainer.java +++ b/app/src/main/java/com/atrainingtracker/banalservice/fragments/RemoteDevicesFragmentTabbedContainer.java @@ -139,26 +139,11 @@ public void onResume() { mShowingDialog = true; AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext()); dialogBuilder.setIcon(mProtocol.getIconId()); - requireActivity().getOnBackPressedDispatcher().addCallback(this, - new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - if (mShowingDialog && isEnabled()) { - cancelDialog(dialogBuilder.create()); - requireActivity().finish(); - } - } - } - ); - - dialogBuilder.setCancelable(false); dialogBuilder.setTitle(R.string.select_device_type); - dialogBuilder.setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - cancelDialog(dialog); - } + dialogBuilder.setNegativeButton(R.string.Cancel, (dialog, which) -> { + dialog.dismiss(); + mShowingDialog = false; }); final ArrayList deviceTypeList = new ArrayList<>(Arrays.asList(DeviceType.getRemoteDeviceTypes(mProtocol))); @@ -228,15 +213,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return false; } - - private void cancelDialog(DialogInterface dialog) { - dialog.dismiss(); - if (getActivity() != null) { - getActivity().onBackPressed(); - } - mShowingDialog = false; - } - protected void setSectionsPagerAdapter() { if (DEBUG) Log.w(TAG, "setSectionsPagerAdapter"); diff --git a/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java b/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java index 76fe01b..4ff3338 100644 --- a/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java +++ b/app/src/main/java/com/atrainingtracker/trainingtracker/fragments/EditWorkoutFragment.java @@ -381,7 +381,7 @@ public void onClick(View view) { getActivity().setResult(Activity.RESULT_CANCELED, resultIntent); } - getActivity().onBackPressed(); + getActivity().getOnBackPressedDispatcher().onBackPressed(); } });