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.