/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.settings.account import androidx.navigation.NavController import org.mozilla.fenix.R import org.mozilla.fenix.ext.nav interface AccountSettingsUserActions { /** * Called whenever the "Sync now" button is tapped */ fun onSyncNow() /** * Called whenever user sets a new device name * @param newDeviceName the device name to change to * @return Boolean indicating whether the new device name has been accepted or not */ fun onChangeDeviceName(newDeviceName: String, invalidNameResponse: () -> Unit): Boolean /** * Called whenever the "Sign out" button is tapped */ fun onSignOut() } class AccountSettingsInteractor( private val navController: NavController, private val syncNow: () -> Unit, private val syncDeviceName: (String) -> Boolean, private val store: AccountSettingsFragmentStore ) : AccountSettingsUserActions { override fun onSyncNow() { syncNow.invoke() } override fun onChangeDeviceName(newDeviceName: String, invalidNameResponse: () -> Unit): Boolean { if (!syncDeviceName(newDeviceName)) { invalidNameResponse.invoke() return false } // Our "change the device name on the server" operation may fail. // Currently, we disregard this failure and pretend we succeeded. // At the same time, when user changes the device name, we immediately update the UI to display the new name. // So, in case of a network (or other) failure when talking to the server, // we'll have a discrepancy - the UI will reflect new value, but actually the value never changed. // So, when user presses "sync now", we'll fetch the old value, and reset the UI. store.dispatch(AccountSettingsFragmentAction.UpdateDeviceName(newDeviceName)) return true } override fun onSignOut() { val directions = AccountSettingsFragmentDirections.actionAccountSettingsFragmentToSignOutFragment() navController.nav( R.id.accountSettingsFragment, directions ) } }