Merge remote-tracking branch 'origin/master' into dev

This commit is contained in:
Tobias Kaminsky 2024-12-10 03:39:50 +01:00
commit 29cba8abe7
32 changed files with 245 additions and 62 deletions

View file

@ -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 {

View file

@ -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"

View file

@ -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()

View file

@ -0,0 +1,19 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
* 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
}

View file

@ -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
}
}

View file

@ -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) {

View file

@ -0,0 +1,39 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
* 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
}
}

View file

@ -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);

View file

@ -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

View file

@ -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() {

View file

@ -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
}

View file

@ -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() }

View file

@ -12,7 +12,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<LinearLayout

View file

@ -11,7 +11,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<androidx.coordinatorlayout.widget.CoordinatorLayout

View file

@ -12,7 +12,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<!-- The main content view -->

View file

@ -9,8 +9,7 @@
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
android:layout_height="match_parent">
<!-- The main content view -->
<RelativeLayout

View file

@ -17,7 +17,6 @@
android:layout_gravity="start"
android:layout_weight="1"
android:background="@color/appbar"
android:fitsSystemWindows="true"
android:theme="@style/NavigationView_ItemTextAppearance"
app:headerLayout="@layout/drawer_header"
app:itemTextColor="@color/drawer_text_color"

View file

@ -13,7 +13,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primary"
android:fitsSystemWindows="true"
android:gravity="center"
android:orientation="vertical">

View file

@ -11,7 +11,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<!-- The main content view -->

View file

@ -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">
<LinearLayout

View file

@ -11,7 +11,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<!-- The main content view -->

View file

@ -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">
<androidx.coordinatorlayout.widget.CoordinatorLayout

View file

@ -10,7 +10,6 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:id="@+id/root_layout"
android:orientation="vertical">

View file

@ -12,7 +12,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<!-- The main content view -->

View file

@ -12,7 +12,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:fitsSystemWindows="true"
android:focusable="true">
<!-- The main content view -->

View file

