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 { defaultConfig {
applicationId "com.nextcloud.client" applicationId "com.nextcloud.client"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 34 targetSdkVersion 35
compileSdk 34 compileSdk 35
buildConfigField 'boolean', 'CI', ciBuild.toString() buildConfigField 'boolean', 'CI', ciBuild.toString()
buildConfigField 'boolean', 'RUNTIME_PERF_ANALYSIS', perfAnalysis.toString() buildConfigField 'boolean', 'RUNTIME_PERF_ANALYSIS', perfAnalysis.toString()
@ -147,6 +147,7 @@ android {
buildTypes { buildTypes {
debug { debug {
testCoverageEnabled(project.hasProperty('coverage')) testCoverageEnabled(project.hasProperty('coverage'))
resConfigs "en", "xxxhdpi"
} }
} }
@ -186,7 +187,6 @@ android {
} }
} }
testOptions { testOptions {
unitTests.returnDefaultValues = true unitTests.returnDefaultValues = true
animationsDisabled true animationsDisabled true
@ -261,6 +261,10 @@ android {
// Adds exported schema location as test app assets. // Adds exported schema location as test app assets.
androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
} }
kapt {
useBuildCache true
}
} }
dependencies { dependencies {

View file

@ -18,12 +18,8 @@ class AppInfoImpl : AppInfo {
override fun getAppVersion(context: Context): String { override fun getAppVersion(context: Context): String {
return try { return try {
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
if (pInfo != null) { packageInfo.versionName ?: "n/a"
pInfo.versionName
} else {
"n/a"
}
} catch (e: PackageManager.NameNotFoundException) { } catch (e: PackageManager.NameNotFoundException) {
Log_OC.e(this, "Trying to get packageName", e.cause) Log_OC.e(this, "Trying to get packageName", e.cause)
"n/a" "n/a"

View file

@ -15,7 +15,6 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
@ -82,7 +81,6 @@ class EditImageActivity :
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars()) windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
window.statusBarColor = ContextCompat.getColor(this, R.color.black)
window.navigationBarColor = getColor(R.color.black) window.navigationBarColor = getColor(R.color.black)
setupCropper() 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.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.view.WindowInsets
import android.view.WindowManager
import android.widget.Toast 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.R
import com.owncloud.android.datamodel.ReceiverFlag 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 { fun Context.statusBarHeight(): Int {
return try { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
resources.getDimensionPixelSize( val windowInsets = (getSystemService(Context.WINDOW_SERVICE) as WindowManager)
resources.getIdentifier("status_bar_height", "dimen", "android") .currentWindowMetrics
) .windowInsets
} catch (e: android.content.res.Resources.NotFoundException) { val insets = windowInsets.getInsets(WindowInsets.Type.statusBars())
0 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.graphics.Outline
import android.util.TypedValue import android.util.TypedValue
import android.view.View import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider import android.view.ViewOutlineProvider
fun View?.setVisibleIf(condition: Boolean) { 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 { fun createRoundedOutline(context: Context, cornerRadiusValue: Float): ViewOutlineProvider {
return object : ViewOutlineProvider() { return object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) { 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.accounts.Account;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import com.nextcloud.client.account.User; 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.mixins.SessionMixin;
import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.client.preferences.DarkMode; import com.nextcloud.client.preferences.DarkMode;
import com.nextcloud.utils.extensions.WindowExtensionsKt;
import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
@ -27,6 +30,8 @@ import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.activity.EdgeToEdge;
import androidx.activity.SystemBarStyle;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -44,14 +49,14 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab
private boolean paused; private boolean paused;
protected boolean enableAccountHandling = true; protected boolean enableAccountHandling = true;
private MixinRegistry mixinRegistry = new MixinRegistry(); private final MixinRegistry mixinRegistry = new MixinRegistry();
private SessionMixin sessionMixin; private SessionMixin sessionMixin;
@Inject UserAccountManager accountManager; @Inject UserAccountManager accountManager;
@Inject AppPreferences preferences; @Inject AppPreferences preferences;
@Inject FileDataStorageManager fileDataStorageManager; @Inject FileDataStorageManager fileDataStorageManager;
private AppPreferences.Listener onPreferencesChanged = new AppPreferences.Listener() { private final AppPreferences.Listener onPreferencesChanged = new AppPreferences.Listener() {
@Override @Override
public void onDarkThemeModeChanged(DarkMode mode) { public void onDarkThemeModeChanged(DarkMode mode) {
onThemeSettingsModeChanged(); onThemeSettingsModeChanged();
@ -64,6 +69,13 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
boolean isApiLevel35OrHigher = (Build.VERSION.SDK_INT >= 35);
if (isApiLevel35OrHigher) {
enableEdgeToEdge();
WindowExtensionsKt.addSystemBarPaddings(getWindow());
}
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sessionMixin = new SessionMixin(this, accountManager); sessionMixin = new SessionMixin(this, accountManager);
mixinRegistry.add(sessionMixin); 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 @Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) { protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState); super.onPostCreate(savedInstanceState);

View file

@ -17,7 +17,6 @@ import android.view.View
import android.view.WindowInsetsController import android.view.WindowInsetsController
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.nextcloud.client.account.User import com.nextcloud.client.account.User
@ -108,7 +107,6 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I
} }
private fun setupStatusBar() { private fun setupStatusBar() {
window.statusBarColor = ContextCompat.getColor(this, R.color.bg_default)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val appearanceLightStatusBars = if (preferences.isDarkModeEnabled) { val appearanceLightStatusBars = if (preferences.isDarkModeEnabled) {
0 0

View file

@ -23,6 +23,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.ListPreference; import android.preference.ListPreference;
import android.preference.Preference; 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.AppPreferences;
import com.nextcloud.client.preferences.AppPreferencesImpl; import com.nextcloud.client.preferences.AppPreferencesImpl;
import com.nextcloud.client.preferences.DarkMode; 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.nextcloud.utils.mdm.MDMConfig;
import com.owncloud.android.MainApp; import com.owncloud.android.MainApp;
import com.owncloud.android.R; import com.owncloud.android.R;
@ -144,6 +147,12 @@ public class SettingsActivity extends PreferenceActivity
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
boolean isApiLevel35OrHigher = (Build.VERSION.SDK_INT >= 35);
if (isApiLevel35OrHigher) {
WindowExtensionsKt.addSystemBarPaddings(getWindow());
WindowExtensionsKt.setNoLimitLayout(getWindow());
}
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getDelegate().installViewFactory(); 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 // workaround for mismatched color when app dark mode and system dark mode don't agree
setListBackground(); setListBackground();
showPasscodeDialogIfEnforceAppProtection(); 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() { private void showPasscodeDialogIfEnforceAppProtection() {

View file

@ -18,6 +18,8 @@ import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.AsyncTask import android.os.AsyncTask
@ -34,6 +36,8 @@ import android.widget.LinearLayout
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.appcompat.content.res.AppCompatResources 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.graphics.drawable.DrawableCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat 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.ui.fileactions.FileActionsBottomSheet.ResultListener
import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.logFileSize import com.nextcloud.utils.extensions.logFileSize
import com.nextcloud.utils.extensions.setTitleColor
import com.nextcloud.utils.extensions.statusBarHeight import com.nextcloud.utils.extensions.statusBarHeight
import com.owncloud.android.R import com.owncloud.android.R
import com.owncloud.android.databinding.ActivityPreviewMediaBinding import com.owncloud.android.databinding.ActivityPreviewMediaBinding
@ -234,22 +239,38 @@ class PreviewMediaActivity :
return 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 if (isFileVideo()) {
binding.imagePreview.visibility = if (isFileVideo) View.GONE else View.VISIBLE
if (isFileVideo) {
binding.root.setBackgroundColor(resources.getColor(R.color.black, null)) binding.root.setBackgroundColor(resources.getColor(R.color.black, null))
} }
} }
private fun isFileVideo(): Boolean = MimeTypeUtil.isVideo(file)
private fun configureSystemBars() { private fun configureSystemBars() {
updateActionBarTitleAndHomeButton(file) updateActionBarTitleAndHomeButton(file)
supportActionBar?.let { supportActionBar?.let {
it.setDisplayHomeAsUpEnabled(true) it.setDisplayHomeAsUpEnabled(true)
viewThemeUtils.files.themeActionBar(this, it) 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( viewThemeUtils.platform.themeStatusBar(
@ -520,6 +541,12 @@ class PreviewMediaActivity :
override fun onCreateOptionsMenu(menu: Menu?): Boolean { override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.custom_menu_placeholder, menu) 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 return true
} }

View file

@ -77,7 +77,7 @@ class WebViewUtil(private val context: Context) {
return try { return try {
val pi = pm.getPackageInfo("com.google.android.webview", 0) 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 // Split the version string by "." and get the first part
val versionParts = fullVersion.split("\\.".toRegex()).dropLastWhile { it.isEmpty() } val versionParts = fullVersion.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -11,7 +11,6 @@
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"> tools:openDrawer="start">
<LinearLayout <LinearLayout

View file

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

View file

@ -12,7 +12,6 @@
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"> tools:openDrawer="start">
<androidx.coordinatorlayout.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout

View file

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

View file

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

View file

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

View file

@ -34,6 +34,14 @@
<string name="advanced_settings">Paràmetres avançats</string> <string name="advanced_settings">Paràmetres avançats</string>
<string name="allow_resharing">Permet compartir de nou</string> <string name="allow_resharing">Permet compartir de nou</string>
<string name="app_config_base_url_title">URL base</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_config_proxy_port_title">Port del proxy</string>
<string name="app_widget_description">Mostra un giny del tauler</string> <string name="app_widget_description">Mostra un giny del tauler</string>
<string name="appbar_search_in">Cerca a %s</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_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_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_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_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_top_bar_title">Assistent</string>
<string name="assistant_screen_unknown_task_status_text">Desconegut</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_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="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_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_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="auto_upload_path">/Càrrega automàtica</string>
<string name="autoupload_configure">Configura</string> <string name="autoupload_configure">Configura</string>
@ -180,7 +191,10 @@
<string name="conflict_folder_headline">Conflicte de carpetes</string> <string name="conflict_folder_headline">Conflicte de carpetes</string>
<string name="conflict_local_file">Fitxer local</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">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="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_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="contactlist_no_permission">No s\'han concedit permisos, no s\'ha importat res</string>
<string name="contacts">Contactes</string> <string name="contacts">Contactes</string>
@ -207,6 +221,7 @@
<string name="create_new_presentation">Nova presentació</string> <string name="create_new_presentation">Nova presentació</string>
<string name="create_new_spreadsheet">Nou full de càlcul</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="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="credentials_disabled">Credencials inhabilitades</string>
<string name="daily_backup">Còpia de seguretat diària</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> <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="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="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_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="disable_new_media_folder_detection_notifications">Inhabilita</string>
<string name="dismiss">Descarta</string> <string name="dismiss">Descarta</string>
<string name="dismiss_notification_description">Descarta la notificació</string> <string name="dismiss_notification_description">Descarta la notificació</string>
<string name="displays_mnemonic">Mostra la vostra contrasenya de 12 paraules</string> <string name="displays_mnemonic">Mostra la vostra contrasenya de 12 paraules</string>
<string name="dnd">No molesteu</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_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="done">Fet</string>
<string name="dontClear">No esborrar</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_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="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_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> <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_in_progress_ticker">S\'està descarregant…</string>
<string name="downloader_download_succeeded_content">%1$s descarregat</string> <string name="downloader_download_succeeded_content">%1$s descarregat</string>
<string name="downloader_download_succeeded_ticker">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_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_close">Tanca la barra lateral</string>
<string name="drawer_community">Comunitat</string> <string name="drawer_community">Comunitat</string>
<string name="drawer_header_background">Imatge de fons de la capçalera del calaix</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_assistant">Assistent</string>
<string name="drawer_item_favorites">Preferits</string> <string name="drawer_item_favorites">Preferits</string>
<string name="drawer_item_gallery">Multimèdia</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_home">Inici</string>
<string name="drawer_item_notifications">Notificacions</string> <string name="drawer_item_notifications">Notificacions</string>
<string name="drawer_item_on_device">Al dispositiu</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_recently_modified">Modificat recentment</string>
<string name="drawer_item_shared">Compartit</string> <string name="drawer_item_shared">Compartit</string>
<string name="drawer_item_trashbin">Fitxers suprimits</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">%1$s de %2$s en ús</string>
<string name="drawer_quota_unlimited">%1$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="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_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_assistant">Assistent</string>
<string name="ecosystem_apps_display_more">Més</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_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_notes">Notes del Nextcloud</string>
<string name="ecosystem_apps_talk">Nextcloud Talk</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="encrypted">Activa el xifrat</string>
<string name="end_to_end_encryption_confirm_button">Arranjament de 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> <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_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_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_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_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_accounts">Comptes</string>
<string name="etm_background_job_created">S\'ha creat</string> <string name="etm_background_job_created">S\'ha creat</string>
<string name="etm_background_job_name">Nom de la tasca</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_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="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_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_on_wifi">Carica solo su Wi-Fi senza limitazioni</string>
<string name="auto_upload_path">/AutoUpload</string> <string name="auto_upload_path">/AutoUpload</string>
<string name="autoupload_configure">Configura</string> <string name="autoupload_configure">Configura</string>

View file

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

View file

@ -19,11 +19,11 @@ apply plugin: 'kotlin-android'
android { android {
namespace 'com.nextcloud.appscan' namespace 'com.nextcloud.appscan'
compileSdk 34
defaultConfig { defaultConfig {
minSdk 21 minSdk 24
targetSdk 34 targetSdk 35
compileSdk 35
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -45,6 +45,6 @@ android {
} }
dependencies { dependencies {
implementation "androidx.appcompat:appcompat:1.7.0" implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion" implementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion"
} }

View file

@ -37,9 +37,9 @@ buildscript {
subprojects { subprojects {
buildscript { buildscript {
repositories { repositories {
gradlePluginPortal()
google() google()
mavenCentral() mavenCentral()
gradlePluginPortal()
} }
} }
repositories { 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 # 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 org.gradle.dependency.verification.console=verbose
kotlin.daemon.jvmargs=-Xmx4096m kotlin.daemon.jvmargs=-Xmx6144m -XX:+UseParallelGC
org.gradle.caching=true org.gradle.caching=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.configureondemand=true org.gradle.configureondemand=true
kapt.incremental.apt=true
# Needed for local libs # Needed for local libs
# org.gradle.dependency.verification=lenient # org.gradle.dependency.verification=lenient

View file

@ -188,7 +188,10 @@
<trusting group="com.sun.activation" name="all" version="1.2.1"/> <trusting group="com.sun.activation" name="all" version="1.2.1"/>
<trusting group="jakarta.activation"/> <trusting group="jakarta.activation"/>
</trusted-key> </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="6F656B7F6BFB238D38ACF81F3C27D97B0C83A85C" group="com.google.errorprone"/>
<trusted-key id="6F7E5ACBCD02DB60DFD232E45E1F79A7C298661E" group="com.google.auto"/> <trusted-key id="6F7E5ACBCD02DB60DFD232E45E1F79A7C298661E" group="com.google.auto"/>
<trusted-key id="720746177725A89207A7075BFD5DEA07FCB690A8" group="org.codehaus.mojo" name="mojo-parent" version="50"/> <trusted-key id="720746177725A89207A7075BFD5DEA07FCB690A8" group="org.codehaus.mojo" name="mojo-parent" version="50"/>
@ -5699,10 +5702,14 @@
</component> </component>
<component group="com.android.tools.build" name="transform-api" version="2.0.0-deprecated-use-gradle-api"> <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"> <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>
<artifact name="transform-api-2.0.0-deprecated-use-gradle-api.pom"> <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> </artifact>
</component> </component>
<component group="com.android.tools.build.jetifier" name="jetifier-core" version="1.0.0-beta10"> <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"/> <sha256 value="8347e5c10c0f818183e419da3e98a0e83679b5dd358d07d00495fef377ff69d1" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact> </artifact>
</component> </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"> <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"> <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"/> <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"/> <sha256 value="fe78fa62efbf0c89ebef4bb0695ab219f41d802e854aafe0fedc561b1bc4a0d7" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact> </artifact>
</component> </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"> <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.16.1">
<artifact name="atomicfu-0.16.1.module"> <artifact name="atomicfu-0.16.1.module">
<sha256 value="fdcf04fc25f6a43f557f341ee0053caa25e759f591169c86566f1dad37fc77a6" origin="Generated by Gradle"/> <sha256 value="fdcf04fc25f6a43f557f341ee0053caa25e759f591169c86566f1dad37fc77a6" origin="Generated by Gradle"/>