Skip to content

Commit 546bbe4

Browse files
EKIRJASTO-208 Suggest creating passkey on login (#196)
* Add new tips files * Add new event * Move tips handling to main fragment Remove the handling from account fragment, instead handle launching tips in main fragment. Handle the shared preference changes from main activity, though the value is now also checked in main fragment.
1 parent f8e7a9e commit 546bbe4

File tree

11 files changed

+190
-3
lines changed

11 files changed

+190
-3
lines changed

simplified-main/src/main/java/org/librarysimplified/main/AppCache.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AppCache internal constructor(private val sharedPreferences: SharedPrefere
1717
* SharedPreferences keys
1818
*/
1919
private const val KEY_SEEN_TUTORIAL = "seen_tutorial"
20-
20+
private const val KEY_SEEN_TIPS = "seen_tips"
2121
}
2222

2323
/**
@@ -33,4 +33,19 @@ class AppCache internal constructor(private val sharedPreferences: SharedPrefere
3333
fun isTutorialSeen(): Boolean {
3434
return sharedPreferences.getBoolean(KEY_SEEN_TUTORIAL, false)
3535
}
36+
37+
/**
38+
* Set the tips as dismissed
39+
*/
40+
fun setTipsDismissed(dismissed: Boolean) {
41+
sharedPreferences.edit().putBoolean(KEY_SEEN_TIPS, dismissed).apply()
42+
}
43+
44+
/**
45+
* Checks if the tips are dismissed
46+
*/
47+
fun isTipsDismissed(): Boolean {
48+
return sharedPreferences.getBoolean(KEY_SEEN_TIPS, false)
49+
}
50+
3651
}

simplified-main/src/main/java/org/librarysimplified/main/MainActivity.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import org.nypl.simplified.profiles.controller.api.ProfileAccountLoginRequest.OA
4545
import org.nypl.simplified.profiles.controller.api.ProfilesControllerType
4646
import org.nypl.simplified.taskrecorder.api.TaskResult
4747
import org.nypl.simplified.ui.accounts.ekirjasto.TextSizeEvent
48+
import org.nypl.simplified.ui.announcements.TipsEvent
4849
import org.nypl.simplified.ui.branding.BrandingSplashServiceType
4950
import org.slf4j.LoggerFactory
5051
import java.net.URI
@@ -352,6 +353,10 @@ class MainActivity : AppCompatActivity(R.layout.main_host) {
352353

353354
is MainActivityListenedEvent.TextSizeEvent ->
354355
this.setFontSize(event.event)
356+
357+
is MainActivityListenedEvent.TipsEvent -> {
358+
this.handleTipsEvent(event.event)
359+
}
355360
}
356361
}
357362

@@ -383,6 +388,19 @@ class MainActivity : AppCompatActivity(R.layout.main_host) {
383388
}
384389
}
385390