@ -34,6 +34,14 @@
<string name="advanced_settings">Paràmetres avançats</string>
<string name="allow_resharing">Permet compartir de nou</string>
<string name="app_config_base_url_title">URL base</string>
<string name="app_config_disable_clipboard_title">Inhabilitació del porta-retalls</string>
<string name="app_config_disable_intro_title">Inhabilitació de la introducció</string>
<string name="app_config_disable_log_title">Inhabilitació del registre</string>
<string name="app_config_disable_more_external_site_title">Inhabilitació de llocs externs</string>
<string name="app_config_disable_multiaccount_title">Inhabilitació de compte múltiple</string>
<string name="app_config_disable_sharing_title">Inhabilitació de la compartició</string>
<string name="app_config_enforce_protection_title">Aplicació de la protecció</string>
<string name="app_config_proxy_host_title">Nom del servidor intermediari</string>
<string name="app_config_proxy_port_title">Port del proxy</string>
<string name="app_widget_description">Mostra un giny del tauler</string>
<string name="appbar_search_in">Cerca a %s</string>
@ -54,6 +62,7 @@
<string name="assistant_screen_task_delete_success_message">La tasca s\'ha suprimit correctament</string>
<string name="assistant_screen_task_list_error_state_message">No s\'ha pogut obtenir la llista de tasques. Comproveu la vostra connexió a Internet.</string>
<string name="assistant_screen_task_more_actions_bottom_sheet_delete_action">Suprimeix la tasca</string>
<string name="assistant_screen_task_output_empty_text">La sortida de la tasca encara no està a punt.</string>
<string name="assistant_screen_task_types_error_state_message">No s\'han pogut obtenir els tipus de tasques. Comproveu la connexió a Internet.</string>
<string name="assistant_screen_top_bar_title">Assistent</string>
<string name="assistant_screen_unknown_task_status_text">Desconegut</string>
@ -93,6 +102,8 @@
<string name="authenticator_activity_login_error">S\'ha produït un error en processar la sol·licitud d\'inici de sessió. Torneu-ho a provar més tard.</string>
<string name="authenticator_activity_please_complete_login_process">Completeu el procés d\'inici de sessió al navegador</string>
<string name="auto_upload_file_behaviour_kept_in_folder">manté a la carpeta original, ja que és només de lectura</string>
<string name="auto_upload_gplay">S\'ha canviat el comportament de la càrrega automàtica</string>
<string name="auto_upload_gplay_desc">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.</string>
<string name="auto_upload_on_wifi">Pujada només quan hi hagi Wi-Fi sense límits</string>
<string name="auto_upload_path">/Càrrega automàtica</string>
<string name="autoupload_configure">Configura</string>
@ -180,7 +191,10 @@
<string name="conflict_folder_headline">Conflicte de carpetes</string>
<string name="conflict_local_file">Fitxer local</string>
<string name="conflict_message_description">Si seleccioneu ambdues versions, s\'afegirà un numero al nom del fitxer local.</string>
<string name="conflict_message_description_for_folder">Si seleccioneu ambdues versions, la carpeta local tindrà un número afegit al nom.</string>
<string name="conflict_server_file">Fitxer del servidor</string>
<string name="contact_backup_title">Còpia de seguretat dels contactes</string>
<string name="contact_no_permission">Cal permís dels contactes.</string>
<string name="contactlist_item_icon">Icona d\'usuari per a la llista de contactes</string>
<string name="contactlist_no_permission">No s\'han concedit permisos, no s\'ha importat res</string>
<string name="contacts">Contactes</string>
@ -207,6 +221,7 @@
<string name="create_new_presentation">Nova presentació</string>
<string name="create_new_spreadsheet">Nou full de càlcul</string>
<string name="create_rich_workspace">Afegiu una descripció per a la carpeta</string>
<string name="creates_rich_workspace">Afegeix la descripció de la carpeta</string>
<string name="credentials_disabled">Credencials inhabilitades</string>
<string name="daily_backup">Còpia de seguretat diària</string>
<string name="data_to_back_up">Dades a fer una còpia de seguretat</string>
@ -223,15 +238,21 @@
<string name="did_not_check_for_dupes">No s\'han verificat els duplicats.</string>
<string name="digest_algorithm_not_available">Aquest algorisme de resum no és disponible al vostre telèfon.</string>
<string name="direct_login_failed">l\'Inici de sessió via enllaç directe ha fallat!</string>
<string name="direct_login_text">Inicia la sessió amb %1$s a %2$s</string>
<string name="disable_new_media_folder_detection_notifications">Inhabilita</string>
<string name="dismiss">Descarta</string>
<string name="dismiss_notification_description">Descarta la notificació</string>
<string name="displays_mnemonic">Mostra la vostra contrasenya de 12 paraules</string>
<string name="dnd">No molesteu</string>
<string name="document_scan_export_dialog_images">Múltiples imatges</string>
<string name="document_scan_export_dialog_pdf">Fitxer PDF</string>
<string name="document_scan_export_dialog_title">Trieu el tipus d\'exportació</string>
<string name="document_scan_pdf_generation_failed">Ha fallat la generació del PDF</string>
<string name="document_scan_pdf_generation_in_progress">S\'està generant el PDF...</string>
<string name="done">Fet</string>
<string name="dontClear">No esborrar</string>
<string name="download_cannot_create_file">No s\'ha pogut crear el fitxer local</string>
<string name="download_download_invalid_local_file_name">Nom de fitxer no vàlid per al fitxer local</string>
<string name="download_latest_dev_version">Baixa la darrera versió de desenvolupament</string>
<string name="downloader_download_failed_content">No s\'ha pogut baixar%1$s</string>
<string name="downloader_download_failed_credentials_error">La baixada ha fallat, torneu a iniciar la sessió</string>
@ -241,7 +262,10 @@
<string name="downloader_download_in_progress_ticker">S\'està descarregant…</string>
<string name="downloader_download_succeeded_content">%1$s descarregat</string>
<string name="downloader_download_succeeded_ticker">Descarregat</string>
<string name="downloader_file_download_cancelled">Alguns fitxers s\'han cancel·lat durant la baixada que ha fet l\'usuari</string>
<string name="downloader_file_download_failed">S\'ha produït un error en baixar els fitxers</string>
<string name="downloader_not_downloaded_yet">Encara no s\'ha descarregat</string>
<string name="downloader_unexpected_error">S\'ha produït un error inesperat en baixar els fitxers</string>
<string name="drawer_close">Tanca la barra lateral</string>
<string name="drawer_community">Comunitat</string>
<string name="drawer_header_background">Imatge de fons de la capçalera del calaix</string>
@ -250,9 +274,11 @@
<string name="drawer_item_assistant">Assistent</string>
<string name="drawer_item_favorites">Preferits</string>
<string name="drawer_item_gallery">Multimèdia</string>
<string name="drawer_item_groupfolders">Carpetes de grup</string>
<string name="drawer_item_home">Inici</string>
<string name="drawer_item_notifications">Notificacions</string>
<string name="drawer_item_on_device">Al dispositiu</string>
<string name="drawer_item_personal_files">Fitxers personals</string>
<string name="drawer_item_recently_modified">Modificat recentment</string>
<string name="drawer_item_shared">Compartit</string>
<string name="drawer_item_trashbin">Fitxers suprimits</string>
@ -262,12 +288,19 @@
<string name="drawer_quota">%1$s de %2$s en ús</string>
<string name="drawer_quota_unlimited">%1$s en ús</string>
<string name="drawer_synced_folders">Pujada automàtica</string>
<string name="e2e_counter_too_old">El comptador és massa antic</string>
<string name="e2e_hash_not_found">No s\'ha trobat la funció resum</string>
<string name="e2e_not_yet_setup">E2E encara no està configurat</string>
<string name="e2e_offline">No és possible sense connexió a Internet</string>
<string name="e2e_signature_does_not_match">La signatura no coincideix</string>
<string name="ecosystem_apps_display_assistant">Assistent</string>
<string name="ecosystem_apps_display_more">Més</string>
<string name="ecosystem_apps_display_notes">Notes</string>
<string name="ecosystem_apps_display_talk">Converses</string>
<string name="ecosystem_apps_more">Més aplicacions de Nextcloud</string>
<string name="ecosystem_apps_notes">Notes del Nextcloud</string>
<string name="ecosystem_apps_talk">Nextcloud Talk</string>
<string name="email_pick_failed">No s\'ha pogut triar l\'adreça electrònica.</string>
<string name="encrypted">Activa el xifrat</string>
<string name="end_to_end_encryption_confirm_button">Arranjament de xifrat</string>
<string name="end_to_end_encryption_decrypting">S\'està desxifrant…</string>
@ -298,7 +331,9 @@
<string name="error_report_issue_text">Informa d\'un problema al seguidor? (requereix un compte de GitHub)</string>
<string name="error_retrieving_file">S\'ha produït un error mentre es recuperava el fitxer</string>
<string name="error_retrieving_templates">S\'ha produït un error recuperant les plantilles</string>
<string name="error_showing_encryption_dialog">S\'ha produït un error en mostrar el quadre de diàleg de configuració del xifratge</string>
<string name="error_starting_direct_camera_upload">S\'ha produït un error iniciant la càmera</string>
<string name="error_starting_doc_scan">S\'ha produït un error en iniciar l\'escaneig del document</string>
<string name="etm_accounts">Comptes</string>
<string name="etm_background_job_created">S\'ha creat</string>
<string name="etm_background_job_name">Nom de la tasca</string>

