diff --git a/README.md b/README.md index 3ac60cb6d..6e879b08a 100644 --- a/README.md +++ b/README.md @@ -123,28 +123,11 @@ If you want to run **performance tests/benchmarks** in automation or locally: For additional context on these recommendations, see [the perf build variant analysis](https://docs.google.com/document/d/1aW-m0HYncTDDiRz_2x6EjcYkjBpL9SHhhYix13Vil30/edit#). -You will **need to sign `forPerformanceTest` variants.** For local development, our recommendation is to add the following configuration to `app/build.gradle`: - -```groovy -android { // this line already exists - // ... - - buildTypes { // this line already exists - // ... - - forPerformanceTest releaseTemplate >> { // this line already exists. - // ... - - signingConfig signingConfigs.debug - } - } -} +Before you can install any release variants including `forPerformanceTest`, **you will need to sign them.** To do this automatically in local development, you can add the following to `/local.properties`: +```sh +autosignReleaseWithDebugKey ``` -This recommendation will let you use AS just like you do with debug builds but **please do not check in these changes.** - -See [perf-frontend-issues#44](https://github.com/mozilla-mobile/perf-frontend-issues/issues/44) for efforts to make performance signing easier. - ## Pre-push hooks To reduce review turn-around time, we'd like all pushes to run tests locally. We'd recommend you use our provided pre-push hook in `config/pre-push-recommended.sh`. diff --git a/app/build.gradle b/app/build.gradle index 4d96ac73b..409c84b97 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,10 @@ android { minifyEnabled true proguardFiles 'proguard-android-optimize-3.5.0-modified.txt', 'proguard-rules.pro' matchingFallbacks = ['release'] // Use on the "release" build type in dependencies (AARs) + + if (gradle.hasProperty("localProperties.autosignReleaseWithDebugKey")) { + signingConfig signingConfigs.debug + } } buildTypes { diff --git a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt index 739caf58d..5b4ee3afe 100644 --- a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt +++ b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt @@ -28,5 +28,6 @@ enum class BrowserDirection(@IdRes val fragmentId: Int) { FromAddNewDeviceFragment(R.id.addNewDeviceFragment), FromAddSearchEngineFragment(R.id.addSearchEngineFragment), FromEditCustomSearchEngineFragment(R.id.editCustomSearchEngineFragment), - FromAddonDetailsFragment(R.id.addonDetailsFragment) + FromAddonDetailsFragment(R.id.addonDetailsFragment), + FromLoginDetailFragment(R.id.loginDetailFragment) } diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 1648cd7c4..e0ef1c075 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -53,6 +53,7 @@ import mozilla.components.support.utils.SafeIntent import mozilla.components.support.utils.toSafeIntent import mozilla.components.support.webextensions.WebExtensionPopupFeature import org.mozilla.fenix.GleanMetrics.Metrics +import org.mozilla.fenix.addons.AddonDetailsFragmentDirections import org.mozilla.fenix.browser.UriOpenedObserver import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager @@ -81,6 +82,7 @@ import org.mozilla.fenix.session.NotificationSessionObserver import org.mozilla.fenix.settings.SettingsFragmentDirections import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections import org.mozilla.fenix.settings.about.AboutFragmentDirections +import org.mozilla.fenix.settings.logins.LoginDetailFragmentDirections import org.mozilla.fenix.settings.logins.SavedLoginsAuthFragmentDirections import org.mozilla.fenix.settings.search.AddSearchEngineFragmentDirections import org.mozilla.fenix.settings.search.EditCustomSearchEngineFragmentDirections @@ -165,14 +167,24 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } if (isActivityColdStarted(intent, savedInstanceState)) { - externalSourceIntentProcessors.any { it.process(intent, navHost.navController, this.intent) } + externalSourceIntentProcessors.any { + it.process( + intent, + navHost.navController, + this.intent + ) + } } Performance.processIntentIfPerformanceTest(intent, this) if (settings().isTelemetryEnabled) { - lifecycle.addObserver(BreadcrumbsRecorder(components.analytics.crashReporter, - navHost.navController, ::getBreadcrumbMessage)) + lifecycle.addObserver( + BreadcrumbsRecorder( + components.analytics.crashReporter, + navHost.navController, ::getBreadcrumbMessage + ) + ) val safeIntent = intent?.toSafeIntent() safeIntent @@ -209,7 +221,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { components.backgroundServices.accountManager.initAsync().await() // If we're authenticated, kick-off a sync and a device state refresh. components.backgroundServices.accountManager.authenticatedAccount()?.let { - components.backgroundServices.accountManager.syncNowAsync(SyncReason.Startup, debounce = true) + components.backgroundServices.accountManager.syncNowAsync( + SyncReason.Startup, + debounce = true + ) } } } @@ -241,8 +256,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { super.onNewIntent(intent) intent ?: return - val intentProcessors = listOf(CrashReporterIntentProcessor()) + externalSourceIntentProcessors - val intentHandled = intentProcessors.any { it.process(intent, navHost.navController, this.intent) } + val intentProcessors = + listOf(CrashReporterIntentProcessor()) + externalSourceIntentProcessors + val intentHandled = + intentProcessors.any { it.process(intent, navHost.navController, this.intent) } browsingModeManager.mode = getModeFromIntentOrLastKnown(intent) if (intentHandled) { @@ -474,7 +491,9 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { BrowserDirection.FromEditCustomSearchEngineFragment -> EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) BrowserDirection.FromAddonDetailsFragment -> - EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) + AddonDetailsFragmentDirections.actionGlobalBrowser(customTabSessionId) + BrowserDirection.FromLoginDetailFragment -> + LoginDetailFragmentDirections.actionGlobalBrowser(customTabSessionId) } private fun load( @@ -563,13 +582,14 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } @VisibleForTesting - internal fun isActivityColdStarted(startingIntent: Intent, activityIcicle: Bundle?): Boolean = + internal fun isActivityColdStarted(startingIntent: Intent, activityIcicle: Bundle?): Boolean { // First time opening this activity in the task. // Cold start / start from Recents after back press. - activityIcicle == null && - // Activity was restarted from Recents after it was destroyed by Android while in background - // in cases of memory pressure / "Don't keep activities". - startingIntent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == 0 + return activityIcicle == null && + // Activity was restarted from Recents after it was destroyed by Android while in background + // in cases of memory pressure / "Don't keep activities". + startingIntent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == 0 + } companion object { const val OPEN_TO_BROWSER = "open_to_browser" diff --git a/app/src/main/java/org/mozilla/fenix/settings/logins/LoginDetailFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/logins/LoginDetailFragment.kt index c63db284f..f7c842978 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/logins/LoginDetailFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/logins/LoginDetailFragment.kt @@ -7,12 +7,12 @@ package org.mozilla.fenix.settings.logins import android.content.DialogInterface import android.os.Bundle import android.text.InputType -import android.view.MenuItem -import android.view.MenuInflater +import android.view.LayoutInflater import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup -import android.view.LayoutInflater import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment @@ -21,23 +21,26 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.fragment_login_detail.* +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ObsoleteCoroutinesApi -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.launch import kotlinx.coroutines.async +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.components.concept.storage.Login import mozilla.components.lib.state.ext.consumeFrom +import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.FeatureFlags +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ext.redirectToReAuth import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar @@ -119,6 +122,7 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { private fun setUpPasswordReveal() { passwordText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + revealPasswordButton.increaseTapArea(BUTTON_INCREASE_DPS) revealPasswordButton.setOnClickListener { togglePasswordReveal() } @@ -126,9 +130,13 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { private fun setUpCopyButtons() { webAddressText.text = login?.origin - copyWebAddress.setOnClickListener( - CopyButtonListener(login?.origin, R.string.logins_site_copied) - ) + openWebAddress.increaseTapArea(BUTTON_INCREASE_DPS) + copyUsername.increaseTapArea(BUTTON_INCREASE_DPS) + copyPassword.increaseTapArea(BUTTON_INCREASE_DPS) + + openWebAddress.setOnClickListener { + navigateToBrowser(requireNotNull(login?.origin)) + } usernameText.text = login?.username copyUsername.setOnClickListener( @@ -189,6 +197,14 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { else -> false } + private fun navigateToBrowser(address: String) { + (activity as HomeActivity).openToBrowserAndLoad( + address, + newTab = true, + from = BrowserDirection.FromLoginDetailFragment + ) + } + private fun editLogin() { val directions = LoginDetailFragmentDirections @@ -281,4 +297,8 @@ class LoginDetailFragment : Fragment(R.layout.fragment_login_detail) { } } } + + private companion object { + private const val BUTTON_INCREASE_DPS = 24 + } } diff --git a/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsLayout.kt b/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsLayout.kt index f3f882929..1f2fd9a91 100644 --- a/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsLayout.kt +++ b/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsLayout.kt @@ -46,7 +46,8 @@ class SyncedTabsLayout @JvmOverloads constructor( synced_tabs_list.visibility = View.GONE sync_tabs_status.visibility = View.VISIBLE - synced_tabs_pull_to_refresh.isEnabled = false + + synced_tabs_pull_to_refresh.isEnabled = pullToRefreshEnableState(error) } override fun displaySyncedTabs(syncedTabs: List) { @@ -78,4 +79,19 @@ class SyncedTabsLayout @JvmOverloads constructor( override fun stopLoading() { synced_tabs_pull_to_refresh.isRefreshing = false } + + companion object { + internal fun pullToRefreshEnableState(error: SyncedTabsView.ErrorType) = when (error) { + // Disable "pull-to-refresh" when we clearly can't sync tabs, and user needs to take an + // action within the app. + SyncedTabsView.ErrorType.SYNC_UNAVAILABLE, + SyncedTabsView.ErrorType.SYNC_NEEDS_REAUTHENTICATION -> false + + // Enable "pull-to-refresh" when an external event (e.g. connecting a desktop client, + // or enabling tabs sync, or connecting to a network) may resolve our problem. + SyncedTabsView.ErrorType.SYNC_ENGINE_UNAVAILABLE, + SyncedTabsView.ErrorType.MULTIPLE_DEVICES_UNAVAILABLE, + SyncedTabsView.ErrorType.NO_TABS_AVAILABLE -> true + } + } } diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml index 278049399..e6bdd9f94 100644 --- a/app/src/main/res/drawable/ic_copy.xml +++ b/app/src/main/res/drawable/ic_copy.xml @@ -3,12 +3,12 @@ - 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/. --> + android:width="17dp" + android:height="20dp" + android:viewportWidth="17" + android:viewportHeight="20"> + android:fillType="nonZero" + android:pathData="M10.69,3A3.313,3.313 0,0 1,14 6.31v10.38A3.313,3.313 0,0 1,10.69 20L3.31,20A3.313,3.313 0,0 1,0 16.69L0,6.31A3.313,3.313 0,0 1,3.31 3h7.38zM10.69,5L3.31,5C2.587,5 2,5.587 2,6.31v10.38c0,0.723 0.587,1.31 1.31,1.31h7.38c0.723,0 1.31,-0.587 1.31,-1.31L12,6.31C12,5.587 11.413,5 10.69,5zM10.995,0A6.003,6.003 0,0 1,17 6v0.016l-0.024,8.987a2,2 0,0 1,-2.005 1.994h-0.002l0.03,-10.986L14.999,6c0,-2.21 -1.793,-4 -4.004,-4L3,2a2,2 0,0 1,2 -2h5.995z" /> diff --git a/app/src/main/res/drawable/ic_open_in_new.xml b/app/src/main/res/drawable/ic_open_in_new.xml new file mode 100644 index 000000000..46bb28221 --- /dev/null +++ b/app/src/main/res/drawable/ic_open_in_new.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_login_detail.xml b/app/src/main/res/layout/fragment_login_detail.xml index e6cfa17a5..3faa7205e 100644 --- a/app/src/main/res/layout/fragment_login_detail.xml +++ b/app/src/main/res/layout/fragment_login_detail.xml @@ -2,7 +2,6 @@ - + android:layout_marginEnd="12dp"> @@ -35,10 +34,10 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center_vertical" - android:textColor="?primaryText" - android:textSize="16sp" android:paddingTop="@dimen/saved_logins_detail_menu_vertical_padding" android:paddingBottom="@dimen/saved_logins_detail_menu_vertical_padding" + android:textColor="?primaryText" + android:textSize="16sp" app:layout_constraintEnd_toEndOf="@id/webAddressHeader" app:layout_constraintStart_toStartOf="@id/webAddressHeader" app:layout_constraintTop_toBottomOf="@id/webAddressHeader" @@ -46,15 +45,15 @@ tools:text="Info" /> @@ -106,12 +106,12 @@ android:id="@+id/passwordHeader" android:layout_width="0dp" android:layout_height="24dp" + android:layout_marginTop="12dp" android:gravity="center_vertical" android:letterSpacing="0.05" android:text="@string/preferences_passwords_saved_logins_password" android:textColor="?primaryText" android:textSize="12sp" - android:layout_marginTop="12dp" app:fontFamily="@font/metropolis_semibold" app:layout_constraintBottom_toTopOf="@id/passwordText" app:layout_constraintEnd_toStartOf="@id/revealPasswordButton" @@ -123,14 +123,14 @@ android:id="@+id/passwordText" android:layout_width="0dp" android:layout_height="30dp" + android:layout_marginTop="2dp" android:gravity="center_vertical" android:letterSpacing="0.01" android:lineSpacingExtra="8sp" - android:layout_marginTop="2dp" android:textColor="?primaryText" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="@id/passwordHeader" + app:layout_constraintEnd_toStartOf="@id/revealPasswordButton" app:layout_constraintStart_toStartOf="@id/passwordHeader" app:layout_constraintTop_toBottomOf="@id/passwordHeader" app:layout_constraintVertical_chainStyle="packed" @@ -138,25 +138,27 @@ diff --git a/app/src/main/res/values-an/strings.xml b/app/src/main/res/values-an/strings.xml new file mode 100644 index 000000000..5114f089a --- /dev/null +++ b/app/src/main/res/values-an/strings.xml @@ -0,0 +1,1417 @@ + + + + %s privau + + %s (nav. privada) + + + Mas opcions + + Activar navegación privada + + Desactivar navegación privada + + Buscar u escribir adreza + + Las tuyas pestanyas ubiertas amaneixerán aquí. + + Las tuyas pestanyas privadas amaneixerán aquí. + + + 1 pestanya ubierta. Toca pa cambiar de pestanya. + + + %1$s pestanyas ubiertas. Toca pa cambiar de pestanya. + + + %1$s ye produciu per Mozilla. + + + + Yes en una sesión privada + + %1$s limpia lo tuyo historial de busquedas y de navegación en as pestanyas privadas quan las zarras u en salir de l’aplicación. Encara que no te fa invisible debant d’os puestos web u d’o tuyo furnidor de servicios, ye mas facil salvaguardar la tuya vida privada de qualsequier persona que faga servir este dispositivo. + + Mitos comuns sobre la navegación privada + + Borrar sesión + + + + Anyadir un acceso directo pa ubrir pestanyas privadas dende la pantalla d’inicio. + + Adhibir acceso directo + + No, gracias + + + + Accede a Firefox mas rapido. Anyade un widget en a tuya pantalla d’inicio. + + Anyadir widget + + Agora no + + + + Nueva pestanya + + Nueva pestanya privada + + Puestos favoritos + + + + Pestanyas ubiertas + + Dezaga + + Siguient + + Actualizar + + Aturar + + Marcapachinas + + Editar marcapachinas + + Complementos + + No i hai garra complemento aquí + + Aduya + + Novedatz + + Achustes + + Biblioteca + + Puesto d’escritorio + + Adhibir a la pantalla d’Inicio + + Instalar + + Pestanyas sincronizadas + + Mirar en a pachina + + Pestanya privada + + Nueva pestanya + + Alzar en a colección + + Compartir + + Compartir con… + + Ubrir en %1$s + + FUNCIONA CON %1$s + + Funciona con %1$s + + Vista de lectura + + Zarrar la vista de lectura + + Ubrir en aplicación + + Apariencia + + No se puede connectar. No se reconoix lo esquema d’URL. + + + + Idioma triau + + Buscar + + Usar l’idioma d’o dispositivo + + Buscar idioma + + + + Escaniar + + Alcorces + + Achustes d’o buscador + + Buscar con + + Esta vegada, buscar con: + + Completar vinclo dende lo portafuellas + + Permitir + + No permitir + + Permitir sucherencias de busqueda en sesions privadas? + + %s compartirá tot lo que escribas en a barra d’adrezas con o tuyo buscador predeterminau. + + Saber-ne mas + + + + Buscar + + Buscar en a web + + Busqueda per voz + + + + Achustes + + Aspectos basicos + + Cheneral + + Sobre + + Motor de busqueda predeterminau + + Buscar + + Barra d’adrezas + + Aduya + + Qualificar en Google Play + + Dar opinión + + Sobre %1$s + + Los tuyos dreitos + + Claus + + Tarchetas de credito y adrezas + + Establir como navegador predeterminau + + Abanzau + + Privacidat + + Privacidat y seguranza + + Permisos d’o puesto + + Navegación privada + + Ubrir vinclos en una pestanya privada + + Permitir capturas de pantalla en navegación privada + + Adhibir acceso directo a navegación privada + + Accesibilidat + + Servidor personalizau de cuenta de Firefox + + Servidor personalizau de Sync + + Servidors de cuenta de Firefox y Sync modificaus. Zarrando l’aplicación pa aplicar los cambios… + + Cuenta + + Iniciar sesión + + Barra de ferramientas + + Tema + + Personalizar + + Sincroniza marcapachinas, historial y mas con a tuya cuenta Firefox + + Cuenta Firefox + + Reconnectar pa reprener la sincronización + + Idioma + + Tría de datos + + Replega de datos + + Nota sobre privacidat + + Ferramientas de desenvolvedor + + Depuración remota vía USB + + Amostrar alcorces de busqueda + + Amostrar sucherencias de busqueda + + Amostrar busqueda per voz + + Amostrar en sesions privadas + + Amostrar sucherencias d’o portafuellas + + Buscar historial de navegación + + Buscar marcapachinas + + Achustes d’a cuenta + + Ubrir vinclos en aplicacions + + Complementos + + + + Sincronizar agora + + Tría qué quiers sincronizar + + Historial + + Marcapachinas + + Inicios de sesión + + Pestanyas ubiertas + + Zarrar sesión + + Nombre d’o dispositivo + + Lo nombre d’o dispositivo no puede estar vuedo. + + Sincronizando… + + La sincronización ha fallau. Zaguer exito: %s + + La sincronización ha fallau. Zaguera sincronización: nunca + + Zaguera sincronización: %s + + Zaguera sincronización: nunca + + %1$s en %2$s %3$s + + + + Pestanyas recebidas + + Notificacions pa pestanyas recibidas d’atros dispositivos Firefox. + + Pestanya recebida + + Pestanyas recebidas + + Pestanya de %s + + + + Protección contra seguimiento + + Protección contra seguimiento + + Blocar conteniu y scripts que te fan seguimiento en linia + + Excepcions + + La protección contra seguimiento ye desactivada pa estes puestos web + + Activar pa totz los puestos + + Las excepcions te permiten desactivar la protección contra seguimiento en puestos triaus. + + Saber-ne mas + + + Se desactivó en cheneral, veye a Achustes pa activar-lo. + + + Telemetría + + Uso y datos tecnicos + + Comparte datos de rendimiento, uso, hardware y personalizacions sobre lo tuyo navegador con Mozilla pa aduyar a amillorar %1$s + + Datos de marketing + + Comparte datos sobre las funcionalidatz que usas en %1$s con Leanplum, lo nuestro furnidor de marketing pa mobils. + + Experimentos + + Permite a Mozilla instalar y recopilar datos pa funcions experimentals + + Informe d’error + + Servicio de localización de Mozilla + + Informe de salut de %s + + + + Activar Sync + + Escaniar codigo de emparejamiento en a versión d’escritorio de Firefox + + Iniciar sesión + + Inicia sesión pa reconnectar + + Borrar cuenta + + + + firefox.com/pair]]> + + Ubrir camara + + Cancelar + + + + Superior + + Inferior + + + + Claro + + Fosco + + Establiu per lo cabidador de batería + + Seguir tema d’o dispositivo + + + + Sesions + + Capturas de pantalla + + Descargas + + Marcapachinas + + Marcapachinas d’escritorio + + Menú Marcapachinas + + Barra de ferramientas de marcapachinas + + Atros marcapachinas + + Historial + + Pestanyas sincronizadas + + Lista de lectura + + Busqueda + + Achustes + + Menú de l’elemento de l’historial + + Zarrar + + + + Pestanyas ubiertas + + Sesión privada + + Pestanyas privadas + + Anyadir pestanya + + Anyadir pestanya privada + + Privada + + Pestanyas ubiertas + + Alzar en a colección + + Compartir totas las pestanyas + + Zarrar totas las pestanyas + + Nueva pestanya + + Ir ta l’inicio + + Alternar modo de pestanya + + Borrar pestanya d’a colección + + Zarrar pestanya + + Zarrar pestanya %s + + Ubrir menú de pestanyas + + Zarrar totas las pestanyas + + Compartir pestanyas + + Alzar pestanyas en a colección + + Menú de pestanya + + Compartir pestanya + + Borrar + + Alzar + + Compartir + + Imachen d’a sesión actual + + Alzar en colección + + Borrar colección + + Cambiar nombre a colección + + Ubrir pestanyas + + Borrar + + %1$s (modo privau) + + + + Borrar historial + + Seguro que quiers limpiar lo historial? + + Historial borrau + + S’ha borrau %1$s + + Limpiar + + Copiar + + Compartir + + Ubrir en una nueva pestanya + + Ubrir en una pestanya privada + + Borrar + + %1$d triau(s) + + Borrar %1$d elementos + + Zagueras 24 horas + + Zaguers 7 días + + Zaguers 30 días + + Mas antigo + + No i hai garra historial + + + + Lo sentimos. %1$s no puede cargar ixa pachina. + + Puetz intentar restaurar-la u zarrar-la. + + Ninviar informe de fallos a Mozilla + + Zarrar pestanya + + Restaurar pestanya + + + Opcions d’a sesión + + + Compartir sesión + + + + Menú d’o marcapachinas + + Editar marcapachinas + + Triar carpeta + + Seguro que quiers borrar esta carpeta? + + S’ha borrau %1$s + + Adhibir carpeta + + S’ha creyau lo marcapachinas. + + S’ha alzau lo marcapachinas + + EDITAR + + Editar + + Triar + + Copiar + + Compartir + + Ubrir en una nueva pestanya + + Ubrir en una pestanya privada + + Borrar + + Alzar + + S’ha triau %1$d + + Editar marcapachinas + + Editar carpeta + + Iniciar sesión pa veyer los marcapachinas sincronizaus + + URL + + CARPETA + + NOMBRE + + Anyadir carpeta + + Triar carpeta + + Ha de tener un titol + + URL no valida + + No i hai marcapachinas aquí + + S’ha borrau %1$s + + Marcapachinas borraus + + DESFER + + + + Permisos + + Ir a Achustes + + Fuella d’achustes rapidos + + Recomendada + + Administrar permisos d’o puesto + + Borrar permisos + + Borrar permisos + + Borrar permisos de totz los puestos + + Reproducir automaticament + + Camara + + Microfono + + Ubicación + + Notificación + + Pedir permiso + + Blocau + + Permitiu + + Blocau per Android + + Excepcions + + Activada + + Desactivada + + Permitir audio y vídeo + + Blocar audio y vídeo nomás con datos mobils + + L’audio y lo vídeo se reproducirán con Wi-Fi + + Blocar solo audio + + Blocar audio y vídeo + + Activau + + Desactivau + + + + Coleccions + + Menú d’a colección + + Colecciona las cosetas que t’importan + + Agrupa busquedas, puestos y pestanyas semellants pa un acceso rapido mas tarde. + + Triar pestanyas + + Triar colección + + Dar nombre a la colección + + Adhibir nueva colección + + Triar tot + + Deixar de triar tot + + Tría las pestanyas que quieras alzar + + %d pestanyas triadas + + %d pestanya triada + + Pestanyas alzadas! + + Pestanya alzada! + + Zarrar + + Alzar + + Veyer + + + Colección %d + + + + Ninviar y compartir + + Compartir + + Compartir + + Compartir un vinclo + + Ninviar a dispositivo + + Totas las accions + + Usau recientment + + Iniciar sesión en Sync + + Ninviar a totz los dispositivos + + Tornar a connectar con Sync + + Sin connexión + + Connectar belatro dispositivo + + Pa ninviar una pestanya, inicia sesión en Firefox a lo menos en unatro dispositivo. + + Entendiu + + No se puede compartir con esta aplicación + + Ninviar a lo dispositivo + + No i hai dispositivos connectaus + + Saber mas sobre cómo ninviar pestanyas… + + Connectar unatro dispositivo… + + + + Sesión de navegación privada + + Borrar pestanyas privadas + + Zarrar pestanyas privadas + + Ubrir + + Borrar y ubrir + + Funciona con + + Colección borrada + + Se cambió lo nombre a la colección + + Pestanya borrada + + Pestanyas borradas + + Pestanya zarrada + + Pestanyas zarradas + + Anyadiu a puestos favoritos! + + Pestanya privada zarrada + + Pestanyas privada zarradas + + Pestanyas privadas borradas + + DESFER + + Puesto borrau + + Desfer + + Confirmar + + Permitir que %1$s ubra %2$s + + PERMITIR + + DENEGAR + + Seguro que quiers borrar %1$s? + + Borrar + + Cancelar + + Accedendo a pantalla completa + + S’ha copiau la URL + + Este ye un texto d’eixemplo. Ye aquí pa amostrar cómo va a amaneixer lo texto quan aumentes u disminuigas la grandaria con esta configuración. + + Aumentar u disminuyir la grandaria d’o texto en puestos web + + Grandaria d’a fuent + + + Grandaria de fuent automatica + + La grandaria d’a fuent será lo mesmo que lo de Android. Desactiva esta opción pa configurar-la aquí. + + + Borrar datos d’o navegador + + Pestanyas ubiertas + + %d pestanyas + + Historial de navegación y datos de puestos + + %d adrezas + + Historial + + %d pachinas + + Cookies + + Se zarrará sesión en a mayoría d’os puestos + + Imachens y fichers en caché + + Libera espacio d’almagazenamiento + + Permisos d’o puesto + + Borrar datos de navegación + + Borrar datos de navegación en salir + + Borrar automaticament los datos de navegación quan tríes "Salir" en o menú prencipal + + Borrar automaticament los datos de navegación quan seleccions \"Salir\" en o menú prencipal + + Salir + + + Se borrarán totz los tuyos datos de navegación. + + %s borrará los datos de navegación triaus. + + Cancelar + + Borrar + + S’han borrau los datos d’o navegador + + Borrando datos de navegación… + + + + Firefox Preview ye agora Firefox Nightly + + Firefox Nightly s’actualiza totas las nueitz y tiene nuevas funcions experimentals. + Manimenos, puede estar menos estable. Descarga lo nuestro navegador beta pa una experiencia mas estable. + + Aconsigue Beta de Firefox pa Android + + + Firefox Nightly s’ha tresladau + + Esta aplicación ya no va a recibir actualizacions de seguranza. Deixa d’usar esta aplicación y cambia a lo nuevo Nightly. + \n\nPara transferir los tuyos marcapachinas, inicios de sesión y historial a unatra aplicación, creya una cuenta Firefox. + + Cambia a lo nuevo Nightly + + + Firefox Nightly s’ha tresladau + + ¶ + · Esta aplicación ya no va a recibir actualizacions de seguranza. Obtiene lo nuevo Nightly y deixa d’usar esta aplicación. + · \n\nPara transferir los tuyos marcapachinas, inicios de sesión y historial a unatra aplicación, creya una cuenta Firefox. + + Obtiene lo nuevo Nightly + + + + Te damos la bienvenida a %s! + + Ya tiens una cuenta? + + Conoixe a %s + + Veyer las novedatz + + Tiens preguntas sobre lo redisenyo de %s? Quiers saber qué ha cambiau? + + Obtiene respuestas aquí + + Quita-le lo millor provecho a %s. + + Ya has iniciau sesión como %s en unatro navegador Firefox d’este telefono. Quiers iniciar sesión con esta cuenta? + + Sí, iniciar sesión + + Iniciando sesión… + + Iniciar sesión en Firefox + + Mantener-me desconnectau + + Sync ye activau + + Error en iniciar sesión + + Privacidat automatica + + La configuración de privacidat y seguranza bloca los elementos de seguimiento, los programas maliciosos y las companyías que te siguen. + + Standard (predeterminau) + + Bloca menos elementos de seguimiento. Las pachinas se cargarán con normalidat. + + Estricta (recomendada) + + Estricto + + Bloca mas elementos de seguimiento, anuncios y finestras emerchents. Las pachinas se cargan mas rapido, pero se puede perder bella funcionalidat. + + Prene una posición + + Preba la navegación con una sola man con a barra de ferramientas inferior u mueve-la a la parte superior. + + Navega de forma privada + + Ubre una pestanya privada una vegada: Toca l’icono %s. + + Ubre siempre pestanyas privadas: Actualiza los achustes d’o tuyo navegador. + + Ubrir achustes + + La tuya privacidat + + Hemos disenyau %s pa dar-te control sobre lo que compartes + en linia y lo que compartes con nusatros. + + Leye lo nuestro aviso de privacidat + + Zarrar + + + Prencipia a navegar + + + + Tría lo tuyo tema + + Cabida un poquet de batería y descansa la vista activando lo modo fosco. + + Automatico + + S’adapta a la configuración d’o tuyo dispositivo + + Tema fosco + + Tema claro + + + Pestanyas ninviadas! + + Pestanya ninviada! + + Imposible ninviar + + REINTENTAR + + Escaniar lo codigo + + https://firefox.com/pair]]> + + Listo pa escaniar + + Inicia sesión con a tuya camara + + Usa lo correu electronico + + Firefox deixará de sincronizar-se con a tuya cuenta, pero no borrará garra dato tuyo de navegación en este dispositivo. + + %s deixará de sincronizar-se con a tuya cuenta, pero no se borrarán los datos de navegación d’este dispositivo. + + Desconnectar + + Cancelar + + No se pueden editar las carpetas predeterminadas + + + + Achustes de protección + + Protección contra seguimiento amillorada + + Navega sin que te sigan + + Proteche los tuyos datos. %s te proteche de muitos de los elementos de seguimiento mas comuns que siguen lo que fas en linia. + + Leyer mas + + Standard (predeterminau) + + Bloca menos elementos de seguimiento. Las pachinas se cargarán con normalidat. + + Qué ye lo que ye blocau per la protección estandard contra lo seguimiento + + Estricto + + Bloca mas elementos de seguimiento, anuncios y finestras emerchents. Las pachinas se cargan mas rapido, pero se puede perder bella funcionalidat. + + Qué ye lo que ye blocau per la protección estricta contra lo seguimiento + + Personalizau + + Tría qué elementos de seguimiento y seqüencias de comandos blocar. + + Esto ye lo que ye blocau per la protección de seguimiento estandard + + + Cookies + + Elementos de seguimiento de puestos y retz socials + + Cookies de puestos no visitaus + + Totas las cookies de tercers (puede causar errors en os puestos web) + + Totas las cookies (qualques puestos no funcionarán correctament) + + Conteniu de seguimiento + + En totas las pestanyas + + Nomás en pestanyas privadas + + Nomás en pestanyas personalizadas + + Criptominers + + Detectores de ditaladas + Blocau + + Permitiu + + Elementos de seguimiento de retz socials + + Limita a los retz socials la suya capacidat de seguimiento d’a tuya actividat de navegación. + + Cookies de seguimiento entre puestos + + Bloca las cookies que utilizan los retz publicitarios y las interpresas d’analisis de datos pa replegar los tuyos datos de navegación en visitar muitos puestos. + + Criptominers + + Priva que los scripts maliciosos obtiengan acceso a lo tuyo dispositivo pa extrayer moneda dichital. + + Detectores de ditaladas + + Impide que se repleguen datos que identifiquen de traza sola a lo tuyo dispositivo y que pueden usar-se pa fins de seguimiento. + + Conteniu de seguimiento + + Bloca la carga de anuncios externos, vídeos y conteniu que contienga codigo de seguimiento. Puede afectar a la funcionalidat d’o puesto web. + + Cada vegada que lo escudo ye de color morau, %s ha blocau elementos de seguimiento en bell puesto. Toca pa mas información. + + Las proteccions son activadas pa este puesto + + Las proteccions son desactivadas pa este puesto + + La protección contra seguimiento amillorada ye desactivada pa estes puestos + + Ir a la pachina anterior + + Las tuyas dreitos + + Bibliotecas de codigo ubierto que utilizamos + + Novedatz de %s + + %s | Bibliotecas OSS + + + Aduya + + Fallos + + Aviso de privacidat + + Conoixe las tuyas dreitos + + Información de licencia + + Bibliotecas que usamos + + Menú de depuración: quedan %1$d clic(s) pa activar-lo + Menú de depuración activau + + + 1 pestanya + + %d pestanyas + + + + Copiar + + Apegar y ir + + Apegar + + URL copiada a lo portafuellas + + + Anyadir a la pantalla d’inicio + + Cancelar + + Anyadir + + Continar a lo puesto web + + Nombre d’acceso directo + + Puetz anyadir facilment este puesto web a la tuya pachina d’inicio pa tener-ie acceso instantanio y navegar rapidament como si estase una aplicación. + + + Inicios de sesión y claus + + Alzar inicios de sesión y claus + + Preguntar antes d’alzar + + No alzar nunca + + Replenar automaticament + + Inicios de sesión sincronizaus + + Activau + + Desactivau + + Tornar a connectar + + Iniciar sesión en Sync + + Inicios de sesión alzaus + + Los inicios de sesión que alces u sincronices con %s s’amostrarán aquí. + + Saber mas sobre Sync. + + Excepcions + + Los inicios de sesión y claus no alzaus amaneixerán aquí. + + No s’alzarán los inicios de sesión y claus pa estes puestos. + + Buscar inicios de sesión + + Alfabeticament + + Usaus recientment + + Puesto + + Nombre d’usuario + + Clau + + Torna a introducir lo PIN + + Desbloquiar pa veyer los inicios de sesión alzaus + + La connexión no ye segura. Los inicios de sesión introducius en esta pachina podrían veyer-se compromesos. + + Saber mas + + Quiers que %s alce este inicio de sesión? + + Alzar + + No alzar + + Clau copiada a lo portafuellas + + Nombre d’usuario copiau a lo portafuellas + + Puesto copiau a lo portafuellas + + Copiar clau + + Copiar nombre d’usuario + + Copiar puesto + + Amostrar clau + + Amagar clau + + Desblocar pa veyer los tuyos inicios de sesión alzaus + + Asegurar los tuyos usuarios y claus + + Configura un patrón de bloqueyo d’o dispositivo, un PIN u una clau pa protecher l’acceso a los tuyos usuarios y claus alzaus si belún mas tiene lo tuyo dispositivo. + + Mas tarde + + Configurar agora + + Desblocar lo tuyo dispositivo + + Zoom en totz los puestos web + + Activar esta opción pa permitir pizcar y fer zoom, mesmo en puestos web que no permiten este chesto. + + Nombre (A-Z) + + Usau per zaguer vegada + + Ordenar menú d’inicio de sesión + + + Anyadir buscador + + Editar buscador + + Anyadir + + Alzar + + Editar + + Borrar + + + Unatro + + Nombre + + Cadena de busqueda a usar + + Substituyir la consulta con “%s”. Eixemplo:\n https://www.google.com/search?q=%s + + Saber-ne mas + + Detalles d’o buscador personalizau + + Vinclo pa saber-ne mas + + + Introducir lo nombre d’o buscador + + Ya existe un buscador con o nombre “%s”. + + Introducir una cadena de busqueda + + Compreba que la cadena de busqueda coincide con o formato de l’eixemplo + + Error en connectar con “%s” + + S’ha creau %s + + S’ha alzau %s + + S’ha borrau %s + + + Te damos la bienvenida a un %s completament nuevo + + T’aspera un navegador completament redisenyau, con un rendimiento y funcions amilloradas pa aduyar-te a fer mas en linia.\n\nEspera mientres actualizamos %s con o tuyo + + Esviellando %s… + + Iniciar %s + + S’ha completau la migración + + Claus + + + Pa permitir-lo: + + 1. Ves ta los achustes de Android + + Permisos]]> + + %1$s]]> + + + Connexión segura + + Connexión insegura + + Seguro que quiers eliminar totz los permisos de totz los puestos? + + Seguro que quiers eliminar totz los permisos pa este puesto? + + Seguro que quiers eliminar este permiso pa este puesto? + + Sin excepcions pa lo puesto + + Articlos prencipals + + Seguro que quiers borrar este marcapachinas? + + Anyadir a puestos favoritos + + Verificau per: %1$s + + Borrar + + Editar + + Seguro que quiers borrar este inicio de sesión? + + Borrar + + Opcions d’inicio de sesión + + Lo campo de texto editable pa l’adreza web de l’inicio de sesión. + + Lo campo de texto editable pa lo nombre d’usuario de l’inicio de sesión. + + Lo campo de texto editable pa la clau de l’inicio de sesión. + + Alzar cambios pa l’inicio de sesión. + + Descartar cambios + + Editar + + Fa falta clau + + Busqueda per voz + + Charra agora + + Ya existe un inicio de sesión con ixe nombre d’usuario + + + + Connectar-se con una cuenta de Firefox. + + Connectar unatro dispositivo. + + Per favor, torna a autentificar-te. + + Per favor, activa la sincronización de pestanyas. + + No tiens garra pestanya ubierta en Firefox en as tuyas atros dispositivos. + + Veyer una lista de pestanyas d’as tuyas atros dispositivos. + + Inicia sesión pa sincronizar + + + + S’ha arribau a lo limite de puestos principals. + + Pa anyadir un nuevo puesto principal, has de borrar-ne belatro. Mantiene pretau lo puesto y selecciona borrar. + + Vale, entendiu + + diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 7b5cf3da7..4f6974c16 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -915,6 +915,15 @@ முன்னோட்ட பயர்பாக்சு இப்போது இராக்கால பயர்பாக்சு + + ஒவ்வொரு இரவும் இராக்கால பயர்பாக்சு மேம்படுத்தப்பட்டு புதிய அம்சங்களைக் கொண்டு வெளியிடப்படுகிறது. + எப்படியாகினும், நிலைப்புத்தன்மை குறைந்திருக்கலாம். மேலும் நல்ல அனுபவத்திற்கு எங்கள் பீட்டா உலாவியைப் பதிவிறக்கவும். + + பீட்டா ஆண்ட்ராய்டு பயர்பாக்சைப் பெறுக + + + இராக்கால பயர்பாக்சு நகர்ந்தது + diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index d0af1657b..4d1776fcd 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -8,6 +8,10 @@ మరిన్ని ఎంపికలు + + అంతరంగిక విహరణను చేతనించు + + అంతరంగిక విహరణను అచేతనించు వెతకండి లేదా చిరునామా ఇవ్వండి @@ -15,6 +19,10 @@ మీ అంతరంగిక ట్యాబులు ఇక్కడ కనిపిస్తాయి. + అంతరంగిక విహారణ గురించి సామాన్య అపోహలు + + సెషనును తొలగించు + ఫరవాలేదు వద్దు @@ -24,6 +32,8 @@ కొత్త ట్యాబు + + కొత్త అంతరంగిక ట్యాబు మేటి సైట్లు @@ -52,8 +62,14 @@ స్థాపించు సింకైన ట్యాబులు + + పేజీలో వెతుకు + + అంతరంగిక ట్యాబు కొత్త ట్యాబు + + సేకరణకు భద్రపరుచు రూపురేఖలు @@ -61,6 +77,13 @@ ఎంచుకున్న భాష + + భాషను వెతకండి + + + ఈసారి దీనితో వెతుకు: + + క్లిప్‌బోర్డ్ నుండి లంకెను పూరించు అనుమతించు @@ -68,6 +91,12 @@ ఇంకా తెలుసుకోండి + + + వెతకండి + + జాలంలో వెతకండి + అమరికలు @@ -140,14 +169,28 @@ అందుకన్న ట్యాబులు + + + ట్రాకింగ్ సంరక్షణ + + ట్రాకింగ్ సంరక్షణ మినహాయింపులు ఇంకా తెలుసుకోండి + + టెలీమెట్రీ + + వాడుక, సాంకేతిక డేటా + + మార్కెటింగ్ డేటా ప్రయోగాలు + + %s ఆరోగ్య నివేదిక + ఖాతాను తొలగించు @@ -211,14 +254,39 @@ భద్రపరుచు + + సేకరణకు భద్రపరుచు + + సేకరణను తొలగించు + + సేకరణ పేరుమార్చు + + తెరిచివున్న ట్యాబులు తీసివేయి + + %1$s (అంతరంగిక రీతి) + చరిత్రను తొలగించు + + మీరు నిజంగానే మీ చరిత్రను తుడిచివేయాలనుకుంటున్నారా? చరిత్ర తొలగించబడింది + + %1$s తొలగించబడింది + + తుడిచివేయి + + కాపీచేయి + + పంచుకోండి + + కొత్త ట్యాబులో తెరువు + + అంతరంగిక ట్యాబులో తెరువు తొలగించు @@ -237,14 +305,29 @@ ఇక్కడ చరిత్రేమీ లేదు + + మీరు ఈ ట్యాబును పునరుద్ధరించడానికి లేదా మూసివేయడానికి ప్రయత్నించవచ్చు. + + క్రాష్ నివేదికను మొజిల్లాకు పంపు ట్యాబును మూసివేయి + + ట్యాబును పునరుద్ధరించు + సెషను ఎంపికలు + + %1$s తొలగించబడింది సంచయం చేర్చు + + ఇష్టాంశం భద్రమయింది! + + కొత్త ట్యాబులో తెరువు + + అంతరంగిక ట్యాబులో తెరువు తొలగించు @@ -254,6 +337,9 @@ పేరు + + చెల్లని URL + అనుమతులు @@ -277,6 +363,12 @@ సేకరణలు + + సేకరణ ఎంపిక + + సేకరణకు పేరు పెట్టడం + + కొత్త సేకరణను చేర్చు అన్నిటినీ ఎంచుకో తొలగించు + + విహరణ డేటా తొలగించబడింది + + + కొత్త నైట్లీకి మారండి + కొత్త నైట్లీని పొందండి diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 738b529bc..96fea71e2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -822,7 +822,7 @@ Deleting this tab will delete the entire collection. You can create new collections at any time. - Delete collection %1$s? + Delete %1$s? Delete @@ -1255,6 +1255,8 @@ Copy username Copy site + + Open site in browser Show password diff --git a/app/src/test/java/org/mozilla/fenix/sync/SyncedTabsLayoutTest.kt b/app/src/test/java/org/mozilla/fenix/sync/SyncedTabsLayoutTest.kt new file mode 100644 index 000000000..7b69743b9 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/sync/SyncedTabsLayoutTest.kt @@ -0,0 +1,21 @@ +/* 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.sync + +import mozilla.components.feature.syncedtabs.view.SyncedTabsView.ErrorType +import org.junit.Assert.assertTrue +import org.junit.Assert.assertFalse +import org.junit.Test + +class SyncedTabsLayoutTest { + @Test + fun `pull to refresh state`() { + assertTrue(SyncedTabsLayout.pullToRefreshEnableState(ErrorType.MULTIPLE_DEVICES_UNAVAILABLE)) + assertTrue(SyncedTabsLayout.pullToRefreshEnableState(ErrorType.SYNC_ENGINE_UNAVAILABLE)) + assertTrue(SyncedTabsLayout.pullToRefreshEnableState(ErrorType.NO_TABS_AVAILABLE)) + assertFalse(SyncedTabsLayout.pullToRefreshEnableState(ErrorType.SYNC_NEEDS_REAUTHENTICATION)) + assertFalse(SyncedTabsLayout.pullToRefreshEnableState(ErrorType.SYNC_UNAVAILABLE)) + } +} diff --git a/build.gradle b/build.gradle index 609fb38a9..6ca271f71 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +import org.mozilla.fenix.gradle.tasks.GithubDetailsTask + buildscript { // This logic is duplicated in the allprojects block: I don't know how to fix that. repositories { @@ -181,9 +183,21 @@ tasks.withType(io.gitlab.arturbosch.detekt.Detekt.class) { exclude("**/tmp/**") } -task listRepositories { +tasks.register("listRepositories") { doLast { println "Repositories:" project.repositories.each { println "Name: " + it.name + "; url: " + it.url } } } + +tasks.register("githubTestDetails", GithubDetailsTask) { + text = "### [Unit Test Results](/reports/test/testGeckoNightlyDebugUnitTest/index.html)" +} + +tasks.register("githubLintDetektDetails", GithubDetailsTask) { + text = "### [Detekt Results](/reports/detekt.html)" +} + +tasks.register("githubLintAndroidDetails", GithubDetailsTask) { + text = "### [Android Lint Results](/reports/lint-results-geckoNightlyDebug.html)" +} diff --git a/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt new file mode 100644 index 000000000..a7a748396 --- /dev/null +++ b/buildSrc/src/main/java/org/mozilla/fenix/gradle/tasks/GithubDetailsTask.kt @@ -0,0 +1,48 @@ +/* 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.gradle.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import java.io.File + +/** + * Helper to write to the "customCheckRunText.md" file for Taskcluster. + * Taskcluster uses this file to populate the "Details" section in the GitHub Checks panel UI. + */ +open class GithubDetailsTask : DefaultTask() { + + /** + * Text to display in the Github Checks panel under "Details". Any markdown works here. + * The text is written to a markdown file which is used by Taskcluster. + * Links are automatically rewritten to point to the correct Taskcluster URL. + */ + @Input + var text: String = "" + + private val detailsFile = File("/builds/worker/github/customCheckRunText.md") + private val suffix = "\n\n_(404 if compilation failed)_" + + /** + * Captures the link name and URL in a markdown link. + * i.e. "### [Hello](/world.html)" -> "/world.html" + */ + private val markdownLinkRegex = """\[(.*)]\((.*)\)""".toRegex() + + @TaskAction + fun writeFile() { + val taskId = System.getenv("TASK_ID") + val url = "https://firefoxci.taskcluster-artifacts.net/$taskId/0/public" + val replaced = text.replace(markdownLinkRegex) { match -> + val (_, linkName, linkUrl) = match.groupValues + "[$linkName](${url + linkUrl})" + } + + project.mkdir("/builds/worker/github") + detailsFile.writeText(replaced + suffix) + } + +} diff --git a/taskcluster/ci/lint/kind.yml b/taskcluster/ci/lint/kind.yml index aa7407d3b..b636e1e98 100644 --- a/taskcluster/ci/lint/kind.yml +++ b/taskcluster/ci/lint/kind.yml @@ -47,7 +47,7 @@ jobs: description: 'Running detekt over all modules' run: using: gradlew - gradlew: [detekt] + gradlew: [detekt, githubLintDetektDetails] treeherder: symbol: detekt worker: @@ -55,6 +55,9 @@ jobs: - name: public/reports path: /builds/worker/checkouts/src/build/reports type: directory + - name: public/github + path: /builds/worker/github + type: directory ktlint: description: 'Running ktlint over all modules' run: @@ -66,7 +69,7 @@ jobs: description: 'Running lint over all modules' run: using: gradlew - gradlew: ['lintGeckoNightlyDebug'] + gradlew: ['lintGeckoNightlyDebug', 'githubLintAndroidDetails'] treeherder: symbol: lint worker: @@ -74,3 +77,6 @@ jobs: - name: public/reports path: /builds/worker/checkouts/src/app/build/reports type: directory + - name: public/github + path: /builds/worker/github + type: directory diff --git a/taskcluster/ci/test/kind.yml b/taskcluster/ci/test/kind.yml index 7cb747f91..8dd5f3d30 100644 --- a/taskcluster/ci/test/kind.yml +++ b/taskcluster/ci/test/kind.yml @@ -40,7 +40,11 @@ jobs: geckoview-engine: geckoNightly code-review: true run: - gradlew: ['clean', '-Pcoverage', 'jacocoGeckoNightlyDebugTestReport'] + gradlew: + - 'clean' + - '-Pcoverage' + - 'jacocoGeckoNightlyDebugTestReport' + - 'githubTestDetails' # post-gradlew: # - ['automation/taskcluster/upload_coverage_report.sh'] secrets: @@ -59,3 +63,6 @@ jobs: - name: public/reports/test path: /builds/worker/checkouts/src/app/build/reports/tests type: directory + - name: public/github + path: /builds/worker/github + type: directory