NeoDay Android SDK - Feedback
Handling Feedback view with FeedbackListener
The default behavior of the SDK is to show the Feedback screen whenever one of the SDK's screens is currently visible. However you can implement the FeedbackDelegate in order to control when a Feedback screen is displayed. If you are using the Custom Event Trigger see the section When using Custom Events to trigger Feedback for how to deal with Feedback being displayed.
class ExampleActivity : AppCompatActivity() {
private val viewModel: ExampleActivityViewModel by viewModels { ExampleActivityViewModelFactory() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Set the Feedback listener
exampleApp.neoDaySDK.feedbackListener = object : FeedbackListener {
override fun receivedFeedback(controller: Result<NeoDayViewController>) {
try {
viewModel.feedbackViewController = result.getOrThrow()
viewModel.showFeedback.value = true
} catch (ex: Exception) {
ex.printStackTrace()
}
}
}
setContent {
MaterialTheme {
val navHostController = rememberNavController()
if (viewModel.showFeedback.value) {
viewModel.showFeedback.value = false
navHostController.navigate("FEEDBACK")
}
Navigation(
navHostController = navHostController,
viewModel = viewModel,
modifier = Modifier.fillMaxSize()
)
}
}
}
}
@Composable
fun Navigation(
navHostController: NavHostController,
viewModel: MainActivityViewModel,
modifier: Modifier = Modifier
) {
NavHost(
navController = navHostController,
startDestination = "<start destination>",
modifier = modifier
) {
// ...
composable("FEEDBACK") {
viewModel.feedbackViewController?.let {
it.backButtonListener = { navHostController.navigateUp() }
it.getView().invoke()
}
SubscribeToLifecycle(key = Unit) { event ->
if (event == Lifecycle.Event.ON_DESTROY) {
mainActivityViewModel.feedbackViewController = null
}
}
}
// ...
}
}
@Composable
fun SubscribeToLifecycle(
key: Any?,
lifecycle: Lifecycle = LocalLifecycleOwner.current.lifecycle,
onNewEvent: (Lifecycle.Event) -> Unit
) {
DisposableEffect(key) {
val observer = LifecycleEventObserver { _, event ->
onNewEvent.invoke(event)
}
lifecycle.addObserver(observer)
onDispose {
lifecycle.removeObserver(observer)
}
}
}
When using Custom Events to trigger Feedback
Caching Feedback
Whenever Custom Event Triggers are used to trigger a Feedback we advise you to handle showing the Feedback yourselve by caching it first. And then to show it when its appropriate to do so within your app.
class ExampleActivity : AppCompatActivity() {
private val viewModel: ExampleActivityViewModel by viewModels { ExampleActivityViewModelFactory() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Set the Feedback listener
exampleApp.neoDaySDK.feedbackListener = object : FeedbackListener {
override fun receivedFeedback(controller: Result<NeoDayViewController>) {
if(<some condition that requires caching>) {
// Cache the controller and present it at later time inside the app.
viewModel.pendingFeedbackViewController = controller
} else {
// Regular Feedback handling
}
}
}
...
}
}
Clearing and displaying the Feedback cache
Whenever you remove the stored token from the NeoDay SDK when logging out of your app, the Feedback cache will also need to be cleared. In case your user logs back in with another account while the app is still open, you don't want to accidentally show Feedback that was meant for the previous logged in user.
viewModel.pendingFeedbackViewController?.let {
viewModel.feedbackViewControler = it
// Clear the Feedback cache
viewModel.pendingFeedbackViewController = null
viewModel.showFeedback.value = true
}