Implement introduction screen.

Fixes #1316.
This commit is contained in:
Dennis Guse
2022-07-10 21:44:16 +02:00
parent 8389f9150a
commit 85a73c3c85
13 changed files with 303 additions and 9 deletions
@@ -33,4 +33,10 @@ public class AboutActivity extends AbstractActivity {
viewBinding = AboutBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}
@Override
protected void onDestroy() {
super.onDestroy();
viewBinding = null;
}
}
@@ -159,8 +159,6 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
@Override
protected void onCreate(Bundle savedInstanceState) {
SplashScreen.installSplashScreen(this);
super.onCreate(savedInstanceState);
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
@@ -0,0 +1,93 @@
package de.dennisguse.opentracks.introduction;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.splashscreen.SplashScreen;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import java.util.List;
import de.dennisguse.opentracks.AbstractActivity;
import de.dennisguse.opentracks.TrackListActivity;
import de.dennisguse.opentracks.databinding.IntroductionBinding;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.IntentUtils;
public class IntroductionActivity extends AbstractActivity {
private IntroductionBinding viewBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
SplashScreen.installSplashScreen(this);
super.onCreate(savedInstanceState);
if (!PreferencesUtils.shouldShowIntroduction()) {
startActivity(new Intent(this, TrackListActivity.class));
finish();
}
viewBinding.nextButton.setOnClickListener(v -> {
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<FragmentCreator> 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();
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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);