create a new onboarding flow including the API selection

This commit is contained in:
johan12345
2021-07-09 00:11:38 +02:00
parent 32681f6ea8
commit 31d969e071
20 changed files with 3948 additions and 328 deletions

View File

@@ -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<NavigationView>(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)

View File

@@ -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

View File

@@ -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() {

View File

@@ -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()
}
}
}

View File

@@ -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
)
}
}

View File

@@ -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<ChargepointApi<ReferenceData>>
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<ReferenceData> = createApi(prefs.dataSource, application)