diff --git a/app/build.gradle b/app/build.gradle index 0cb398eafe..f3dbd8cdf4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,8 +106,8 @@ android { defaultConfig { applicationId "com.nextcloud.client" minSdkVersion 24 - targetSdkVersion 34 - compileSdk 34 + targetSdkVersion 35 + compileSdk 35 buildConfigField 'boolean', 'CI', ciBuild.toString() buildConfigField 'boolean', 'RUNTIME_PERF_ANALYSIS', perfAnalysis.toString() @@ -147,6 +147,7 @@ android { buildTypes { debug { testCoverageEnabled(project.hasProperty('coverage')) + resConfigs "en", "xxxhdpi" } } @@ -186,7 +187,6 @@ android { } } - testOptions { unitTests.returnDefaultValues = true animationsDisabled true @@ -261,6 +261,10 @@ android { // Adds exported schema location as test app assets. androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } + + kapt { + useBuildCache true + } } dependencies { diff --git a/app/src/main/java/com/nextcloud/client/appinfo/AppInfoImpl.kt b/app/src/main/java/com/nextcloud/client/appinfo/AppInfoImpl.kt index 7fb222b6c2..4c97af52a3 100644 --- a/app/src/main/java/com/nextcloud/client/appinfo/AppInfoImpl.kt +++ b/app/src/main/java/com/nextcloud/client/appinfo/AppInfoImpl.kt @@ -18,12 +18,8 @@ class AppInfoImpl : AppInfo { override fun getAppVersion(context: Context): String { return try { - val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) - if (pInfo != null) { - pInfo.versionName - } else { - "n/a" - } + val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) + packageInfo.versionName ?: "n/a" } catch (e: PackageManager.NameNotFoundException) { Log_OC.e(this, "Trying to get packageName", e.cause) "n/a" diff --git a/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt b/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt index 386c1bbe8e..39692a56aa 100644 --- a/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt +++ b/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt @@ -15,7 +15,6 @@ import android.view.Menu import android.view.MenuItem import android.view.View import androidx.appcompat.content.res.AppCompatResources -import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -82,7 +81,6 @@ class EditImageActivity : val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) windowInsetsController.hide(WindowInsetsCompat.Type.statusBars()) - window.statusBarColor = ContextCompat.getColor(this, R.color.black) window.navigationBarColor = getColor(R.color.black) setupCropper() diff --git a/app/src/main/java/com/nextcloud/utils/extensions/ActionBarExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/ActionBarExtensions.kt new file mode 100644 index 0000000000..3bafc9b850 --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/extensions/ActionBarExtensions.kt @@ -0,0 +1,19 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.utils.extensions + +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import androidx.appcompat.app.ActionBar + +fun ActionBar.setTitleColor(color: Int) { + val text = SpannableString(title ?: "") + text.setSpan(ForegroundColorSpan(color), 0, text.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE) + title = text +} diff --git a/app/src/main/java/com/nextcloud/utils/extensions/ContextExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/ContextExtensions.kt index 0cfc83439e..d69b1891d6 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/ContextExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/ContextExtensions.kt @@ -15,8 +15,11 @@ import android.content.IntentFilter import android.os.Build import android.os.Handler import android.os.Looper +import android.view.WindowInsets +import android.view.WindowManager import android.widget.Toast -import com.google.common.io.Resources +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import com.owncloud.android.R import com.owncloud.android.datamodel.ReceiverFlag @@ -33,21 +36,24 @@ fun Context.registerBroadcastReceiver(receiver: BroadcastReceiver?, filter: Inte } } -/** - * - * @return The height of the status bar in pixel. - * - * @throws Resources.NotFoundException If the resource identifier for `status_bar_height` is not found. - * - */ -@SuppressLint("DiscouragedApi", "InternalInsetResource") fun Context.statusBarHeight(): Int { - return try { - resources.getDimensionPixelSize( - resources.getIdentifier("status_bar_height", "dimen", "android") - ) - } catch (e: android.content.res.Resources.NotFoundException) { - 0 + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val windowInsets = (getSystemService(Context.WINDOW_SERVICE) as WindowManager) + .currentWindowMetrics + .windowInsets + val insets = windowInsets.getInsets(WindowInsets.Type.statusBars()) + insets.top + } else { + @Suppress("DEPRECATION") + val decorView = (getSystemService(Context.WINDOW_SERVICE) as WindowManager) + .defaultDisplay + .let { display -> + val decorView = android.view.View(this) + display.getRealMetrics(android.util.DisplayMetrics()) + decorView + } + val windowInsetsCompat = ViewCompat.getRootWindowInsets(decorView) + windowInsetsCompat?.getInsets(WindowInsetsCompat.Type.statusBars())?.top ?: 0 } } diff --git a/app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt index c024fd4f65..02cdbc3f91 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt @@ -11,6 +11,7 @@ import android.content.Context import android.graphics.Outline import android.util.TypedValue import android.view.View +import android.view.ViewGroup import android.view.ViewOutlineProvider fun View?.setVisibleIf(condition: Boolean) { @@ -27,6 +28,18 @@ fun View?.makeRounded(context: Context, cornerRadius: Float) { } } +fun View?.setMargins(left: Int, top: Int, right: Int, bottom: Int) { + if (this == null) { + return + } + + if (layoutParams is ViewGroup.MarginLayoutParams) { + val param = layoutParams as ViewGroup.MarginLayoutParams + param.setMargins(left, top, right, bottom) + requestLayout() + } +} + fun createRoundedOutline(context: Context, cornerRadiusValue: Float): ViewOutlineProvider { return object : ViewOutlineProvider() { override fun getOutline(view: View, outline: Outline) { diff --git a/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt new file mode 100644 index 0000000000..7d6e38dd59 --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt @@ -0,0 +1,39 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.utils.extensions + +import android.view.View +import android.view.Window +import android.view.WindowManager +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding + +fun Window?.setNoLimitLayout() { + val flag = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + this?.setFlags(flag, flag) +} + +fun Window?.addSystemBarPaddings() { + if (this == null) { + return + } + + ViewCompat.setOnApplyWindowInsetsListener(decorView) { v: View, insets: WindowInsetsCompat -> + val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + + v.updatePadding( + left = bars.left, + top = bars.top, + right = bars.right, + bottom = bars.bottom + ) + + WindowInsetsCompat.CONSUMED + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java index d154b2dccf..af85b9ebeb 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java @@ -9,6 +9,8 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.content.Intent; +import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import com.nextcloud.client.account.User; @@ -18,6 +20,7 @@ import com.nextcloud.client.mixins.MixinRegistry; import com.nextcloud.client.mixins.SessionMixin; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.DarkMode; +import com.nextcloud.utils.extensions.WindowExtensionsKt; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; @@ -27,6 +30,8 @@ import java.util.Optional; import javax.inject.Inject; +import androidx.activity.EdgeToEdge; +import androidx.activity.SystemBarStyle; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -44,14 +49,14 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab private boolean paused; protected boolean enableAccountHandling = true; - private MixinRegistry mixinRegistry = new MixinRegistry(); + private final MixinRegistry mixinRegistry = new MixinRegistry(); private SessionMixin sessionMixin; @Inject UserAccountManager accountManager; @Inject AppPreferences preferences; @Inject FileDataStorageManager fileDataStorageManager; - private AppPreferences.Listener onPreferencesChanged = new AppPreferences.Listener() { + private final AppPreferences.Listener onPreferencesChanged = new AppPreferences.Listener() { @Override public void onDarkThemeModeChanged(DarkMode mode) { onThemeSettingsModeChanged(); @@ -64,6 +69,13 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab @Override protected void onCreate(@Nullable Bundle savedInstanceState) { + boolean isApiLevel35OrHigher = (Build.VERSION.SDK_INT >= 35); + + if (isApiLevel35OrHigher) { + enableEdgeToEdge(); + WindowExtensionsKt.addSystemBarPaddings(getWindow()); + } + super.onCreate(savedInstanceState); sessionMixin = new SessionMixin(this, accountManager); mixinRegistry.add(sessionMixin); @@ -73,6 +85,11 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab } } + private void enableEdgeToEdge() { + final var style = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT); + EdgeToEdge.enable(this, style, style); + } + @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt index 640cf95b6d..1840ca079c 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt @@ -17,7 +17,6 @@ import android.view.View import android.view.WindowInsetsController import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar import com.nextcloud.client.account.User @@ -108,7 +107,6 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I } private fun setupStatusBar() { - window.statusBarColor = ContextCompat.getColor(this, R.color.bg_default) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val appearanceLightStatusBars = if (preferences.isDarkModeEnabled) { 0 diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java index e2619d45d4..bde331c722 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java @@ -23,6 +23,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; @@ -50,6 +51,8 @@ import com.nextcloud.client.network.ConnectivityService; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.nextcloud.client.preferences.DarkMode; +import com.nextcloud.utils.extensions.ViewExtensionsKt; +import com.nextcloud.utils.extensions.WindowExtensionsKt; import com.nextcloud.utils.mdm.MDMConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -144,6 +147,12 @@ public class SettingsActivity extends PreferenceActivity @SuppressWarnings("deprecation") @Override public void onCreate(Bundle savedInstanceState) { + boolean isApiLevel35OrHigher = (Build.VERSION.SDK_INT >= 35); + if (isApiLevel35OrHigher) { + WindowExtensionsKt.addSystemBarPaddings(getWindow()); + WindowExtensionsKt.setNoLimitLayout(getWindow()); + } + super.onCreate(savedInstanceState); getDelegate().installViewFactory(); @@ -187,6 +196,22 @@ public class SettingsActivity extends PreferenceActivity // workaround for mismatched color when app dark mode and system dark mode don't agree setListBackground(); showPasscodeDialogIfEnforceAppProtection(); + + if (isApiLevel35OrHigher) { + adjustTopMarginForActionBar(); + } + } + + private void adjustTopMarginForActionBar() { + if (getListView() == null) { + return; + } + + float topMarginInDp = getResources().getDimension(R.dimen.settings_activity_padding); + int topMarginInPx = DisplayUtils.convertDpToPixel(topMarginInDp, this); + ViewExtensionsKt.setMargins(getListView(), 0, topMarginInPx, 0, 0); + + getWindow().getDecorView().setBackgroundColor(ContextCompat.getColor(this, R.color.bg_default)); } private void showPasscodeDialogIfEnforceAppProtection() { diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt index 4582cd5ca0..1f892cf181 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaActivity.kt @@ -18,6 +18,8 @@ import android.content.DialogInterface import android.content.Intent import android.content.res.Configuration import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.net.Uri import android.os.AsyncTask @@ -34,6 +36,8 @@ import android.widget.LinearLayout import androidx.annotation.OptIn import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat @@ -72,6 +76,7 @@ import com.nextcloud.ui.fileactions.FileActionsBottomSheet.Companion.newInstance import com.nextcloud.ui.fileactions.FileActionsBottomSheet.ResultListener import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.logFileSize +import com.nextcloud.utils.extensions.setTitleColor import com.nextcloud.utils.extensions.statusBarHeight import com.owncloud.android.R import com.owncloud.android.databinding.ActivityPreviewMediaBinding @@ -234,22 +239,38 @@ class PreviewMediaActivity : return } - val isFileVideo = MimeTypeUtil.isVideo(file) + binding.exoplayerView.visibility = if (isFileVideo()) View.VISIBLE else View.GONE + binding.imagePreview.visibility = if (isFileVideo()) View.GONE else View.VISIBLE - binding.exoplayerView.visibility = if (isFileVideo) View.VISIBLE else View.GONE - binding.imagePreview.visibility = if (isFileVideo) View.GONE else View.VISIBLE - - if (isFileVideo) { + if (isFileVideo()) { binding.root.setBackgroundColor(resources.getColor(R.color.black, null)) } } + private fun isFileVideo(): Boolean = MimeTypeUtil.isVideo(file) + private fun configureSystemBars() { updateActionBarTitleAndHomeButton(file) supportActionBar?.let { it.setDisplayHomeAsUpEnabled(true) viewThemeUtils.files.themeActionBar(this, it) + + if (isFileVideo()) { + it.setTitleColor( + resources.getColor( + R.color.white, + null + ) + ) + + it.setHomeAsUpIndicator( + ResourcesCompat.getDrawable(resources, R.drawable.ic_arrow_back, theme) + ?.apply { setTint(Color.WHITE) } + ) + + it.setBackgroundDrawable(ColorDrawable(Color.BLACK)) + } } viewThemeUtils.platform.themeStatusBar( @@ -520,6 +541,12 @@ class PreviewMediaActivity : override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.custom_menu_placeholder, menu) + + if (isFileVideo()) { + val moreMenuItem = menu?.findItem(R.id.custom_menu_placeholder_item) + moreMenuItem?.icon?.setTint(ContextCompat.getColor(this, R.color.white)) + } + return true } diff --git a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt index c3dbbd73e7..b012242179 100644 --- a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt +++ b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt @@ -77,7 +77,7 @@ class WebViewUtil(private val context: Context) { return try { val pi = pm.getPackageInfo("com.google.android.webview", 0) - val fullVersion = pi.versionName + val fullVersion = pi.versionName ?: return null // Split the version string by "." and get the first part val versionParts = fullVersion.split("\\.".toRegex()).dropLastWhile { it.isEmpty() } diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml index 48a7b07773..2e49ac23e7 100644 --- a/app/src/main/res/layout/activity_compose.xml +++ b/app/src/main/res/layout/activity_compose.xml @@ -12,7 +12,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" - android:fitsSystemWindows="true" android:focusable="true"> diff --git a/app/src/main/res/layout/contacts_preference.xml b/app/src/main/res/layout/contacts_preference.xml index e7524a6082..bce8b5ae69 100644 --- a/app/src/main/res/layout/contacts_preference.xml +++ b/app/src/main/res/layout/contacts_preference.xml @@ -9,8 +9,7 @@ + android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/externalsite_webview.xml b/app/src/main/res/layout/externalsite_webview.xml index d2cfbf68a2..090f1c3b75 100644 --- a/app/src/main/res/layout/externalsite_webview.xml +++ b/app/src/main/res/layout/externalsite_webview.xml @@ -11,7 +11,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" - android:fitsSystemWindows="true" android:focusable="true"> diff --git a/app/src/main/res/layout/internal_two_way_sync_layout.xml b/app/src/main/res/layout/internal_two_way_sync_layout.xml index 43476a42db..19d3e50741 100644 --- a/app/src/main/res/layout/internal_two_way_sync_layout.xml +++ b/app/src/main/res/layout/internal_two_way_sync_layout.xml @@ -11,7 +11,6 @@ android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" tools:openDrawer="start"> diff --git a/app/src/main/res/layout/synced_folders_layout.xml b/app/src/main/res/layout/synced_folders_layout.xml index 4e3af068df..ea30c5c95d 100644 --- a/app/src/main/res/layout/synced_folders_layout.xml +++ b/app/src/main/res/layout/synced_folders_layout.xml @@ -12,7 +12,6 @@ android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" tools:openDrawer="start"> diff --git a/app/src/main/res/layout/trashbin_activity.xml b/app/src/main/res/layout/trashbin_activity.xml index d94459347c..1c8fd6e583 100644 --- a/app/src/main/res/layout/trashbin_activity.xml +++ b/app/src/main/res/layout/trashbin_activity.xml @@ -12,7 +12,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" - android:fitsSystemWindows="true" android:focusable="true"> diff --git a/app/src/main/res/layout/upload_list_layout.xml b/app/src/main/res/layout/upload_list_layout.xml index 4de7210cf9..8dfbe1fb69 100755 --- a/app/src/main/res/layout/upload_list_layout.xml +++ b/app/src/main/res/layout/upload_list_layout.xml @@ -12,7 +12,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" - android:fitsSystemWindows="true" android:focusable="true"> diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 66c9e258b5..b233effbdb 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -34,6 +34,14 @@ Paràmetres avançats Permet compartir de nou URL base + Inhabilitació del porta-retalls + Inhabilitació de la introducció + Inhabilitació del registre + Inhabilitació de llocs externs + Inhabilitació de compte múltiple + Inhabilitació de la compartició + Aplicació de la protecció + Nom del servidor intermediari Port del proxy Mostra un giny del tauler Cerca a %s @@ -54,6 +62,7 @@ La tasca s\'ha suprimit correctament No s\'ha pogut obtenir la llista de tasques. Comproveu la vostra connexió a Internet. Suprimeix la tasca + La sortida de la tasca encara no està a punt. No s\'han pogut obtenir els tipus de tasques. Comproveu la connexió a Internet. Assistent Desconegut @@ -93,6 +102,8 @@ S\'ha produït un error en processar la sol·licitud d\'inici de sessió. Torneu-ho a provar més tard. Completeu el procés d\'inici de sessió al navegador manté a la carpeta original, ja que és només de lectura + S\'ha canviat el comportament de la càrrega automàtica + A causa de les noves restriccions imposades per Google, la funció de càrrega automàtica ja no podrà eliminar automàticament els fitxers carregats. Pujada només quan hi hagi Wi-Fi sense límits /Càrrega automàtica Configura @@ -180,7 +191,10 @@ Conflicte de carpetes Fitxer local Si seleccioneu ambdues versions, s\'afegirà un numero al nom del fitxer local. + Si seleccioneu ambdues versions, la carpeta local tindrà un número afegit al nom. Fitxer del servidor + Còpia de seguretat dels contactes + Cal permís dels contactes. Icona d\'usuari per a la llista de contactes No s\'han concedit permisos, no s\'ha importat res Contactes @@ -207,6 +221,7 @@ Nova presentació Nou full de càlcul Afegiu una descripció per a la carpeta + Afegeix la descripció de la carpeta Credencials inhabilitades Còpia de seguretat diària Dades a fer una còpia de seguretat @@ -223,15 +238,21 @@ No s\'han verificat els duplicats. Aquest algorisme de resum no és disponible al vostre telèfon. l\'Inici de sessió via enllaç directe ha fallat! + Inicia la sessió amb %1$s a %2$s Inhabilita Descarta Descarta la notificació Mostra la vostra contrasenya de 12 paraules No molesteu + Múltiples imatges Fitxer PDF + Trieu el tipus d\'exportació + Ha fallat la generació del PDF + S\'està generant el PDF... Fet No esborrar No s\'ha pogut crear el fitxer local + Nom de fitxer no vàlid per al fitxer local Baixa la darrera versió de desenvolupament No s\'ha pogut baixar%1$s La baixada ha fallat, torneu a iniciar la sessió @@ -241,7 +262,10 @@ S\'està descarregant… %1$s descarregat Descarregat + Alguns fitxers s\'han cancel·lat durant la baixada que ha fet l\'usuari + S\'ha produït un error en baixar els fitxers Encara no s\'ha descarregat + S\'ha produït un error inesperat en baixar els fitxers Tanca la barra lateral Comunitat Imatge de fons de la capçalera del calaix @@ -250,9 +274,11 @@ Assistent Preferits Multimèdia + Carpetes de grup Inici Notificacions Al dispositiu + Fitxers personals Modificat recentment Compartit Fitxers suprimits @@ -262,12 +288,19 @@ %1$s de %2$s en ús %1$s en ús Pujada automàtica + El comptador és massa antic + No s\'ha trobat la funció resum E2E encara no està configurat + No és possible sense connexió a Internet + La signatura no coincideix Assistent Més + Notes Converses + Més aplicacions de Nextcloud Notes del Nextcloud Nextcloud Talk + No s\'ha pogut triar l\'adreça electrònica. Activa el xifrat Arranjament de xifrat S\'està desxifrant… @@ -298,7 +331,9 @@ Informa d\'un problema al seguidor? (requereix un compte de GitHub) S\'ha produït un error mentre es recuperava el fitxer S\'ha produït un error recuperant les plantilles + S\'ha produït un error en mostrar el quadre de diàleg de configuració del xifratge S\'ha produït un error iniciant la càmera + S\'ha produït un error en iniciar l\'escaneig del document Comptes S\'ha creat Nom de la tasca diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 10c45e1844..3ec6517f45 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -103,6 +103,8 @@ C\'è stato un problema nella richiesta di login. Per favore, riprova più tardi Completa il procedimento di login nel tuo browser lasciato nella cartella originale, poiché è in sola lettura + Il comportamento del caricamento automatico è stato modificato + A causa delle nuove restrizioni imposte da Google, la funzionalità di caricamento automatico non sarà più in grado di rimuovere automaticamente i file caricati. Carica solo su Wi-Fi senza limitazioni /AutoUpload Configura diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml index af90df2b0f..1d1dba647e 100644 --- a/app/src/main/res/values/dims.xml +++ b/app/src/main/res/values/dims.xml @@ -51,7 +51,6 @@ 12dp 3dp 16dp - 10dp 72dp 0dp @@ -136,7 +135,7 @@ 18sp 24dp 160dp - + 24dp 4 12dp 50dp diff --git a/appscan/build.gradle b/appscan/build.gradle index bdcab491ac..941be8e143 100644 --- a/appscan/build.gradle +++ b/appscan/build.gradle @@ -19,11 +19,11 @@ apply plugin: 'kotlin-android' android { namespace 'com.nextcloud.appscan' - compileSdk 34 defaultConfig { - minSdk 21 - targetSdk 34 + minSdk 24 + targetSdk 35 + compileSdk 35 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -45,6 +45,6 @@ android { } dependencies { - implementation "androidx.appcompat:appcompat:1.7.0" + implementation "androidx.appcompat:appcompat:$appCompatVersion" implementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion" } diff --git a/build.gradle b/build.gradle index 0b23cd2dbb..fa02f23d37 100644 --- a/build.gradle +++ b/build.gradle @@ -37,9 +37,9 @@ buildscript { subprojects { buildscript { repositories { - gradlePluginPortal() google() mavenCentral() + gradlePluginPortal() } } repositories { diff --git a/gradle.properties b/gradle.properties index 8a056693e8..14f2cb920c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,12 +13,13 @@ android.nonFinalResIds=false # JVM arguments to optimize heap usage, enable heap dump on out-of-memory errors, and set the file encoding -org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g org.gradle.dependency.verification.console=verbose -kotlin.daemon.jvmargs=-Xmx4096m +kotlin.daemon.jvmargs=-Xmx6144m -XX:+UseParallelGC org.gradle.caching=true org.gradle.parallel=true org.gradle.configureondemand=true +kapt.incremental.apt=true # Needed for local libs # org.gradle.dependency.verification=lenient diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 3b6892cb82..2c28870a21 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -188,7 +188,10 @@ - + + + + @@ -5699,10 +5702,14 @@ - + + + - + + + @@ -14779,6 +14786,11 @@ + + + + + @@ -14804,6 +14816,11 @@ + + + + +