Skip to content
Snippets Groups Projects
Unverified Commit e3da2717 authored by axelherbstreith's avatar axelherbstreith Committed by GitHub
Browse files

Show onboarding screen only once (EXPOSUREAPP-4367) (#1931)


* Added sharedPrefs

* Enabled dynamic change of inital fragment

* sourcecheck clean

* inject Diarysettings

* Update Navigation flow

* Added onboarding reset when resetting the application

* clean

* Changed package name

* Updated imports

Co-authored-by: default avatarBMItter <berndus@gmx.de>
parent 24b07657
No related branches found
No related tags found
No related merge requests found
...@@ -6,6 +6,7 @@ import android.os.Bundle ...@@ -6,6 +6,7 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.navigation.fragment.NavHostFragment
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
...@@ -23,6 +24,7 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector { ...@@ -23,6 +24,7 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
} }
} }
@Inject lateinit var settings: ContactDiarySettings
@Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any> @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> = dispatchingAndroidInjector override fun androidInjector(): AndroidInjector<Any> = dispatchingAndroidInjector
...@@ -33,6 +35,20 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector { ...@@ -33,6 +35,20 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
AppInjector.setup(this) AppInjector.setup(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.contact_diary_activity) setContentView(R.layout.contact_diary_activity)
val navHost = supportFragmentManager.findFragmentById(R.id.contact_diary_fragment_container) as NavHostFragment?
val navController = navHost!!.navController
val navInflater = navController.navInflater
val graph = navInflater.inflate(R.navigation.contact_diary_nav_graph)
if (settings.isOnboarded.value) {
graph.startDestination = R.id.contactDiaryOverviewFragment
} else {
graph.startDestination = R.id.contactDiaryOnboardingFragment
}
navController.graph = graph
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
......
package de.rki.coronawarnapp.contactdiary.ui
import android.content.Context
import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.preferences.clearAndNotify
import de.rki.coronawarnapp.util.preferences.createFlowPreference
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class ContactDiarySettings @Inject constructor(
@AppContext val context: Context
) {
private val prefs by lazy {
context.getSharedPreferences("contact_diary_localdata", Context.MODE_PRIVATE)
}
val isOnboarded = prefs.createFlowPreference(
key = "contact_diary_onboarded",
defaultValue = false
)
fun clear() {
prefs.clearAndNotify()
}
}
...@@ -5,6 +5,7 @@ import android.view.View ...@@ -5,6 +5,7 @@ import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryActivity import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryActivity
import de.rki.coronawarnapp.contactdiary.ui.ContactDiarySettings
import de.rki.coronawarnapp.databinding.ContactDiaryOnboardingFragmentBinding import de.rki.coronawarnapp.databinding.ContactDiaryOnboardingFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.doNavigate
...@@ -17,6 +18,9 @@ import javax.inject.Inject ...@@ -17,6 +18,9 @@ import javax.inject.Inject
class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboarding_fragment), AutoInject { class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboarding_fragment), AutoInject {
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
@Inject lateinit var settings: ContactDiarySettings
private val vm: ContactDiaryOnboardingFragmentViewModel by cwaViewModels { viewModelFactory } private val vm: ContactDiaryOnboardingFragmentViewModel by cwaViewModels { viewModelFactory }
private val binding: ContactDiaryOnboardingFragmentBinding by viewBindingLazy() private val binding: ContactDiaryOnboardingFragmentBinding by viewBindingLazy()
...@@ -52,6 +56,9 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin ...@@ -52,6 +56,9 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin
} }
ContactDiaryOnboardingNavigationEvents.NavigateToOverviewFragment -> { ContactDiaryOnboardingNavigationEvents.NavigateToOverviewFragment -> {
onboardingComplete()
doNavigate( doNavigate(
ContactDiaryOnboardingFragmentDirections ContactDiaryOnboardingFragmentDirections
.actionContactDiaryOnboardingFragmentToContactDiaryOverviewFragment() .actionContactDiaryOnboardingFragmentToContactDiaryOverviewFragment()
...@@ -60,4 +67,8 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin ...@@ -60,4 +67,8 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin
} }
} }
} }
fun onboardingComplete() {
settings.isOnboarded.update { true }
}
} }
...@@ -23,6 +23,7 @@ import android.annotation.SuppressLint ...@@ -23,6 +23,7 @@ import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase
import de.rki.coronawarnapp.contactdiary.ui.ContactDiarySettings
import de.rki.coronawarnapp.diagnosiskeys.download.DownloadDiagnosisKeysSettings import de.rki.coronawarnapp.diagnosiskeys.download.DownloadDiagnosisKeysSettings
import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository
import de.rki.coronawarnapp.nearby.modules.detectiontracker.ExposureDetectionTracker import de.rki.coronawarnapp.nearby.modules.detectiontracker.ExposureDetectionTracker
...@@ -30,7 +31,6 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage ...@@ -30,7 +31,6 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage
import de.rki.coronawarnapp.storage.AppDatabase import de.rki.coronawarnapp.storage.AppDatabase
import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.SubmissionRepository import de.rki.coronawarnapp.storage.SubmissionRepository
import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository
import de.rki.coronawarnapp.util.di.AppContext import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.security.SecurityHelper import de.rki.coronawarnapp.util.security.SecurityHelper
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
...@@ -47,12 +47,12 @@ class DataReset @Inject constructor( ...@@ -47,12 +47,12 @@ class DataReset @Inject constructor(
@AppContext private val context: Context, @AppContext private val context: Context,
private val keyCacheRepository: KeyCacheRepository, private val keyCacheRepository: KeyCacheRepository,
private val appConfigProvider: AppConfigProvider, private val appConfigProvider: AppConfigProvider,
private val interoperabilityRepository: InteroperabilityRepository,
private val submissionRepository: SubmissionRepository, private val submissionRepository: SubmissionRepository,
private val exposureDetectionTracker: ExposureDetectionTracker, private val exposureDetectionTracker: ExposureDetectionTracker,
private val downloadDiagnosisKeysSettings: DownloadDiagnosisKeysSettings, private val downloadDiagnosisKeysSettings: DownloadDiagnosisKeysSettings,
private val riskLevelStorage: RiskLevelStorage, private val riskLevelStorage: RiskLevelStorage,
private val contactDiaryDatabase: ContactDiaryDatabase private val contactDiaryDatabase: ContactDiaryDatabase,
private var contactDiarySettings: ContactDiarySettings
) { ) {
private val mutex = Mutex() private val mutex = Mutex()
...@@ -78,6 +78,7 @@ class DataReset @Inject constructor( ...@@ -78,6 +78,7 @@ class DataReset @Inject constructor(
exposureDetectionTracker.clear() exposureDetectionTracker.clear()
downloadDiagnosisKeysSettings.clear() downloadDiagnosisKeysSettings.clear()
riskLevelStorage.clear() riskLevelStorage.clear()
contactDiarySettings.clear()
// Clear contact diary database // Clear contact diary database
contactDiaryDatabase.clearAllTables() contactDiaryDatabase.clearAllTables()
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
android:name="androidx.navigation.fragment.NavHostFragment" android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:defaultNavHost="true" app:defaultNavHost="true" />
app:navGraph="@navigation/contact_diary_nav_graph" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation"> <resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation">
<!-- #################################### <!-- ####################################
Contact Diary Contact Diary
###################################### --> ###################################### -->
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation"> <resources xmlns:tools="http://schemas.android.com/tools" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" tools:ignore="MissingTranslation">
<!-- #################################### <!-- ####################################
Contact Diary Contact Diary
###################################### --> ###################################### -->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment