diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index a07b73cd6..2f96e1d51 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -87,6 +87,17 @@ limitations under the License.
+
+
+
+
+
+
+
+ android:exported="true">
-
-
-
+ android:process=":crash" />
{
+ int nextItemId = viewBinding.introductionViewPager.getCurrentItem() + 1;
+ if (nextItemId < viewBinding.introductionViewPager.getAdapter().getItemCount()) {
+ viewBinding.introductionViewPager.setCurrentItem(nextItemId);
+ } else {
+ PreferencesUtils.setShowIntroduction(false);
+ startActivity(IntentUtils.newIntent(this, TrackListActivity.class));
+ finish();
+ }
+ });
+ viewBinding.introductionViewPager.setAdapter(new CustomFragmentPagerAdapter(this));
+ viewBinding.introductionViewPager.setUserInputEnabled(false);
+ }
+
+ @Override
+ protected View getRootView() {
+ viewBinding = IntroductionBinding.inflate(getLayoutInflater());
+ return viewBinding.getRoot();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ viewBinding = null;
+ }
+
+ private static class CustomFragmentPagerAdapter extends FragmentStateAdapter {
+
+ private static final List fragmentCreators = List.of(
+ (FragmentCreator) WelcomeFragment::newInstance,
+ (FragmentCreator) OSMDashboardFragment::newInstance
+ );
+
+ public CustomFragmentPagerAdapter(@NonNull FragmentActivity fa) {
+ super(fa);
+ }
+
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ FragmentCreator fc = fragmentCreators.get(position);
+ if (fc != null) {
+ return fc.newInstance();
+ }
+
+ throw new RuntimeException("There isn't Fragment associated with the position: " + position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return fragmentCreators.size();
+ }
+ }
+
+ private interface FragmentCreator {
+ Fragment newInstance();
+ }
+}
diff --git a/src/main/java/de/dennisguse/opentracks/introduction/OSMDashboardFragment.java b/src/main/java/de/dennisguse/opentracks/introduction/OSMDashboardFragment.java
new file mode 100644
index 000000000..1f2480834
--- /dev/null
+++ b/src/main/java/de/dennisguse/opentracks/introduction/OSMDashboardFragment.java
@@ -0,0 +1,32 @@
+package de.dennisguse.opentracks.introduction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import de.dennisguse.opentracks.databinding.OsmDashboardBinding;
+
+public class OSMDashboardFragment extends Fragment {
+
+ public static OSMDashboardFragment newInstance() {
+ return new OSMDashboardFragment();
+ }
+
+ private OsmDashboardBinding viewBinding;
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ viewBinding = OsmDashboardBinding.inflate(inflater, container, false);
+ return viewBinding.getRoot();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ viewBinding = null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dennisguse/opentracks/introduction/WelcomeFragment.java b/src/main/java/de/dennisguse/opentracks/introduction/WelcomeFragment.java
new file mode 100644
index 000000000..e7b904aff
--- /dev/null
+++ b/src/main/java/de/dennisguse/opentracks/introduction/WelcomeFragment.java
@@ -0,0 +1,37 @@
+package de.dennisguse.opentracks.introduction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import de.dennisguse.opentracks.databinding.WelcomeBinding;
+
+public class WelcomeFragment extends Fragment {
+
+ public static WelcomeFragment newInstance() {
+ return new WelcomeFragment();
+ }
+
+ private WelcomeBinding viewBinding;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ viewBinding = WelcomeBinding.inflate(inflater, container, false);
+ return viewBinding.getRoot();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ viewBinding = null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java
index a9f7d6ca6..c8c5fd14c 100644
--- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java
+++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java
@@ -197,6 +197,14 @@ public class PreferencesUtils {
return getBoolean(R.string.publicapi_dashboard_enabled_key, resources.getBoolean(R.bool.publicapi_dashboard_enabled_default));
}
+ public static boolean shouldShowIntroduction() {
+ return getBoolean(R.string.show_introduction_screen_key, resources.getBoolean(R.bool.show_introduction_screen_default));
+ }
+
+ public static void setShowIntroduction(boolean introduction) {
+ setBoolean(R.string.show_introduction_screen_key, introduction);
+ }
+
public static UnitSystem getUnitSystem() {
final String STATS_UNIT_DEFAULT = resources.getString(R.string.stats_units_default);
diff --git a/src/main/res/drawable/osmdashboard_ic_logo_color_24dp.xml b/src/main/res/drawable/osmdashboard_ic_logo_color_24dp.xml
new file mode 100644
index 000000000..e8b84a2cb
--- /dev/null
+++ b/src/main/res/drawable/osmdashboard_ic_logo_color_24dp.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/introduction.xml b/src/main/res/layout/introduction.xml
new file mode 100644
index 000000000..d974f6707
--- /dev/null
+++ b/src/main/res/layout/introduction.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/osm_dashboard.xml b/src/main/res/layout/osm_dashboard.xml
new file mode 100644
index 000000000..d683142df
--- /dev/null
+++ b/src/main/res/layout/osm_dashboard.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/welcome.xml b/src/main/res/layout/welcome.xml
new file mode 100644
index 000000000..884ad3e93
--- /dev/null
+++ b/src/main/res/layout/welcome.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml
index 4e31d474d..5b12fb8d1 100644
--- a/src/main/res/values/settings.xml
+++ b/src/main/res/values/settings.xml
@@ -322,6 +322,9 @@
apiDashboardEnabledKey
false
+ showIntroduction
+ true
+
nightMode
@string/night_mode_system_value
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 38f5e6bbc..cc4a03cd0 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -669,4 +669,6 @@ limitations under the License.
OpenTracks Dashboard API
No application supporting OpenTracks Dashboard API installed.
Always
+
+ OpenTracks itself does not provide a map. Please install OSMDashboard to view your recordings on a map.