From e3da2717a7c679df389378adb13817c76d571809 Mon Sep 17 00:00:00 2001
From: axelherbstreith <75120552+axelherbstreith@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:25:20 +0100
Subject: [PATCH] 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: BMItter <berndus@gmx.de>
---
 .../contactdiary/ui/ContactDiaryActivity.kt   | 16 ++++++++++
 .../contactdiary/ui/ContactDiarySettings.kt   | 29 +++++++++++++++++++
 .../ContactDiaryOnboardingFragment.kt         | 11 +++++++
 .../de/rki/coronawarnapp/util/DataReset.kt    |  7 +++--
 .../res/layout/contact_diary_activity.xml     |  3 +-
 .../res/values-de/contact_diary_strings.xml   |  1 +
 .../main/res/values/contact_diary_strings.xml |  1 +
 7 files changed, 63 insertions(+), 5 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt
index e0a8f63cc..189cdf62a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt
@@ -6,6 +6,7 @@ import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
+import androidx.navigation.fragment.NavHostFragment
 import dagger.android.AndroidInjector
 import dagger.android.DispatchingAndroidInjector
 import dagger.android.HasAndroidInjector
@@ -23,6 +24,7 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
         }
     }
 
+    @Inject lateinit var settings: ContactDiarySettings
     @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
     override fun androidInjector(): AndroidInjector<Any> = dispatchingAndroidInjector
 
@@ -33,6 +35,20 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
         AppInjector.setup(this)
         super.onCreate(savedInstanceState)
         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?) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt
new file mode 100644
index 000000000..730b20bf1
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt
@@ -0,0 +1,29 @@
+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()
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/onboarding/ContactDiaryOnboardingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/onboarding/ContactDiaryOnboardingFragment.kt
index 47e022c42..a144e4f56 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/onboarding/ContactDiaryOnboardingFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/onboarding/ContactDiaryOnboardingFragment.kt
@@ -5,6 +5,7 @@ import android.view.View
 import androidx.fragment.app.Fragment
 import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryActivity
+import de.rki.coronawarnapp.contactdiary.ui.ContactDiarySettings
 import de.rki.coronawarnapp.databinding.ContactDiaryOnboardingFragmentBinding
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.ui.doNavigate
@@ -17,6 +18,9 @@ import javax.inject.Inject
 class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboarding_fragment), AutoInject {
 
     @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
+
+    @Inject lateinit var settings: ContactDiarySettings
+
     private val vm: ContactDiaryOnboardingFragmentViewModel by cwaViewModels { viewModelFactory }
     private val binding: ContactDiaryOnboardingFragmentBinding by viewBindingLazy()
 
@@ -52,6 +56,9 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin
                 }
 
                 ContactDiaryOnboardingNavigationEvents.NavigateToOverviewFragment -> {
+
+                    onboardingComplete()
+
                     doNavigate(
                         ContactDiaryOnboardingFragmentDirections
                             .actionContactDiaryOnboardingFragmentToContactDiaryOverviewFragment()
@@ -60,4 +67,8 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin
             }
         }
     }
+
+    fun onboardingComplete() {
+        settings.isOnboarded.update { true }
+    }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt
index 8d3a150c7..318368ebf 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt
@@ -23,6 +23,7 @@ import android.annotation.SuppressLint
 import android.content.Context
 import de.rki.coronawarnapp.appconfig.AppConfigProvider
 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.storage.KeyCacheRepository
 import de.rki.coronawarnapp.nearby.modules.detectiontracker.ExposureDetectionTracker
@@ -30,7 +31,6 @@ import de.rki.coronawarnapp.risk.storage.RiskLevelStorage
 import de.rki.coronawarnapp.storage.AppDatabase
 import de.rki.coronawarnapp.storage.LocalData
 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.security.SecurityHelper
 import kotlinx.coroutines.sync.Mutex
@@ -47,12 +47,12 @@ class DataReset @Inject constructor(
     @AppContext private val context: Context,
     private val keyCacheRepository: KeyCacheRepository,
     private val appConfigProvider: AppConfigProvider,
-    private val interoperabilityRepository: InteroperabilityRepository,
     private val submissionRepository: SubmissionRepository,
     private val exposureDetectionTracker: ExposureDetectionTracker,
     private val downloadDiagnosisKeysSettings: DownloadDiagnosisKeysSettings,
     private val riskLevelStorage: RiskLevelStorage,
-    private val contactDiaryDatabase: ContactDiaryDatabase
+    private val contactDiaryDatabase: ContactDiaryDatabase,
+    private var contactDiarySettings: ContactDiarySettings
 ) {
 
     private val mutex = Mutex()
@@ -78,6 +78,7 @@ class DataReset @Inject constructor(
         exposureDetectionTracker.clear()
         downloadDiagnosisKeysSettings.clear()
         riskLevelStorage.clear()
+        contactDiarySettings.clear()
 
         // Clear contact diary database
         contactDiaryDatabase.clearAllTables()
diff --git a/Corona-Warn-App/src/main/res/layout/contact_diary_activity.xml b/Corona-Warn-App/src/main/res/layout/contact_diary_activity.xml
index f105f4d50..7d2465983 100644
--- a/Corona-Warn-App/src/main/res/layout/contact_diary_activity.xml
+++ b/Corona-Warn-App/src/main/res/layout/contact_diary_activity.xml
@@ -11,7 +11,6 @@
         android:name="androidx.navigation.fragment.NavHostFragment"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        app:defaultNavHost="true"
-        app:navGraph="@navigation/contact_diary_nav_graph" />
+        app:defaultNavHost="true" />
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/Corona-Warn-App/src/main/res/values-de/contact_diary_strings.xml b/Corona-Warn-App/src/main/res/values-de/contact_diary_strings.xml
index 652da189c..29be5afee 100644
--- a/Corona-Warn-App/src/main/res/values-de/contact_diary_strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/contact_diary_strings.xml
@@ -1,5 +1,6 @@
 <?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">
+
     <!-- ####################################
                 Contact Diary
     ###################################### -->
diff --git a/Corona-Warn-App/src/main/res/values/contact_diary_strings.xml b/Corona-Warn-App/src/main/res/values/contact_diary_strings.xml
index e64b0e7da..3ada5e70f 100644
--- a/Corona-Warn-App/src/main/res/values/contact_diary_strings.xml
+++ b/Corona-Warn-App/src/main/res/values/contact_diary_strings.xml
@@ -1,5 +1,6 @@
 <?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">
+
     <!-- ####################################
                Contact Diary
    ###################################### -->
-- 
GitLab