mirror of
https://github.com/nextcloud/android.git
synced 2024-12-18 15:01:57 +03:00
Merge remote-tracking branch 'origin/master' into dev
This commit is contained in:
commit
29cba8abe7
32 changed files with 245 additions and 62 deletions
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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() }
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clickable="true"
|
||||
android:fitsSystemWindows="true"
|
||||
android:focusable="true">
|
||||
|
||||
<LinearLayout
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -37,9 +37,9 @@ buildscript {
|
|||
subprojects {
|
||||
buildscript {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
repositories {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"/>
|
||||
|
|
Loading…
Reference in a new issue