391+
private fun handleTipsEvent(event: TipsEvent) {
392+
return when (event) {
393+
TipsEvent.DismissTips ->
394+
this.dismissTips()
395+
}
396+
}
397+
398+
private fun dismissTips() {
399+
logger.debug("Dissmiss tips")
400+
val appCache = AppCache(this)
401+
appCache.setTipsDismissed(true)
402+
}
403+
386404
private fun onTutorialFinished() {
387405
this.logger.debug("onTutorialFinished")
388406

simplified-main/src/main/java/org/librarysimplified/main/MainActivityDefaultViewModelFactory.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.librarysimplified.ui.tutorial.TutorialEvent
88
import org.nypl.simplified.listeners.api.ListenerRepository
99
import org.nypl.simplified.listeners.api.ListenerRepositoryFactory
1010
import org.nypl.simplified.ui.accounts.ekirjasto.TextSizeEvent
11+
import org.nypl.simplified.ui.announcements.TipsEvent
1112

1213
class MainActivityDefaultViewModelFactory(fallbackFactory: ViewModelProvider.Factory) :
1314
ListenerRepositoryFactory<MainActivityListenedEvent, Unit>(fallbackFactory) {
@@ -19,6 +20,7 @@ class MainActivityDefaultViewModelFactory(fallbackFactory: ViewModelProvider.Fac
1920
repository.registerListener(OnboardingEvent::class, MainActivityListenedEvent::OnboardingEvent)
2021
repository.registerListener(TutorialEvent::class, MainActivityListenedEvent::TutorialEvent)
2122
repository.registerListener(TextSizeEvent::class, MainActivityListenedEvent::TextSizeEvent)
23+
repository.registerListener(TipsEvent::class, MainActivityListenedEvent::TipsEvent)
2224
repository.registerListener(MainLoginEvent::class, MainActivityListenedEvent::LoginEvent)
2325
}
2426
}

simplified-main/src/main/java/org/librarysimplified/main/MainActivityListenedEvent.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ sealed class MainActivityListenedEvent {
2020
val event: org.nypl.simplified.ui.accounts.ekirjasto.TextSizeEvent
2121
) : MainActivityListenedEvent()
2222

23+
data class TipsEvent (
24+
val event: org.nypl.simplified.ui.announcements.TipsEvent
25+
): MainActivityListenedEvent()
26+
2327
data class LoginEvent(
2428
val event: MainLoginEvent
2529
) : MainActivityListenedEvent()

simplified-main/src/main/java/org/librarysimplified/main/MainFragment.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import org.librarysimplified.ui.catalog.saml20.CatalogSAML20FragmentParameters
2121
import org.librarysimplified.ui.navigation.tabs.TabbedNavigator
2222
import org.nypl.simplified.accounts.api.AccountEvent
2323
import org.nypl.simplified.accounts.api.AccountEventDeletion
24+
import org.nypl.simplified.accounts.api.AccountEventLoginStateChanged
2425
import org.nypl.simplified.accounts.api.AccountEventUpdated
26+
import org.nypl.simplified.accounts.api.AccountLoginState
2527
import org.nypl.simplified.books.api.BookID
2628
import org.nypl.simplified.books.book_registry.BookHoldsUpdateEvent
2729
import org.nypl.simplified.books.book_registry.BookStatus
@@ -35,13 +37,14 @@ import org.nypl.simplified.profiles.api.ProfileUpdated
3537
import org.nypl.simplified.ui.accounts.AccountListFragment
3638
import org.nypl.simplified.ui.accounts.AccountListFragmentParameters
3739
import org.nypl.simplified.ui.announcements.AnnouncementsDialog
40+
import org.nypl.simplified.ui.announcements.TipsDialog
3841
import org.slf4j.LoggerFactory
3942
import java.net.URI
4043

4144
/**
4245
* The main application fragment.
4346
*
44-
* Currently, this displays a tabbed view and also displays dialogs on various application
47+
* Currently, this displays a tabbed view and also displays tips and dialogs on various application
4548
* events.
4649
*/
4750

@@ -51,6 +54,9 @@ class MainFragment : Fragment(R.layout.main_tabbed_host) {
5154

5255
private val ANNOUNCEMENT_DIALOG_TAG =
5356
AnnouncementsDialog::class.java.simpleName
57+
58+
private val TIPS_DIALOG_TAG =
59+
TipsDialog::class.java.simpleName
5460
}
5561

5662
private val logger = LoggerFactory.getLogger(MainFragment::class.java)
@@ -192,6 +198,17 @@ class MainFragment : Fragment(R.layout.main_tabbed_host) {
192198
is AccountEventUpdated -> {
193199
this.checkForAnnouncements()
194200
}
201+
is AccountEventLoginStateChanged -> {
202+
when (event.state) {
203+
is AccountLoginState.AccountLoggedIn -> {
204+
//Show tips after logging in
205+
this.showTipsIfNotDismissed()
206+
}
207+
else -> {
208+
//do nothing
209+
}
210+
}
211+
}
195212

196213
/*
197214
* We don't know which fragments on the backstack might refer to accounts that
@@ -334,6 +351,17 @@ class MainFragment : Fragment(R.layout.main_tabbed_host) {
334351
AnnouncementsDialog().showNow(this.childFragmentManager, ANNOUNCEMENT_DIALOG_TAG)
335352
}
336353

354+
private fun showTipsIfNotDismissed() {
355+
val appCache = AppCache(this.requireContext())
356+
if (!appCache.isTipsDismissed()) {
357+
showTipsDialog()
358+
}
359+
}
360+
361+
private fun showTipsDialog() {
362+
TipsDialog().showNow(this.childFragmentManager, TIPS_DIALOG_TAG)
363+
}
364+
337365
private fun openBookDownloadLogin(
338366
bookID: BookID,
339367
downloadURI: URI

simplified-ui-accounts/src/main/java/org/nypl/simplified/ui/accounts/ekirjasto/EKirjastoAccountFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class EKirjastoAccountFragment : Fragment(R.layout.account_ekirjasto){
4444
private val subscriptions: CompositeDisposable =
4545
CompositeDisposable()
4646
private val listener: FragmentListenerType<AccountDetailEvent> by fragmentListeners()
47-
private val triggerListener: FragmentListenerType<TextSizeEvent> by fragmentListeners()
4847
private val parameters: AccountFragmentParameters by lazy {
4948
this.requireArguments()[PARAMETERS_ID] as AccountFragmentParameters
5049
}

simplified-ui-announcements/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ dependencies {
66
implementation(project(":simplified-profiles-controller-api"))
77
implementation(project(":simplified-services-api"))
88
implementation(project(":simplified-ui-thread-api"))
9+
implementation(project(":simplified-ui-listeners-api"))
910

1011
implementation(libs.androidx.activity)
1112
implementation(libs.androidx.appcompat)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.nypl.simplified.ui.announcements
2+
3+
import android.os.Bundle
4+
import android.view.View
5+
import android.view.WindowManager
6+
import android.widget.Button
7+
import android.widget.TextView
8+
import androidx.fragment.app.DialogFragment
9+
import org.librarysimplified.ui.announcements.R
10+
import org.nypl.simplified.listeners.api.FragmentListenerType
11+
import org.nypl.simplified.listeners.api.fragmentListeners
12+
13+
class TipsDialog : DialogFragment(R.layout.tips_dialog) {
14+
15+
private val listener: FragmentListenerType<TipsEvent> by fragmentListeners()
16+
17+
private lateinit var title: TextView
18+
private lateinit var content: TextView
19+
private lateinit var okButton: Button
20+
private lateinit var dismissButton: Button
21+
22+
override fun onCreate(savedInstanceState: Bundle?) {
23+
super.onCreate(savedInstanceState)
24+
25+
}
26+
27+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
28+
super.onViewCreated(view, savedInstanceState)
29+
this.title = view.findViewById(R.id.tips_title)
30+
this.okButton = view.findViewById(R.id.tips_ok)
31+
this.dismissButton = view.findViewById(R.id.tips_dismiss)
32+
this.content = view.findViewById(R.id.tips_content)
33+
}
34+
35+
override fun onStart() {
36+
super.onStart()
37+
dialog?.window?.setLayout(
38+
WindowManager.LayoutParams.MATCH_PARENT,
39+
WindowManager.LayoutParams.WRAP_CONTENT
40+
)
41+
this.okButton.setOnClickListener {
42+
//Close dialog
43+
this.dismiss()
44+
}
45+
46+
this.dismissButton.setOnClickListener {
47+
//Close dialog and mark tips to not be shown again
48+
this.dismiss()
49+
listener.post(TipsEvent.DismissTips)
50+
}
51+
}
52+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.nypl.simplified.ui.announcements
2+
3+
sealed class TipsEvent {
4+
object DismissTips : TipsEvent()
5+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context="org.nypl.simplified.ui.announcements.TipsDialog">
8+
9+
<androidx.appcompat.widget.AppCompatTextView
10+
android:id="@+id/tips_title"
11+
android:layout_width="0dp"
12+
android:layout_height="wrap_content"
13+
android:layout_margin="16dp"
14+
android:textSize="20sp"
15+
android:textStyle="bold"
16+
android:text="@string/tipsTitle"
17+
app:layout_constraintEnd_toEndOf="parent"
18+
app:layout_constraintStart_toStartOf="parent"
19+
app:layout_constraintTop_toTopOf="parent" />
20+
21+
<androidx.appcompat.widget.AppCompatTextView
22+
android:id="@+id/tips_content"
23+
android:layout_width="0dp"
24+
android:layout_height="wrap_content"
25+
android:layout_margin="16dp"
26+
android:textSize="16sp"
27+
android:text="@string/tipsMessage"
28+
app:layout_constraintEnd_toEndOf="parent"
29+
app:layout_constraintStart_toStartOf="parent"
30+
app:layout_constraintTop_toBottomOf="@id/tips_title" />
31+
32+
<androidx.appcompat.widget.AppCompatButton
33+
android:id="@+id/tips_ok"
34+
android:layout_width="wrap_content"
35+
android:layout_height="wrap_content"
36+
android:layout_marginBottom="16dp"
37+
android:layout_marginEnd="16dp"
38+
android:layout_marginTop="25dp"
39+
android:enabled="true"
40+
android:text="@string/tipsOk"
41+
android:visibility="visible"
42+
app:layout_constraintBottom_toBottomOf="parent"
43+
app:layout_constraintEnd_toEndOf="parent"
44+
app:layout_constraintTop_toBottomOf="@id/tips_content" />
45+
46+
<androidx.appcompat.widget.AppCompatButton
47+
android:id="@+id/tips_dismiss"
48+
android:layout_width="wrap_content"
49+
android:layout_height="wrap_content"
50+
android:layout_marginBottom="16dp"
51+
android:layout_marginStart="16dp"
52+
android:layout_marginTop="25dp"
53+
android:enabled="true"
54+
android:text="@string/tipsDismiss"
55+
android:visibility="visible"
56+
app:layout_constraintBottom_toBottomOf="parent"
57+
app:layout_constraintStart_toStartOf="parent"
58+
app:layout_constraintTop_toBottomOf="@id/tips_content" />
59+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)