View file

@ -103,6 +103,8 @@
<string name="authenticator_activity_login_error">C\'è stato un problema nella richiesta di login. Per favore, riprova più tardi</string>
<string name="authenticator_activity_please_complete_login_process">Completa il procedimento di login nel tuo browser</string>
<string name="auto_upload_file_behaviour_kept_in_folder">lasciato nella cartella originale, poiché è in sola lettura</string>
<string name="auto_upload_gplay">Il comportamento del caricamento automatico è stato modificato</string>
<string name="auto_upload_gplay_desc">A causa delle nuove restrizioni imposte da Google, la funzionalità di caricamento automatico non sarà più in grado di rimuovere automaticamente i file caricati.</string>
<string name="auto_upload_on_wifi">Carica solo su Wi-Fi senza limitazioni</string>
<string name="auto_upload_path">/AutoUpload</string>
<string name="autoupload_configure">Configura</string>

View file

@ -51,7 +51,6 @@
<dimen name="list_item_share_right_margin">12dp</dimen>
<dimen name="live_photo_indicator_vertical_padding">3dp</dimen>
<dimen name="live_photo_indicator_horizontal_padding">16dp</dimen>
<dimen name="file_list_item_avatar_icon_radius">10dp</dimen>
<dimen name="account_action_layout_height">72dp</dimen>
<dimen name="zero">0dp</dimen>
@ -136,7 +135,7 @@
<dimen name="permission_dialog_text_size">18sp</dimen>
<dimen name="button_corner_radius">24dp</dimen>
<dimen name="backup_button_width">160dp</dimen>
<dimen name="settings_activity_padding">24dp</dimen>
<integer name="media_grid_width">4</integer>
<dimen name="account_action_button_margin">12dp</dimen>
<dimen name="account_action_button_height">50dp</dimen>

