From efdb30483a9094fcaa1363eee7dc826ad630a994 Mon Sep 17 00:00:00 2001 From: rxu Date: Fri, 30 Oct 2020 14:07:24 +0800 Subject: [PATCH] Add domestic China FxA service for Mozilla Online builds China fxa related string Add switch preference in settings to use local/global fxa server inherit fennec FxA settings Present or hide fxa switch according to isMozillaonline Allow China fxa server auto login during migration --- .../org/mozilla/fenix/components/FxaServer.kt | 11 ++++- .../mozilla/fenix/settings/PairFragment.kt | 8 +++- .../fenix/settings/SettingsFragment.kt | 48 ++++++++++++++++++- .../fenix/settings/account/AccountUiView.kt | 4 +- .../settings/account/TurnOnSyncFragment.kt | 5 +- .../java/org/mozilla/fenix/utils/Settings.kt | 5 ++ .../res/values-zh-rCN/mozonline_strings.xml | 9 ++++ app/src/main/res/values/mozonline_strings.xml | 9 ++++ app/src/main/res/values/preference_keys.xml | 2 + app/src/main/res/xml/preferences.xml | 5 ++ .../res/xml/preferences_without_icons.xml | 5 ++ .../fenix/MigratingFenixApplication.kt | 4 +- 12 files changed, 108 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/FxaServer.kt b/app/src/main/java/org/mozilla/fenix/components/FxaServer.kt index c863f748e8..b6f66cc7b4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/FxaServer.kt +++ b/app/src/main/java/org/mozilla/fenix/components/FxaServer.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.components import android.content.Context import mozilla.components.service.fxa.ServerConfig import mozilla.components.service.fxa.ServerConfig.Server +import org.mozilla.fenix.Config import org.mozilla.fenix.ext.settings /** @@ -17,10 +18,18 @@ object FxaServer { const val REDIRECT_URL = "urn:ietf:wg:oauth:2.0:oob:oauth-redirect-webchannel" fun config(context: Context): ServerConfig { + // If a server override is configured, use that. Otherwise: + // - for all channels other than Mozilla Online, use Server.Release. + // - for Mozilla Online channel, if domestic server is allowed, use Server.CHINA; otherwise, use Server.RELEASE val serverOverride = context.settings().overrideFxAServer val tokenServerOverride = context.settings().overrideSyncTokenServer.ifEmpty { null } if (serverOverride.isEmpty()) { - return ServerConfig(Server.RELEASE, CLIENT_ID, REDIRECT_URL, tokenServerOverride) + val releaseServer = if (Config.channel.isMozillaOnline && context.settings().allowDomesticChinaFxaServer) { + Server.CHINA + } else { + Server.RELEASE + } + return ServerConfig(releaseServer, CLIENT_ID, REDIRECT_URL, tokenServerOverride) } return ServerConfig(serverOverride, CLIENT_ID, REDIRECT_URL, tokenServerOverride) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt index cc398781d0..e07083985e 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt @@ -13,13 +13,13 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.fragment.app.Fragment -import androidx.navigation.fragment.NavHostFragment.findNavController import androidx.navigation.fragment.findNavController import mozilla.components.feature.qr.QrFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import org.mozilla.fenix.R import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar class PairFragment : Fragment(R.layout.fragment_pair), UserInteractionHandler { @@ -67,7 +67,11 @@ class PairFragment : Fragment(R.layout.fragment_pair), UserInteractionHandler { false ) }, - scanMessage = R.string.pair_instructions_2 + scanMessage = + if (requireContext().settings().allowDomesticChinaFxaServer && + org.mozilla.fenix.Config.channel.isMozillaOnline) + R.string.pair_instructions_2_cn + else R.string.pair_instructions_2 ), owner = this, view = view diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index cc0b359192..4f759d5e81 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -26,6 +26,7 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.amo_collection_override_dialog.view.* import kotlinx.coroutines.CoroutineScope @@ -92,7 +93,8 @@ class SettingsFragment : PreferenceFragmentCompat() { scope = lifecycleScope, accountManager = requireComponents.backgroundServices.accountManager, httpClient = requireComponents.core.client, - updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu + updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu, + updateFxAAllowDomesticChinaServerMenu = :: updateFxAAllowDomesticChinaServerMenu ) // Observe account changes to keep the UI up-to-date. @@ -447,6 +449,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } setupAmoCollectionOverridePreference(requireContext().settings()) + setupAllowDomesticChinaFxaServerPreference() } /** @@ -539,6 +542,22 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + private fun updateFxAAllowDomesticChinaServerMenu() { + val settings = requireContext().settings() + val preferenceAllowDomesticChinaServer = + findPreference(getPreferenceKey(R.string.pref_key_allow_domestic_china_fxa_server)) + // Only enable changes to these prefs when the user isn't connected to an account. + val enabled = + requireComponents.backgroundServices.accountManager.authenticatedAccount() == null + val checked = settings.allowDomesticChinaFxaServer + val visible = Config.channel.isMozillaOnline + preferenceAllowDomesticChinaServer?.apply { + isEnabled = enabled + isChecked = checked + isVisible = visible + } + } + private fun updateFxASyncOverrideMenu() { val preferenceFxAOverride = findPreference(getPreferenceKey(R.string.pref_key_override_fxa_server)) @@ -577,6 +596,33 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + private fun setupAllowDomesticChinaFxaServerPreference() { + val allowDomesticChinaFxAServer = getPreferenceKey(R.string.pref_key_allow_domestic_china_fxa_server) + val preferenceAllowDomesticChinaFxAServer = findPreference(allowDomesticChinaFxAServer) + val visible = Config.channel.isMozillaOnline + + preferenceAllowDomesticChinaFxAServer?.apply { + isVisible = visible + } + + if (visible) { + preferenceAllowDomesticChinaFxAServer?.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { preference, newValue -> + preference.context.settings().preferences.edit() + .putBoolean(preference.key, newValue as Boolean).apply() + updateFxAAllowDomesticChinaServerMenu() + Toast.makeText( + context, + getString(R.string.toast_override_fxa_sync_server_done), + Toast.LENGTH_LONG + ).show() + Handler(Looper.getMainLooper()).postDelayed({ + exitProcess(0) + }, FXA_SYNC_OVERRIDE_EXIT_DELAY) + } + } + } + companion object { private const val REQUEST_CODE_BROWSER_ROLE = 1 private const val SCROLL_INDICATOR_DELAY = 10L diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt index 965ff46cfb..94464b0356 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/AccountUiView.kt @@ -26,7 +26,8 @@ class AccountUiView( private val scope: CoroutineScope, private val accountManager: FxaAccountManager, private val httpClient: Client, - private val updateFxASyncOverrideMenu: () -> Unit + private val updateFxASyncOverrideMenu: () -> Unit, + private val updateFxAAllowDomesticChinaServerMenu: () -> Unit ) { private val preferenceSignIn = @@ -48,6 +49,7 @@ class AccountUiView( val account = accountManager.authenticatedAccount() updateFxASyncOverrideMenu() + updateFxAAllowDomesticChinaServerMenu() // Signed-in, no problems. if (account != null && !accountManager.accountNeedsReauth()) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt index 27734d9450..19973a28e4 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt @@ -21,6 +21,7 @@ import mozilla.components.concept.sync.OAuthAccount import mozilla.components.support.ktx.android.content.hasCamera import mozilla.components.support.ktx.android.content.isPermissionGranted import mozilla.components.support.ktx.android.view.hideKeyboard +import org.mozilla.fenix.Config import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar @@ -114,7 +115,9 @@ class TurnOnSyncFragment : Fragment(), AccountObserver { view.signInScanButton.setOnClickListener(paringClickListener) view.signInEmailButton.setOnClickListener(signInClickListener) view.signInInstructions.text = HtmlCompat.fromHtml( - getString(R.string.sign_in_instructions), + if (requireContext().settings().allowDomesticChinaFxaServer && Config.channel.isMozillaOnline) + getString(R.string.sign_in_instructions_cn) + else getString(R.string.sign_in_instructions), HtmlCompat.FROM_HTML_MODE_LEGACY ) diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 81d80ddee7..f83591a40d 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -887,6 +887,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = false ) + var allowDomesticChinaFxaServer by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_allow_domestic_china_fxa_server), + default = true + ) + var overrideFxAServer by stringPreference( appContext.getPreferenceKey(R.string.pref_key_override_fxa_server), default = "" diff --git a/app/src/main/res/values-zh-rCN/mozonline_strings.xml b/app/src/main/res/values-zh-rCN/mozonline_strings.xml index 4a9cdea12a..182ef30f47 100644 --- a/app/src/main/res/values-zh-rCN/mozonline_strings.xml +++ b/app/src/main/res/values-zh-rCN/mozonline_strings.xml @@ -27,4 +27,13 @@ 京东 拼多多 + + + + 使用本地服务 + + firefox.com.cn/pair 并扫描网站上的二维码]]> + + https://firefox.com.cn/pair]]> + diff --git a/app/src/main/res/values/mozonline_strings.xml b/app/src/main/res/values/mozonline_strings.xml index 1ca8fbf614..61724501e4 100644 --- a/app/src/main/res/values/mozonline_strings.xml +++ b/app/src/main/res/values/mozonline_strings.xml @@ -27,4 +27,13 @@ JD PDD + + + + Use domestic China service + + firefox.com.cn/pair]]> + + https://firefox.com.cn/pair]]> + diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 942ec3f8bc..5ff80b4a4b 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -47,6 +47,8 @@ pref_key_account pref_key_sign_in pref_key_account_auth_error + pref_key_allow_domestic_china_fxa_server + pref_key_have_read_fxa_account_json pref_key_override_fxa_server pref_key_override_sync_tokenserver pref_key_private_mode diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index e96be5a2f2..799b9130ae 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -13,6 +13,11 @@ android:title="@string/preferences_sync" app:allowDividerBelow="false" /> + + + +