diff --git a/app/build.gradle b/app/build.gradle index 3b1dd4ef..7b9bec61 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -125,6 +125,7 @@ dependencies { implementation 'com.mapzen.android:lost:3.0.2' implementation 'com.google.guava:guava:29.0-android' implementation 'com.github.pengrad:mapscaleview:1.6.0' + implementation 'com.github.romandanylyk:PageIndicatorView:b1bad589b5' // Android Auto googleImplementation 'androidx.car.app:app:1.0.0' diff --git a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt index b8a10ff5..be2a46af 100644 --- a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt +++ b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt @@ -58,6 +58,7 @@ class MapsActivity : AppCompatActivity() { setContentView(R.layout.activity_maps) navController = findNavController(R.id.nav_host_fragment) + val navGraph = navController.navInflater.inflate(R.navigation.nav_graph) appBarConfiguration = AppBarConfiguration( setOf( R.id.map, @@ -69,7 +70,7 @@ class MapsActivity : AppCompatActivity() { ) val navView = findViewById(R.id.nav_view) navView.setupWithNavController(navController) - + val header = navView.getHeaderView(0) ViewCompat.setOnApplyWindowInsetsListener(header) { v, insets -> v.setPadding(0, insets.getInsets(WindowInsetsCompat.Type.statusBars()).top, 0, 0) @@ -80,6 +81,17 @@ class MapsActivity : AppCompatActivity() { checkPlayServices(this) + + if (!prefs.welcomeDialogShown || !prefs.dataSourceSet) { + navGraph.startDestination = R.id.onboarding + navController.graph = navGraph + return + } else { + navGraph.startDestination = R.id.map + navController.graph = navGraph + } + + if (intent?.scheme == "geo") { val query = intent.data?.query?.split("=")?.get(1) val coords = getLocationFromIntent(intent) diff --git a/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt b/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt index ffa47a7d..41f7a93a 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt @@ -18,11 +18,13 @@ class DataSourceSelectDialog : AppCompatDialogFragment() { cancelEnabled: Boolean ): DataSourceSelectDialog { val dialog = DataSourceSelectDialog() - dialog.arguments = Bundle().apply { - putBoolean("cancel_enabled", cancelEnabled) - } + dialog.arguments = args(cancelEnabled) return dialog } + + fun args(cancelEnabled: Boolean) = Bundle().apply { + putBoolean("cancel_enabled", cancelEnabled) + } } override fun onCreateView( @@ -53,8 +55,8 @@ class DataSourceSelectDialog : AppCompatDialogFragment() { if (prefs.dataSourceSet) { when (prefs.dataSource) { - "goingelectric" -> binding.rbGoingElectric.isChecked = true - "openchargemap" -> binding.rbOpenChargeMap.isChecked = true + "goingelectric" -> binding.rgDataSource.rbGoingElectric.isChecked = true + "openchargemap" -> binding.rgDataSource.rbOpenChargeMap.isChecked = true } } @@ -62,9 +64,9 @@ class DataSourceSelectDialog : AppCompatDialogFragment() { dismiss() } binding.btnOK.setOnClickListener { - val result = if (binding.rbGoingElectric.isChecked) { + val result = if (binding.rgDataSource.rbGoingElectric.isChecked) { "goingelectric" - } else if (binding.rbOpenChargeMap.isChecked) { + } else if (binding.rgDataSource.rbOpenChargeMap.isChecked) { "openchargemap" } else { return@setOnClickListener diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index be772d79..773530b1 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -93,8 +93,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac private val vm: MapViewModel by viewModels(factoryProducer = { viewModelFactory { MapViewModel( - requireActivity().application, - getString(R.string.goingelectric_key) + requireActivity().application ) } }) @@ -226,21 +225,13 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac setupAdapters() (activity as? MapsActivity)?.setSupportActionBar(binding.toolbar) - val prefs = PreferenceDataSource(requireContext()) - val navController = findNavController() - if (!prefs.welcomeDialogShown) { - try { - navController.navigate(R.id.action_map_to_welcome) - } catch (ignored: IllegalArgumentException) { - // when there is already another navigation going on - } - } else if (!prefs.update060AndroidAutoDialogShown) { + /*if (!prefs.update060AndroidAutoDialogShown) { try { navController.navigate(R.id.action_map_to_update_060_androidauto) } catch (ignored: IllegalArgumentException) { // when there is already another navigation going on } - } + }*/ } override fun onResume() { diff --git a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt new file mode 100644 index 00000000..712c2abf --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt @@ -0,0 +1,144 @@ +package net.vonforst.evmap.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 +import net.vonforst.evmap.R +import net.vonforst.evmap.databinding.* +import net.vonforst.evmap.storage.PreferenceDataSource + +class OnboardingFragment : Fragment() { + private lateinit var binding: FragmentOnboardingBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentOnboardingBinding.inflate(inflater) + + val adapter = OnboardingViewPagerAdapter(this) { + if (binding.viewPager.currentItem == 2) { + findNavController().navigate(R.id.action_onboarding_to_map) + } else { + binding.viewPager.setCurrentItem(binding.viewPager.currentItem + 1, true) + } + } + binding.viewPager.adapter = adapter + binding.pageIndicatorView.count = adapter.itemCount + binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageScrollStateChanged(state: Int) { + binding.pageIndicatorView.onPageScrollStateChanged(state) + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + binding.pageIndicatorView.onPageScrolled( + position, + positionOffset, + positionOffsetPixels + ) + } + + override fun onPageSelected(position: Int) { + binding.pageIndicatorView.selection = position + } + }) + + return binding.root + } +} + +class OnboardingViewPagerAdapter(fragment: Fragment, val goToNext: () -> Unit) : + FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = 3 + + override fun createFragment(position: Int): Fragment = when (position) { + 0 -> WelcomeFragment(goToNext) + 1 -> IconsFragment(goToNext) + 2 -> DataSourceSelectFragment(goToNext) + else -> throw IllegalArgumentException() + } +} + +class WelcomeFragment(val goToNext: () -> Unit) : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val binding = FragmentOnboardingWelcomeBinding.inflate(inflater, container, false) + + binding.btnGetStarted.setOnClickListener { + goToNext() + } + + return binding.root + } +} + +class IconsFragment(val goToNext: () -> Unit) : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val binding = FragmentOnboardingIconsBinding.inflate(inflater, container, false) + + binding.btnGetStarted.setOnClickListener { + goToNext() + } + + return binding.root + } +} + +class DataSourceSelectFragment(val goToNext: () -> Unit) : Fragment() { + private lateinit var prefs: PreferenceDataSource + private lateinit var binding: FragmentOnboardingDataSourceBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentOnboardingDataSourceBinding.inflate(inflater, container, false) + prefs = PreferenceDataSource(requireContext()) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + binding.btnGetStarted.isEnabled = false + + for (rb in listOf( + binding.rgDataSource.rbGoingElectric, + binding.rgDataSource.rbOpenChargeMap + )) { + rb.setOnCheckedChangeListener { _, _ -> + binding.btnGetStarted.isEnabled = true + } + } + + binding.btnGetStarted.setOnClickListener { + val result = if (binding.rgDataSource.rbGoingElectric.isChecked) { + "goingelectric" + } else if (binding.rgDataSource.rbOpenChargeMap.isChecked) { + "openchargemap" + } else { + return@setOnClickListener + } + prefs.dataSource = result + prefs.dataSourceSet = true + prefs.welcomeDialogShown = true + goToNext() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/fragment/WelcomeDialogFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/WelcomeDialogFragment.kt deleted file mode 100644 index 14cc3a40..00000000 --- a/app/src/main/java/net/vonforst/evmap/fragment/WelcomeDialogFragment.kt +++ /dev/null @@ -1,42 +0,0 @@ -package net.vonforst.evmap.fragment - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import androidx.appcompat.app.AppCompatDialogFragment -import net.vonforst.evmap.databinding.DialogWelcomeBinding -import net.vonforst.evmap.storage.PreferenceDataSource - -class WelcomeDialogFragment : AppCompatDialogFragment() { - private lateinit var binding: DialogWelcomeBinding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - binding = DialogWelcomeBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - binding.btnOk.setOnClickListener { - val prefs = PreferenceDataSource(requireContext()) - prefs.welcomeDialogShown = true - prefs.update060AndroidAutoDialogShown = true - dismiss() - } - } - - override fun onStart() { - super.onStart() - dialog?.window?.setLayout( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.WRAP_CONTENT - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt index 8d46ac9a..bb97e680 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/MapViewModel.kt @@ -36,13 +36,12 @@ internal fun getClusterDistance(zoom: Float): Int? { } } -class MapViewModel(application: Application, geApiKey: String) : AndroidViewModel(application) { +class MapViewModel(application: Application) : AndroidViewModel(application) { val apiType: Class> get() = api.javaClass val apiName: String get() = api.getName() - // = GoingElectricApiWrapper(geApiKey, context = application) private var db = AppDatabase.getInstance(application) private var prefs = PreferenceDataSource(application) private var api: ChargepointApi = createApi(prefs.dataSource, application) diff --git a/app/src/main/res/layout/activity_maps.xml b/app/src/main/res/layout/activity_maps.xml index 7639ed81..e0809567 100644 --- a/app/src/main/res/layout/activity_maps.xml +++ b/app/src/main/res/layout/activity_maps.xml @@ -10,9 +10,7 @@ android:name="net.vonforst.evmap.navigation.NavHostFragment" android:layout_height="match_parent" android:layout_width="match_parent" - android:fitsSystemWindows="true" - app:defaultNavHost="true" - app:navGraph="@navigation/nav_graph" /> + android:fitsSystemWindows="true" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_data_source_select.xml b/app/src/main/res/layout/dialog_data_source_select.xml index 8877c87f..53749988 100644 --- a/app/src/main/res/layout/dialog_data_source_select.xml +++ b/app/src/main/res/layout/dialog_data_source_select.xml @@ -42,7 +42,7 @@ android:text="@string/ok" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/radioGroup2" /> + app:layout_constraintTop_toBottomOf="@+id/rg_data_source" />