View file

@ -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"
}

View file

@ -37,9 +37,9 @@ buildscript {
subprojects {
buildscript {
repositories {
gradlePluginPortal()
google()
mavenCentral()
gradlePluginPortal()
}
}
repositories {

View file

@ -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

View file

@ -188,7 +188,10 @@
<trusting group="com.sun.activation" name="all" version="1.2.1"/>
<trusting group="jakarta.activation"/>
</trusted-key>
<trusted-key id="6F538074CCEBF35F28AF9B066A0975F8B1127B83" group="org.jetbrains.kotlin"/>
<trusted-key id="6F538074CCEBF35F28AF9B066A0975F8B1127B83">
<trusting group="org.jetbrains.kotlin"/>
<trusting group="^org[.]jetbrains[.]kotlin($|([.].*))" regex="true"/>
</trusted-key>
<trusted-key id="6F656B7F6BFB238D38ACF81F3C27D97B0C83A85C" group="com.google.errorprone"/>
<trusted-key id="6F7E5ACBCD02DB60DFD232E45E1F79A7C298661E" group="com.google.auto"/>
<trusted-key id="720746177725A89207A7075BFD5DEA07FCB690A8" group="org.codehaus.mojo" name="mojo-parent" version="50"/>
@ -5699,10 +5702,14 @@
</component>
<component group="com.android.tools.build" name="transform-api" version="2.0.0-deprecated-use-gradle-api">
<artifact name="transform-api-2.0.0-deprecated-use-gradle-api.jar">
<sha256 value="e8b4151ae1679f1abe7a14ee371ac9b3c651ae7b63290d1f586bdd0f78face9a" origin="Generated by Gradle"/>
<sha256 value="e8b4151ae1679f1abe7a14ee371ac9b3c651ae7b63290d1f586bdd0f78face9a" origin="Generated by Gradle" reason="Artifact is not signed">
<also-trust value="4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740"/>
</sha256>
</artifact>
<artifact name="transform-api-2.0.0-deprecated-use-gradle-api.pom">
<sha256 value="d49d179f707d3f3a00b2a7d36136b54aa8d44fa22770703cd82fe52fb39e22eb" origin="Generated by Gradle"/>
<sha256 value="d49d179f707d3f3a00b2a7d36136b54aa8d44fa22770703cd82fe52fb39e22eb" origin="Generated by Gradle" reason="Artifact is not signed">
<also-trust value="7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575"/>
</sha256>
</artifact>
</component>
<component group="com.android.tools.build.jetifier" name="jetifier-core" version="1.0.0-beta10">
@ -14779,6 +14786,11 @@
<sha256 value="8347e5c10c0f818183e419da3e98a0e83679b5dd358d07d00495fef377ff69d1" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin.kapt" name="org.jetbrains.kotlin.kapt.gradle.plugin" version="2.1.0">
<artifact name="org.jetbrains.kotlin.kapt.gradle.plugin-2.1.0.pom">
<sha256 value="26c69e5b5b3c49c748f14755e2bc04f9a3b0fa0b5b156405e0bfeece953c0271" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin.plugin.compose" name="org.jetbrains.kotlin.plugin.compose.gradle.plugin" version="2.0.0">
<artifact name="org.jetbrains.kotlin.plugin.compose.gradle.plugin-2.0.0.pom">
<sha256 value="38e76d688eddcf2d92ab20838c0adf28d8fd5de2cc965edcd273a9b4f7d636de" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -14804,6 +14816,11 @@
<sha256 value="fe78fa62efbf0c89ebef4bb0695ab219f41d802e854aafe0fedc561b1bc4a0d7" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin.plugin.compose" name="org.jetbrains.kotlin.plugin.compose.gradle.plugin" version="2.1.0">
<artifact name="org.jetbrains.kotlin.plugin.compose.gradle.plugin-2.1.0.pom">
<sha256 value="db3bde26de3ea7433086163644a5750e280a1540990e30f1ae99fe80f2d5f160" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="org.jetbrains.kotlinx" name="atomicfu" version="0.16.1">
<artifact name="atomicfu-0.16.1.module">
<sha256 value="fdcf04fc25f6a43f557f341ee0053caa25e759f591169c86566f1dad37fc77a6" origin="Generated by Gradle"/>