You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserMenuSignIn.kt

68 lines
2.7 KiB
Kotlin

/* 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.components.toolbar
import android.content.Context
import android.view.View
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.annotation.VisibleForTesting
import androidx.core.content.ContextCompat
import mozilla.components.browser.menu.BrowserMenu
import mozilla.components.browser.menu.item.BrowserMenuImageText
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
/**
* A menu item for displaying account information. The item computes the label on every bind call,
* to provide each menu with the latest account manager state.
*
* @property textColorResource ID of color resource to tint the text.
* @param imageResource ID of a drawable resource to be shown as icon.
* @param listener Callback to be invoked when this menu item is clicked.
*/
class BrowserMenuSignIn(
@ColorRes private val textColorResource: Int,
@DrawableRes imageResource: Int = R.drawable.ic_signed_out,
listener: () -> Unit = {},
) : BrowserMenuImageText(
String(),
imageResource,
textColorResource = textColorResource,
listener = listener,
) {
override fun bind(menu: BrowserMenu, view: View) {
super.bind(menu, view)
val textView = view.findViewById<TextView>(R.id.text)
textView.text = getLabel(textView.context)
textView.setTextColor(ContextCompat.getColor(textView.context, textColorResource))
}
/**
* Return the proper label for the sign in button.
*
* There are 3 states that the account state could be in:
* 1) If the user is signed in and the account information is known and a display name is set
* display the account display name else display the account email.
* 2) The user is not signed in.
* 3) Display an account info placeholder string if the user is signed in, but the account state
* is unknown or being checked. Could by improved by using:
* https://github.com/mozilla/application-services/issues/5328
*/
@VisibleForTesting
internal fun getLabel(context: Context): String = with(context) {
val isSignedIn = components.settings.signedInFxaAccount
val email = components.backgroundServices.syncStore.state.account?.email
val displayName = components.backgroundServices.syncStore.state.account?.displayName
if (isSignedIn) {
displayName ?: email ?: resources.getString(R.string.browser_menu_account_settings)
} else {
resources.getString(R.string.sync_menu_sync_and_save_data)
}
}
}