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

This commit is contained in:
Tobias Kaminsky 2024-02-15 02:31:22 +01:00
commit f23dde55dc
24 changed files with 1029 additions and 118 deletions

View file

@ -30,7 +30,7 @@ jobs:
if: ${{ always() }}
run: scripts/deleteOldComments.sh "test" "Unit" ${{github.event.number}}
- name: Run unit tests with coverage
uses: gradle/gradle-build-action@3b1b3b9a2104c2b47fbae53f3938079c00c9bb87 # v3.0.0
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e # v3.1.0
with:
arguments: jacocoTestGplayDebugUnitTest
- name: Upload failing results

View file

@ -1,27 +1,27 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.5)
CFPropertyList (3.0.6)
rexml
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.604.0)
aws-sdk-core (3.131.2)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
aws-eventstream (1.3.0)
aws-partitions (1.890.0)
aws-sdk-core (3.191.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.57.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (1.77.0)
aws-sdk-core (~> 3, >= 3.191.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.114.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-s3 (1.143.0)
aws-sdk-core (~> 3, >= 3.191.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.0)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
@ -30,14 +30,13 @@ GEM
commander (4.6.0)
highline (~> 2.0.0)
declarative (0.0.20)
digest-crc (0.6.4)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.92.3)
faraday (1.10.0)
excon (0.109.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@ -65,8 +64,8 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
fastlane (2.207.0)
fastimage (2.3.0)
fastlane (2.214.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@ -90,7 +89,7 @@ GEM
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0)
@ -107,9 +106,9 @@ GEM
xcpretty-travis-formatter (>= 0.0.3)
fastlane-plugin-huawei_appgallery_connect (1.0.23)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.25.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-core (0.7.0)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@ -117,31 +116,29 @@ GEM
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.13.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-playcustomapp_v1 (0.10.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-storage_v1 (0.18.0)
google-apis-core (>= 0.7, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.6.1)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.2.0)
google-cloud-storage (1.37.0)
google-cloud-errors (1.3.1)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.2.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
@ -149,37 +146,36 @@ GEM
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.1)
json (2.6.2)
jwt (2.4.1)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.2)
jmespath (1.6.2)
json (2.7.1)
jwt (2.7.1)
mini_magick (4.12.0)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.0.0)
multipart-post (2.4.0)
nanaimo (0.3.0)
naturally (2.2.1)
optparse (0.1.1)
os (1.1.4)
plist (3.6.0)
plist (3.7.1)
public_suffix (4.0.7)
rake (13.0.6)
rake (13.1.0)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.2.5)
rexml (3.2.6)
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.17.0)
signet (0.19.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.8)
simctl (1.6.10)
CFPropertyList
naturally
terminal-notifier (2.0.0)
@ -187,17 +183,13 @@ GEM
unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.7.0)
word_wrap (1.0.0)
xcodeproj (1.22.0)
xcodeproj (1.24.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)

View file

@ -10,7 +10,7 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.5"
classpath "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
classpath 'com.karumi:shot:5.14.1'
classpath 'com.karumi:shot:6.1.0'
classpath "org.jacoco:org.jacoco.core:$jacoco_version"
classpath "org.jacoco:org.jacoco.report:$jacoco_version"
classpath "org.jacoco:org.jacoco.agent:$jacoco_version"
@ -291,7 +291,7 @@ dependencies {
qaImplementation project(':appscan')
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.12.0'
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.0'
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.4'
implementation "com.google.dagger:dagger:$daggerVersion"
implementation "com.google.dagger:dagger-android:$daggerVersion"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View file

@ -0,0 +1,89 @@
/*
* Nextcloud Android client application
*
* @author Alper Ozturk
* Copyright (C) 2024 Alper Ozturk
* Copyright (C) 2024 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.nextcloud.extensions
import android.os.Bundle
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.nextcloud.test.model.OtherTestData
import com.nextcloud.test.model.TestData
import com.nextcloud.test.model.TestDataParcelable
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.getSerializableArgument
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.runner.RunWith
@Suppress("FunctionNaming")
@RunWith(AndroidJUnit4::class)
class BundleExtensionTests {
private val key = "testDataKey"
@Test
fun test_get_serializable_argument_when_given_valid_bundle_should_return_expected_data() {
val bundle = Bundle()
val testObject = TestData("Hello")
bundle.putSerializable(key, testObject)
val retrievedObject = bundle.getSerializableArgument(key, TestData::class.java)
assertEquals(testObject, retrievedObject)
}
@Test
fun test_get_serializable_argument_when_given_valid_bundle_and_wrong_class_type_should_return_null() {
val bundle = Bundle()
val testObject = TestData("Hello")
bundle.putSerializable(key, testObject)
val retrievedObject = bundle.getSerializableArgument(key, Array<String>::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_valid_bundle_and_wrong_class_type_should_return_null() {
val bundle = Bundle()
val testObject = TestData("Hello")
bundle.putSerializable(key, testObject)
val retrievedObject = bundle.getParcelableArgument(key, OtherTestData::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_valid_bundle_should_return_expected_data() {
val bundle = Bundle()
val testObject = TestDataParcelable("Hello")
bundle.putParcelable(key, testObject)
val retrievedObject = bundle.getParcelableArgument(key, TestDataParcelable::class.java)
assertEquals(testObject, retrievedObject)
}
@Test
fun test_get_serializable_argument_when_given_null_bundle_should_return_null() {
val retrievedObject = (null as Bundle?).getSerializableArgument(key, TestData::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_null_bundle_should_return_null() {
val retrievedObject = (null as Bundle?).getParcelableArgument(key, TestDataParcelable::class.java)
assertNull(retrievedObject)
}
}

View file

@ -0,0 +1,89 @@
/*
* Nextcloud Android client application
*
* @author Alper Ozturk
* Copyright (C) 2024 Alper Ozturk
* Copyright (C) 2024 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.nextcloud.extensions
import android.content.Intent
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.nextcloud.test.model.OtherTestData
import com.nextcloud.test.model.TestData
import com.nextcloud.test.model.TestDataParcelable
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.getSerializableArgument
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.runner.RunWith
@Suppress("FunctionNaming")
@RunWith(AndroidJUnit4::class)
class IntentExtensionTests {
private val key = "testDataKey"
@Test
fun test_get_serializable_argument_when_given_valid_intent_should_return_expected_data() {
val intent = Intent()
val testObject = TestData("Hello")
intent.putExtra(key, testObject)
val retrievedObject = intent.getSerializableArgument(key, TestData::class.java)
assertEquals(testObject, retrievedObject)
}
@Test
fun test_get_serializable_argument_when_given_valid_intent_and_wrong_class_type_should_return_null() {
val intent = Intent()
val testObject = TestData("Hello")
intent.putExtra(key, testObject)
val retrievedObject = intent.getSerializableArgument(key, Array<String>::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_valid_intent_and_wrong_class_type_should_return_null() {
val intent = Intent()
val testObject = TestData("Hello")
intent.putExtra(key, testObject)
val retrievedObject = intent.getParcelableArgument(key, OtherTestData::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_valid_intent_should_return_expected_data() {
val intent = Intent()
val testObject = TestDataParcelable("Hello")
intent.putExtra(key, testObject)
val retrievedObject = intent.getParcelableArgument(key, TestDataParcelable::class.java)
assertEquals(testObject, retrievedObject)
}
@Test
fun test_get_serializable_argument_when_given_null_intent_should_return_null() {
val retrievedObject = (null as Intent?).getSerializableArgument(key, TestData::class.java)
assertNull(retrievedObject)
}
@Test
fun test_get_parcelable_argument_when_given_null_intent_should_return_null() {
val retrievedObject = (null as Intent?).getParcelableArgument(key, TestDataParcelable::class.java)
assertNull(retrievedObject)
}
}

View file

@ -0,0 +1,54 @@
/*
* Nextcloud Android client application
*
* @author Alper Ozturk
* Copyright (C) 2024 Alper Ozturk
* Copyright (C) 2024 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.nextcloud.test.model
import android.os.Parcel
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import java.io.Serializable
@Parcelize
class OtherTestData : Parcelable
data class TestData(val message: String) : Serializable
data class TestDataParcelable(val message: String) : Parcelable {
constructor(parcel: Parcel) : this(parcel.readString() ?: "")
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(message)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<TestDataParcelable> {
override fun createFromParcel(parcel: Parcel): TestDataParcelable {
return TestDataParcelable(parcel)
}
override fun newArray(size: Int): Array<TestDataParcelable?> {
return arrayOfNulls(size)
}
}
}

View file

@ -44,6 +44,8 @@ class FileDetailFragmentStaticServerIT : AbstractIT() {
var file = getFile("gps.jpg")
val oCFile = OCFile("/").apply {
storagePath = file.absolutePath
fileId = 12
fileDataStorageManager.saveFile(this)
}
@Test

View file

@ -81,7 +81,6 @@ class FileUploadHelper {
}
}
@Suppress("ComplexCondition")
fun retryFailedUploads(
uploadsStorageManager: UploadsStorageManager,
connectivityService: ConnectivityService,
@ -92,7 +91,44 @@ class FileUploadHelper {
if (failedUploads == null || failedUploads.isEmpty()) {
return
}
retryUploads(
uploadsStorageManager,
connectivityService,
accountManager,
powerManagementService,
failedUploads
)
}
fun retryCancelledUploads(
uploadsStorageManager: UploadsStorageManager,
connectivityService: ConnectivityService,
accountManager: UserAccountManager,
powerManagementService: PowerManagementService
): Boolean {
val cancelledUploads = uploadsStorageManager.cancelledUploadsForCurrentAccount
if (cancelledUploads == null || cancelledUploads.isEmpty()) {
return false
}
return retryUploads(
uploadsStorageManager,
connectivityService,
accountManager,
powerManagementService,
cancelledUploads
)
}
@Suppress("ComplexCondition")
private fun retryUploads(
uploadsStorageManager: UploadsStorageManager,
connectivityService: ConnectivityService,
accountManager: UserAccountManager,
powerManagementService: PowerManagementService,
failedUploads: Array<OCUpload>
): Boolean {
var showNotExistMessage = false
val (gotNetwork, _, gotWifi) = connectivityService.connectivity
val batteryStatus = powerManagementService.battery
val charging = batteryStatus.isCharging || batteryStatus.isFull
@ -105,6 +141,8 @@ class FileUploadHelper {
}
val isDeleted = !File(failedUpload.localPath).exists()
if (isDeleted) {
showNotExistMessage = true
// 2A. for deleted files, mark as permanently failed
if (failedUpload.lastResult != UploadResult.FILE_NOT_FOUND) {
failedUpload.lastResult = UploadResult.FILE_NOT_FOUND
@ -117,6 +155,8 @@ class FileUploadHelper {
retryUpload(failedUpload, uploadUser.get())
}
}
return showNotExistMessage
}
@Suppress("LongParameterList")
@ -146,7 +186,7 @@ class FileUploadHelper {
backgroundJobManager.startFilesUploadJob(user)
}
fun cancelFileUpload(remotePath: String, accountName: String) {
fun removeFileUpload(remotePath: String, accountName: String) {
try {
val user = accountManager.getUser(accountName).get()
@ -160,6 +200,14 @@ class FileUploadHelper {
}
}
fun cancelFileUpload(remotePath: String, accountName: String) {
uploadsStorageManager.getUploadByRemotePath(remotePath).run {
removeFileUpload(remotePath, accountName)
uploadStatus = UploadStatus.UPLOAD_CANCELLED
uploadsStorageManager.storeUpload(this)
}
}
fun cancelAndRestartUploadJob(user: User) {
backgroundJobManager.run {
cancelFilesUploadJob(user)

View file

@ -143,6 +143,8 @@ class FileUploadWorker(
val accountName = inputData.getString(ACCOUNT) ?: return Result.failure()
var currentPage = uploadsStorageManager.getCurrentAndPendingUploadsForAccountPageAscById(-1, accountName)
notificationManager.dismissWorkerNotifications()
while (currentPage.isNotEmpty() && !isStopped) {
if (preferences.isGlobalUploadPaused) {
Log_OC.d(TAG, "Upload is paused, skip uploading files!")

View file

@ -24,22 +24,49 @@ package com.nextcloud.utils.extensions
import android.os.Build
import android.os.Bundle
import android.os.Parcelable
import com.owncloud.android.lib.common.utils.Log_OC
import java.io.Serializable
fun <T : Serializable?> Bundle.getSerializableArgument(key: String, type: Class<T>): T? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getSerializable(key, type)
} else {
@Suppress("UNCHECKED_CAST", "DEPRECATION")
this.getSerializable(key) as T
@Suppress("TopLevelPropertyNaming")
private const val tag = "BundleExtension"
fun <T : Serializable?> Bundle?.getSerializableArgument(key: String, type: Class<T>): T? {
if (this == null) {
return null
}
return try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getSerializable(key, type)
} else {
@Suppress("UNCHECKED_CAST", "DEPRECATION")
if (type.isInstance(this.getSerializable(key))) {
this.getSerializable(key) as T
} else {
null
}
}
} catch (e: ClassCastException) {
Log_OC.e(tag, e.localizedMessage)
null
}
}
fun <T : Parcelable?> Bundle.getParcelableArgument(key: String, type: Class<T>): T? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getParcelable(key, type)
} else {
@Suppress("DEPRECATION")
this.getParcelable(key)
fun <T : Parcelable?> Bundle?.getParcelableArgument(key: String, type: Class<T>): T? {
if (this == null) {
return null
}
return try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getParcelable(key, type)
} else {
@Suppress("DEPRECATION")
this.getParcelable(key)
}
} catch (e: ClassCastException) {
Log_OC.e(tag, e.localizedMessage)
e.printStackTrace()
null
}
}

View file

@ -24,22 +24,48 @@ package com.nextcloud.utils.extensions
import android.content.Intent
import android.os.Build
import android.os.Parcelable
import com.owncloud.android.lib.common.utils.Log_OC
import java.io.Serializable
fun <T : Serializable?> Intent.getSerializableArgument(key: String, type: Class<T>): T? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getSerializableExtra(key, type)
} else {
@Suppress("UNCHECKED_CAST", "DEPRECATION")
this.getSerializableExtra(key) as T
@Suppress("TopLevelPropertyNaming")
private const val tag = "IntentExtension"
fun <T : Serializable?> Intent?.getSerializableArgument(key: String, type: Class<T>): T? {
if (this == null) {
return null
}
return try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getSerializableExtra(key, type)
} else {
@Suppress("UNCHECKED_CAST", "DEPRECATION")
if (type.isInstance(this.getSerializableExtra(key))) {
this.getSerializableExtra(key) as T
} else {
null
}
}
} catch (e: ClassCastException) {
Log_OC.e(tag, e.localizedMessage)
null
}
}
fun <T : Parcelable?> Intent.getParcelableArgument(key: String, type: Class<T>): T? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getParcelableExtra(key, type)
} else {
@Suppress("DEPRECATION")
this.getParcelableExtra(key)
fun <T : Parcelable?> Intent?.getParcelableArgument(key: String, type: Class<T>): T? {
if (this == null) {
return null
}
return try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
this.getParcelableExtra(key, type)
} else {
@Suppress("DEPRECATION")
this.getParcelableExtra(key)
}
} catch (e: ClassCastException) {
Log_OC.e(tag, e.localizedMessage)
null
}
}

View file

@ -569,7 +569,7 @@ public class UploadsStorageManager extends Observable {
}
public OCUpload[] getCurrentAndPendingUploadsForAccount(final @NonNull String accountName) {
return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
return getUploads("( " + ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
"==" + UploadResult.DELAYED_FOR_WIFI.getValue() +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
@ -578,7 +578,7 @@ public class UploadsStorageManager extends Observable {
"==" + UploadResult.DELAYED_FOR_CHARGING.getValue() +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
"==" + UploadResult.DELAYED_IN_POWER_SAVE_MODE.getValue() +
" AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?",
" ) AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?",
accountName);
}
@ -588,7 +588,7 @@ public class UploadsStorageManager extends Observable {
* If <code>afterId</code> is -1, returns the first page
*/
public List<OCUpload> getCurrentAndPendingUploadsForAccountPageAscById(final long afterId, final @NonNull String accountName) {
final String selection = ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
final String selection = "( " + ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
"==" + UploadResult.DELAYED_FOR_WIFI.getValue() +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
@ -597,7 +597,7 @@ public class UploadsStorageManager extends Observable {
"==" + UploadResult.DELAYED_FOR_CHARGING.getValue() +
" OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
"==" + UploadResult.DELAYED_IN_POWER_SAVE_MODE.getValue() +
" AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?";
" ) AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?";
return getUploadPage(afterId, false, selection, accountName);
}
@ -630,6 +630,13 @@ public class UploadsStorageManager extends Observable {
ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?", user.getAccountName());
}
public OCUpload[] getCancelledUploadsForCurrentAccount() {
User user = currentAccountProvider.getUser();
return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_CANCELLED.value + AND +
ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?", user.getAccountName());
}
/**
* Get all uploads which where successfully completed.
*/
@ -700,6 +707,20 @@ public class UploadsStorageManager extends Observable {
return deleted;
}
public void clearCancelledUploadsForCurrentAccount() {
User user = currentAccountProvider.getUser();
final long deleted = getDB().delete(
ProviderTableMeta.CONTENT_URI_UPLOADS,
ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_CANCELLED.value + AND +
ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?", new String[]{user.getAccountName()}
);
Log_OC.d(TAG, "delete all cancelled uploads");
if (deleted > 0) {
notifyObserversNow();
}
}
public long clearSuccessfulUploads() {
User user = currentAccountProvider.getUser();
final long deleted = getDB().delete(
@ -851,7 +872,12 @@ public class UploadsStorageManager extends Observable {
/**
* Upload was successful.
*/
UPLOAD_SUCCEEDED(2);
UPLOAD_SUCCEEDED(2),
/**
* Upload was cancelled by the user.
*/
UPLOAD_CANCELLED(3);
private final int value;
@ -867,6 +893,8 @@ public class UploadsStorageManager extends Observable {
return UPLOAD_FAILED;
case 2:
return UPLOAD_SUCCEEDED;
case 3:
return UPLOAD_CANCELLED;
}
return null;
}

View file

@ -390,6 +390,10 @@ public class OCUpload implements Parcelable {
return this.useWifiOnly;
}
public boolean exists() {
return new File(localPath).exists();
}
public boolean isWhileChargingOnly() {
return this.whileChargingOnly;
}

View file

@ -94,7 +94,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
Decision.CANCEL -> {}
Decision.KEEP_LOCAL -> {
upload?.let {
FileUploadHelper.instance().cancelFileUpload(it.remotePath, it.accountName)
FileUploadHelper.instance().removeFileUpload(it.remotePath, it.accountName)
}
FileUploadHelper.instance().uploadUpdatedFile(
user,
@ -106,7 +106,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
Decision.KEEP_BOTH -> {
upload?.let {
FileUploadHelper.instance().cancelFileUpload(it.remotePath, it.accountName)
FileUploadHelper.instance().removeFileUpload(it.remotePath, it.accountName)
}
FileUploadHelper.instance().uploadUpdatedFile(
user,
@ -129,7 +129,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
}
upload?.let {
FileUploadHelper.instance().cancelFileUpload(it.remotePath, it.accountName)
FileUploadHelper.instance().removeFileUpload(it.remotePath, it.accountName)
UploadNotificationManager(
applicationContext,

View file

@ -2486,7 +2486,12 @@ public class FileDisplayActivity extends FileActivity
* visibility earlier using {@link #setSortListGroup(boolean, boolean)}
*/
private void popSortListGroupVisibility() {
boolean popped = previousSortGroupState.pop();
showSortListGroup(popped);
showSortListGroup(false);
if (previousSortGroupState.isEmpty()) {
return;
}
previousSortGroupState.pop();
}
}

View file

@ -74,6 +74,7 @@ import com.owncloud.android.lib.resources.shares.ShareeUser;
import com.owncloud.android.operations.RefreshFolderOperation;
import com.owncloud.android.operations.RemoteOperationFailedException;
import com.owncloud.android.ui.activity.ComponentsGetter;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.fragment.SearchType;
import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
import com.owncloud.android.ui.preview.PreviewTextFragment;
@ -160,6 +161,10 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
this.gridView = gridView;
mStorageManager = transferServiceGetter.getStorageManager();
if (activity instanceof FileDisplayActivity) {
((FileDisplayActivity) activity).showSortListGroup(true);
}
if (mStorageManager == null) {
mStorageManager = new FileDataStorageManager(user, activity.getContentResolver());
}

View file

@ -122,32 +122,34 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
switch (group.type) {
case CURRENT, FINISHED -> headerViewHolder.binding.uploadListAction.setImageResource(R.drawable.ic_close);
case FAILED -> headerViewHolder.binding.uploadListAction.setImageResource(R.drawable.ic_dots_vertical);
case CANCELLED, FAILED ->
headerViewHolder.binding.uploadListAction.setImageResource(R.drawable.ic_dots_vertical);
}
headerViewHolder.binding.uploadListAction.setOnClickListener(v -> {
switch (group.type) {
case CURRENT -> {
// cancel all current uploads
for (OCUpload upload : group.getItems()) {
uploadHelper.cancelFileUpload(upload.getRemotePath(), upload.getAccountName());
}
loadUploadItemsFromDb();
}
case FINISHED -> {
// clear successfully uploaded section
uploadsStorageManager.clearSuccessfulUploads();
loadUploadItemsFromDb();
}
case FAILED -> {
// show popup with option clear or retry filed uploads
createFailedPopupMenu(headerViewHolder);
showFailedPopupMenu(headerViewHolder);
}
case CANCELLED -> {
showCancelledPopupMenu(headerViewHolder);
}
}
});
}
private void createFailedPopupMenu(HeaderViewHolder headerViewHolder) {
private void showFailedPopupMenu(HeaderViewHolder headerViewHolder) {
PopupMenu failedPopup = new PopupMenu(MainApp.getAppContext(), headerViewHolder.binding.uploadListAction);
failedPopup.inflate(R.menu.upload_list_failed_options);
failedPopup.setOnMenuItemClickListener(i -> {
@ -173,6 +175,47 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
failedPopup.show();
}
private void showCancelledPopupMenu(HeaderViewHolder headerViewHolder) {
PopupMenu popup = new PopupMenu(MainApp.getAppContext(), headerViewHolder.binding.uploadListAction);
popup.inflate(R.menu.upload_list_cancelled_options);
popup.setOnMenuItemClickListener(i -> {
int itemId = i.getItemId();
if (itemId == R.id.action_upload_list_cancelled_clear) {
uploadsStorageManager.clearCancelledUploadsForCurrentAccount();
loadUploadItemsFromDb();
} else if (itemId == R.id.action_upload_list_cancelled_resume) {
retryCancelledUploads();
}
return true;
});
popup.show();
}
private void retryCancelledUploads() {
new Thread(() -> {
boolean showNotExistMessage = FileUploadHelper.Companion.instance().retryCancelledUploads(
uploadsStorageManager,
connectivityService,
accountManager,
powerManagementService);
parentActivity.runOnUiThread(this::loadUploadItemsFromDb);
parentActivity.runOnUiThread(() -> {
if (showNotExistMessage) {
showNotExistMessage();
}
});
}).start();
}
private void showNotExistMessage() {
DisplayUtils.showSnackMessage(parentActivity, R.string.upload_action_file_not_exist_message);
}
@Override
public void onBindFooterViewHolder(SectionedViewHolder holder, int section) {
// not needed
@ -197,7 +240,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
this.clock = clock;
this.viewThemeUtils = viewThemeUtils;
uploadGroups = new UploadGroup[3];
uploadGroups = new UploadGroup[4];
shouldShowHeadersForEmptySections(false);
@ -217,7 +260,16 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
}
};
uploadGroups[2] = new UploadGroup(Type.FINISHED,
uploadGroups[2] = new UploadGroup(Type.CANCELLED,
parentActivity.getString(
R.string.uploads_view_group_manually_cancelled_uploads)) {
@Override
public void refresh() {
fixAndSortItems(uploadsStorageManager.getCancelledUploadsForCurrentAccount());
}
};
uploadGroups[3] = new UploadGroup(Type.FINISHED,
parentActivity.getString(R.string.uploads_view_group_finished_uploads)) {
@Override
public void refresh() {
@ -324,11 +376,14 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
itemViewHolder.binding.uploadProgressBar.invalidate();
}
case UPLOAD_FAILED -> itemViewHolder.binding.uploadDate.setVisibility(View.GONE);
case UPLOAD_SUCCEEDED -> itemViewHolder.binding.uploadStatus.setVisibility(View.GONE);
case UPLOAD_SUCCEEDED, UPLOAD_CANCELLED ->
itemViewHolder.binding.uploadStatus.setVisibility(View.GONE);
}
// show status if same file conflict or local file deleted
if (item.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED && item.getLastResult() != UploadResult.UPLOADED) {
// show status if same file conflict or local file deleted or upload cancelled
if ((item.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED && item.getLastResult() != UploadResult.UPLOADED)
|| item.getUploadStatus() == UploadStatus.UPLOAD_CANCELLED) {
itemViewHolder.binding.uploadStatus.setVisibility(View.VISIBLE);
itemViewHolder.binding.uploadDate.setVisibility(View.GONE);
itemViewHolder.binding.uploadFileSize.setVisibility(View.GONE);
@ -371,7 +426,9 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
itemViewHolder.binding.thumbnail.setImageResource(R.drawable.file);
// click on item
if (item.getUploadStatus() == UploadStatus.UPLOAD_FAILED) {
if (item.getUploadStatus() == UploadStatus.UPLOAD_FAILED ||
item.getUploadStatus() == UploadStatus.UPLOAD_CANCELLED) {
final UploadResult uploadResult = item.getLastResult();
itemViewHolder.binding.uploadListItemLayout.setOnClickListener(v -> {
if (uploadResult == UploadResult.CREDENTIAL_ERROR) {
@ -655,8 +712,16 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
status = parentActivity.getString(R.string.uploads_view_upload_status_succeeded);
}
}
case UPLOAD_FAILED -> status = getUploadFailedStatusText(upload.getLastResult());
default -> status = "Uncontrolled status: " + upload.getUploadStatus();
case UPLOAD_FAILED -> {
status = getUploadFailedStatusText(upload.getLastResult());
}
case UPLOAD_CANCELLED -> {
status = parentActivity.getString(R.string.upload_manually_cancelled);
}
default -> {
status = "Uncontrolled status: " + upload.getUploadStatus();
}
}
return status;
}
@ -857,7 +922,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
}
enum Type {
CURRENT, FINISHED, FAILED
CURRENT, FINISHED, FAILED, CANCELLED
}
abstract class UploadGroup implements Refresh {

View file

@ -41,6 +41,7 @@
android:layout_gravity="bottom"
android:clickable="false"
android:orientation="vertical"
android:background="@color/appbar"
android:paddingLeft="@dimen/drawer_content_horizontal_padding"
android:paddingTop="@dimen/standard_half_padding"
android:paddingRight="@dimen/drawer_content_horizontal_padding"

View file

@ -127,4 +127,17 @@
android:orderInCategory="200"
android:title=""/>
</group>
<!--
one more dummy element required
After making the quota details opaque
it is hiding some part of the element of the drawer above it
-->
<group>
<item
android:enabled="false"
android:orderInCategory="200"
android:title=""/>
</group>
</menu>

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Nextcloud Android client application
@author Jonas Mayer
Copyright (C) 2024 Jonas Mayer
Copyright (C) 2024 Nextcloud GmbH
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_upload_list_cancelled_resume"
android:title="@string/upload_action_cancelled_resume"
android:icon="@drawable/ic_sync" />
<item
android:id="@+id/action_upload_list_cancelled_clear"
android:title="@string/upload_action_cancelled_clear"
android:icon="@drawable/ic_close" />
</menu>

View file

@ -152,6 +152,7 @@
<string name="uploads_view_title">Uploads</string>
<string name="uploads_view_group_current_uploads">Current</string>
<string name="uploads_view_group_failed_uploads">Failed/pending restart</string>
<string name="uploads_view_group_manually_cancelled_uploads">Cancelled</string>
<string name="uploads_view_group_finished_uploads">Uploaded</string>
<string name="uploads_view_upload_status_succeeded">Completed</string>
<string name="uploads_view_upload_status_succeeded_same_file">Same file found on remote, skipping upload</string>
@ -852,6 +853,10 @@
<string name="upload_action_global_upload_pause">Pause all uploads</string>
<string name="upload_action_global_upload_resume">Resume all uploads</string>
<string name="dismiss_notification_description">Dismiss notification</string>
<string name="upload_action_file_not_exist_message">Some files not exists those files cannot be resumed</string>
<string name="upload_action_cancelled_resume">Resume cancelled uploads</string>
<string name="upload_action_cancelled_clear">Clear cancelled uploads</string>
<string name="upload_manually_cancelled">Upload was cancelled by user</string>
<string name="action_empty_notifications">Clear all notifications</string>
<string name="timeout_richDocuments">Loading is taking longer than expected</string>
<string name="clear_notifications_failed">Failed to clear notifications.</string>

View file

@ -2324,6 +2324,42 @@ ikmfPIGVw73RF3HXjJ8GVqTkqbo4ZpgTw/7Z3+fAYE/vxquhnpl2HvE=
=5tlI
-----END PGP PUBLIC KEY BLOCK-----
pub D56C721C1CFF1424
uid Harald Kuhr <harald.kuhr@gmail.com>
sub 82889D6A1813F02D
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mQENBF+242IBCADRO5E77O+3zYLz2iYkOuIfmnrx31GjdLHGzWpX5WDin/PlTGnD
uUk2JoNwFCmHgAh6waBYVnjsaRTaAaj4W/22APeEQLK1Bfi8sBn1PPKsGDf/4f6s
ZsKcJ1INPo9WsN234INyz4YkFFnI7QSeCzqWsk/l0V5vir+cEX3JjQ4nGWluA0/d
BoTXGkGTofUBUt2KflnEn4p2/CXbbwGSpLnESSBdoI0JX2uAUTZvgSnvNjTDZD5c
Yr2o4/4zv7d+3lcHBXdCanuTa1m0nxWnROizqxetilPm5jxk53uhq5zHpamdnHUp
cAif9OhXtU2iUEu13jTd9oUktgVKRTxK8qhVABEBAAG0I0hhcmFsZCBLdWhyIDxo
YXJhbGQua3VockBnbWFpbC5jb20+uQENBF+242IBCAC623pjBREUo5VKRy7fC9Y2
q5T/bVMJRuOk0FLHNnoxapaWjqpI7lmbfHq4xeRHlTjqs1Z230cW/gIJ2GzjVx2v
ecgo9eXgQu9djl5JtEblZyNZbYrJBik4Sr60Cs5iKpMovPIrEG3xOVTiizs88ca/
WzuWuQgOiSFyf+XUDmv3JwFbKzpt8rJla6AR0adAr2CqBTJkSf6BgWVcIuGHbWzX
Ldl/+4LNn7hTnnMM+UeaUjnu6j6XTWbf+jn0extF6xJgS1f+3WGo9WyHlh7PXHAv
otJ04dAnR0fQadjS6zNkHzTuOlB6HEacF8szibG6yGWfElPj7N20haeFWPiZ9QXN
ABEBAAGJATwEGAEIACYCGwwWIQRFPqMTKN59iqpVrU7VbHIcHP8UJAUCY3uxyAUJ
B4c1ZgAKCRDVbHIcHP8UJNr5B/4p8PxIfUoQsshBcAYun4776BfNoM7OVzHQJyqz
Q3TcJUqspyHnROXBhQay212p1ft1u10QU4gB1JsK6T31OUxzwbHSUseqxS+ZBOrJ
Vt5C+PdhuhMXJonKPUNy+mSPb0lfOFb911/v4HgKCwwFpAr3X+A2a3FMgXE2pHYd
MTCt428cnKugiXBF8fPRk1MJgyg2Ykp188V2NCiE/H0k1eaqFP97VxFycPrFHii7
1II4THdhIa9yo9TVPNjTMdaZRj4i/7yzTAhE3MgcllM2x6YQqzuYR+djQI7isATu
QOxHvi176qvZwDv4UEG6LbzRjCxEP+6ImXUfIBvlx/MM3EUiiQE8BBgBCAAmFiEE
RT6jEyjefYqqVa1O1WxyHBz/FCQFAl+242ICGwwFCQPCZwAACgkQ1WxyHBz/FCRg
3gf+KNRDkSlwwENVg+j14xlIKiwQad4I6/+HDjuAmhtWlTJCrrpQrJgxgyOSdXs5
cm5ZEY/KEsFWjEz9dRqtmKN7W0wCkwAF0vl4sez73sZyD3X5z42vxF2JLavdUruY
03mKS5w1Umjwy7StcRWEdl/1hBBuV/U30vSslyuWkXNoqoBLYOR+Q0KjdkSeUpfv
jFNQROOg9dLKrCzmeF3O1HN/iDEe6K6bvSly3S8/f3OkdvE4VocZ7+ketcrg5lmN
lzltDy5yfsvU2/VVjGdI48J6i33CahJYT8diQcd+y7jH1B3bC+OZ0Jk3SIK97udJ
tJscrv0/jtIwo5zy8SqldnhB6g==
=OReJ
-----END PGP PUBLIC KEY BLOCK-----
pub D7C92B70FA1C814D
uid Matthew Sicker (Signing Key) <mattsicker@apache.org>
@ -2953,6 +2989,43 @@ rg1uIDOAX2LIQbC3qLz9iwD2rdbOLOkCQDYIa5Vs3j3RT/cw1A==
=r0Sk
-----END PGP PUBLIC KEY BLOCK-----
pub ECEAC3B11AD0E0A0
uid Priyanka <prigupta@adobe.com>
sub 33BA5E7DBAA319CC
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mQGNBF+zYT4BDADOvqnDCp47DHqAxbJ5DmnKetnYyhJwNo4S5l+Wlx6x5lVJPR+7
w6KfHXPDlBgoHJp3j0w6zWijHzGX1eK4Z4c95pE6S+7v/qM4otItJte+bYMNd+Lm
VkYVVaBwWUxI0vVlgqojRUvrQGPhey+iEfcGrp28xHpuZtoXE0GUjlAaSowp9sBm
SNxR3NMTXcE1joigGquwRzuSSXaFCTcCKdZ+xyvnjBpr+oVXv0WHfvGPhlgYKylq
jBaZGE88Wp20TZ7DQaMaP6XmZg6nSB0iKo1HO+VDMHgne/QvBiXEnkw72YnDEfk+
eNomIvrumfhWfnC3SOqWY7k1FuKQrtbBdOhUTcqTaUFCezWoZ403jxc9DoKYDZvG
5LjQ07wcwrnB9ldBsyvdLqujp+LKcS+9KZMTGOnzyTQyyjpRHqFtP/zzZpNW5EWd
MIk51PebfGuBwCa+RgE8CSuEwoNhdA+GAqhr20Fivf4OJ134qm0xPmLmx/WYlugL
GnZgRfFjlv7bKgkAEQEAAbQdUHJpeWFua2EgPHByaWd1cHRhQGFkb2JlLmNvbT65
AY0EX7NhPgEMANX4DBl2KhJ+52g6ehpK9f76xDWMd2J75qaY59feSN1+1D48dbVu
0YgHjdCOh5xk2KcKKo3oY3a/L4GFlucWvnnvwQAVKuZZSS2nP5ZTepFKah8pElWM
gtx2Bd+XgV5JCZgNSB+7LPXlBltcbPEdaguDbORCmy/ACuVEJ/IcJgDCpBWVjF8q
zmC47vCEUKSdcsZ2EIYr0tqrZYAt6AtNBlpV8EbrBgGIKmIxeg3b7Las8cj+0pQG
K2Nuszfpku2+HA7QlaaH2/W+sV8Hi0U7Hq/MRtx4V3+W8l3FzA+il0FVGijQgE3U
QoNpTy5Tl5Ic1yVw4gOFy6TreMNr3KbEU+J2MGtgPnbde8LuZ016NdmnA05/AzJ3
CJ5aCyj/h5k5q4YRA0S0osqm47D8ooIZPGZ7LMVqrjm3vIuoJXav6rAmTgNnHU2N
CGHWMsMDOPfpG7dNMfn0aAb2DL9JNMdqEPTWOGhEqsXupvLSNe/mKxyN19fzIWst
pX2mWjBUtcTNFwARAQABiQG8BBgBCAAmFiEE71IUrWVM0F8NqRYJ7OrDsRrQ4KAF
Al+zYT4CGwwFCQPCZwAACgkQ7OrDsRrQ4KAwfAv/YfM2nS/19QDxnfgSaJAXdtit
OoXzIBVqZ44Z5LgqRkloLm/kSzOhzX53yxwAvVDkaH//5GUp7jqIg21ejULOfewC
Upbth1x9XUnOA55Tz54Z3Emfnshbp04XVj5V+7VJG0UoRfOl8typI2/RPN0h0rQD
KxO2h8cuIP9vlGY1AXFP9mirI02BLdm1S7ugAchrfEcvmKwXPcltlDA487S01iSd
nDSBOtAvIVIrpkV5eIu0e58KbdxLiqP+dvpvQyGRFx3ktOIoStqx5Qea+/ZX8uxI
X7cDvdPbYmi4jel/RfIg07HDjjLjGDnfUDw2gwHdlySWd/przYqAocjJUB+0tCc3
kV4CM2caga5PRHuYRoFl/UeCKgZfH20jNjq6Fw88s5jlzMDyfGB5oBU1S9F5fiV1
qQhnaRFDkP2iG/CN9kbL90vRVANHVw9odIiS4Yd3sTX2vnx4eP+6h4ynXL0p01y4
K+jUtu4w+gsJ3GJvywKbXKy6DkVXcc+umnc318/Y
=UhYJ
-----END PGP PUBLIC KEY BLOCK-----
pub EE9E7DC9D92FC896
uid Eddie Aftandilian <eaftan@google.com>
@ -3208,6 +3281,35 @@ VDzc34e+Nr/b2pN05MDHA0dXmb/irwPBl0mTOgAgC805qkR14xhd1GeL6MEA34k8
=CmMl
-----END PGP PUBLIC KEY BLOCK-----
pub FB63BCA973FAA119
uid potato <zh79325@163.com>
sub 28ECAB16140A23E5
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mQENBFv8rqkBCAC8J4YBW1ZjXpovURQJcMd0kYgEjVzV0GHHVp9/NJwQ7NrhqGeE
ktSZV4ctxWoPXYqAMbCjqyRfXQw28olj7L55m1VUIT10i20uDixdeDmAPcI5d1z9
yljknFcOWSUBX+cYUKiYmel1Xb8l8qlzp31jL7TJdeW7fyYBiQqoxgHzAbc8ju8S
TymAVhf8vCee21C/ppAU0uhK7yVi3Liuhjl3jKDFRz0j9MkmrHeKxr+LLZfAZI9M
UCShsmm66anJThtnvxqod/186/7LbNsOfhbb6zCAfPTmb9EB9AncFwNgW4OR+f/C
yAZfr+sIDywrtOt3LXj0yaIYxGEIwXzxJW0xABEBAAG0GHBvdGF0byA8emg3OTMy
NUAxNjMuY29tPrkBDQRb/K6pAQgA4QmtZ8QjosaPwwTGG2w5wVWG/gtvclcJO/ns
wlhWSDiVjmyMknDzP2/sKT50MGzFLf1Fd1B39keYcKoRVyonV0LtZ8KlWgNipi7h
b9MGfrYotVQsP0XWhqUVJE80SBvOiWwAnind07SP2Ivl5jlbrgsIzvO2JpGTzraQ
Ae+AyKkVaqWXc7EOw8kuU9Q5rcagcSLyl3/9K9vP1wYcXo5qfiWc9I1dAnsPOTyY
S9ajFRY20+7yP5Fbsl6MyP7kYHSdfLSmEwzdQrSgaZQbNE+63eNA0vzWXmbpc/A+
hq4SMK87qKJMAkd8Aaba+U7icBJqmONdZyM1YiqOVrnnjL+QAwARAQABiQE8BBgB
CAAmFiEEUiV1UMUMAD+K0c9/+2O8qXP6oRkFAlv8rqkCGwwFCQPCZwAACgkQ+2O8
qXP6oRnpeAf/UUxitjRhq7ueiq4pz3mJNwX9M2BbLLkg1dR80MGHGAACb2DaOTXg
Sb1H4ZkB9JzrJKXUJB5J4f2BB/yrDQKmS+szgSd+NeQyFs+r6VSDiSwpnye8yDJg
E6AhGzo5HKFHu17N1w6NGkAQBL+GEgvtojbZDaPzpRSu78rIP2rFymeCiL83eZgP
nqAgKXI+jMiAGQwn8z2TbaiaKHmKKNm4GTZOEfjIkMOLNDt+th82/rLA9cJk+Gna
Q7Q6jnMm02XFBUIiIOCDTzK9BSCAV7SVAwfdlO3Be1KNITO/Rsx4LpHbRMyEf7u8
3ZOclcevOY17eceSCwjy3C4mU9FhaByKkg==
=kRMk
-----END PGP PUBLIC KEY BLOCK-----
pub FD116C1969FCCFF3
uid Sean Leary <stleary@gmail.com>
@ -3383,6 +3485,35 @@ kYlgaHe+RYIWqM1P1t8RfE7OH4kAeRSawjrQjgVp
=Uv6G
-----END PGP PUBLIC KEY BLOCK-----
pub 02DE09238A0E4D34
uid Drew Noakes <gpg@drewnoakes.com>
sub FCF369F756EF6105
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mQENBF0gmvMBCADCD96pOjHwsBOztrn7Vy22JMbGIK9LVTk0VC2HLNW/jcl0tTNi
wAIZ7F5Nat9H/fL20dlwvS81W5OlrFImY77HH9qzg+S+WuXlU5ze55kU6RaDWtee
VilasdwWxAMrtcPVo18DjDP+ey+hva8pvArdl3CEuva3gr9idz4GvWrGnkTCagJt
6VRig6XoalF4qVfvI5jkyX2vhUij/adpSXXFcPNcHcBCgUhD7BSgQIXtR/x8iaI8
/RDCkto0mI/avZQvCjGKO1jleq1zpaD/h2Ga3Mb0hJpOL4HI4HYQcT0Hu0pfcUPx
AJrD1uZrR8h/2fZYtYgDYdpglYp0auZcGeHpABEBAAG0IERyZXcgTm9ha2VzIDxn
cGdAZHJld25vYWtlcy5jb20+uQENBF0gmvMBCAC3lRXIZGaFb9BZfF61dlDzZcpd
ctAN+WV7oLYVY+RECD83wxDqjDBTcsjgBgWXEbTJtaM4wgZ6ae3lQfPLiaL2dpuh
eZRYJx6fuRtYr0z4dqEmvLvoMFujAnb/fKVYm0dpHZw4D50BfDsIrEgMRNwoLJyr
z+rybU+fyygK6liuR6EoFLF2J5mw/WMW3il6Zv/Ly4NWWFvND9VPmiQYglItXXM5
V5W0ifEe8Ckjajm7HlwqN7rl0MXLLnSGuC8ICB9xJQMOOb4m1wboASDi+yJ+54Gr
5BbrQ20DoWXahFSZhRO+QxEcWfcbB4FeEUSVSmQilZNjXgLKDN6/cMtK870vABEB
AAGJATwEGAEIACYWIQTgGqswFhjSOznb1BAC3gkjig5NNAUCXSCa8wIbDAUJA8Jn
AAAKCRAC3gkjig5NNGX8B/46vKeGgxJ5m+ZnPgi68hUuPM08TkyK6uYD27M60X0g
dVixchk0CRspycmeJvpvTh/6XDOiBStxD0zYcDoKjA7JNhIv3L+FIdP45VlyR6j9
Ol1nNK9xVL3OifS942Q5vUaprZ+aakXGNfZXBpsVBAbnMrXdCNsjwNrgEZliNnEQ
iDwIQkjgM3c8gIllfn75y6PhYHJDYFj8M0IcWzpqRrCYiR+lqx17U4CavWJJXVfv
/n60Dd6u5MqL3Ket8Pc3bqknLMLzgp0YKlOYylOJpt7zkXz7X1AUSbkV7XfdOtUI
i+e239pgHg1ROFTbISLcgj+kLpKT/eb8cdbtzrx3q7CP
=PaUP
-----END PGP PUBLIC KEY BLOCK-----
pub 0374CF2E8DD1BDFD
sub F2E4DE8FA750E060
-----BEGIN PGP PUBLIC KEY BLOCK-----
@ -3882,6 +4013,51 @@ jR7YX5D8RUnPYZnzIzID+ECD0JeFuyBMZI3y8Zog5w1Ce1wnzA==
=T2aE
-----END PGP PUBLIC KEY BLOCK-----
pub 08A4A4958D61FC3D
uid sksamuel <sam@sksamuel.com>
sub 54EB00732104EF7A
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mQINBF7ByYMBEADHxAxXj4u914xQb5fJ+sBvk0rKpqOZPFMIiuyNMD72Dk2jZbvW
ESuRlzp9MObyylGTsxeX+f+Fq+piqqgAAFWyXx+JNV4UkDLSt8g6n0phW97Wj89b
ybWFDUnvgr+IeNZ0pBX2MPRPXrtZhayk8ahY84fps8CFJN/NMi0HExYP9Ttt59/b
njWFDy9NI5/CzgRB9e4sv/mHPNwZOA8fonG3xQ0eBHbnl+Wv7wnnUixbtZt92ZEf
VL4mb0HJyxKVVPZWFH3Sm8oukAxNqxCS0pxOXTWCfvtEFatA5AKgbGFpw4PMoQ2O
QEGm5HgfgyObuGr8imnvtvSUhopmUj858rfoN0PqqsqF8AFtJusfVLeVloBRHhe7
Yjn3uyGgY5pUw4csXY9p9Uf9yjD8r6RyZGyuNPdVy7drTaP3ZMYDA/jaJG3hDtbh
eu2w4eTCIRCYtEr/LzVQVo/HYJDmRwoUI30A/IfrgNIDWjHkrG7uVpynt6dAddSh
JfEWUFsjw4Oi+yHWWxeSjlLc/Uf9vt2GNjjpMXpp8r+VQsKqDbzKWOA9yrpIwhs9
Mu+qBOsBgCy6sPsJpZ7Qqr4gnh5vrBGZaRA5WRjdSlP5yzsYyCYnSCquKMy+Uk8n
54sRGRxcNjDVJVVlZuiFVbbX2f1OEgVNbnp0PMUym+QbJdPI//xjKYU2wQARAQAB
tBtza3NhbXVlbCA8c2FtQHNrc2FtdWVsLmNvbT65Ag0EXsHJgwEQANU52hl+lBeg
+Z90jcTYOs8wU9beW+4jJ1WsbxpE+XOj6Nx5GhahpgVsZGt7fSgParuu/cEj6Vaf
6UL+dsu/jeSLgzQfEQ+W94MRgA6OMsl/g57T0Zj/Rgd8yhNOLBOUgVD/OVr56lEG
/xPZGX0tJvBXaoJVoPDzS/sviYMEZurfA7yraa1NZw/n4GtKR2Gzl1Vejgpmpx5Q
uOV0F/6LOBDwfRvCI3rVyeuX78e2FwtYJ0zj9UNefTdtyeP+oEW0KGJAYvgrSoAd
k9uMfBd9d91k2nR3F4pf5zY7Fbfj4yp0v4xMSgl73/crBPD6ApCmOSbyBEoq6qPc
RDDY9LH3yRg5BcoQOr8JVmKJu+CoPwOfeadzOwzYtfTzBdvPyJkNaH+JsJc8hTYf
0WJXC45C46tcKHkK2V15zv+9TtlMdmUrjPnYh0s4+sB8HRym2iCGYOhCcFozhb67
M3rVE+F1rFSNxLfbjRpGOK1x9QW+/VY3gvywoMK/69JgiKkeFKO9EZGULmE02+KD
jq+VC5bP/YblNdX12H8LV6sSV2QEcgpdIVevWv5Pro9b4yfhq5DmuKVU/HvNzkSY
Q3fiOhhm2MSoqhNSOP+Gjt7w8YOUjmACR86yQ0982PIlBG4WGCO5vkSpfA8QMcYx
qicQ7wWelSY+gzPvUxJmeNiMJwhisd7TABEBAAGJAjYEGAEKACAWIQRcuhnlYUHn
jVS/cW8IpKSVjWH8PQUCXsHJgwIbDAAKCRAIpKSVjWH8PVfbD/4hpPgOe4RdC1cW
hgcxXn7Ht2HOIFUbU5lDpucURdJWqarWVzUknfqwMzJpeQdRfgkckT0EB8nfgwkd
wNbo9YPuWJ/hezYrCTVFDVk8ZAXIdy7b1A3l1NF+7y47b9p3PqfHg42EY2GU3tsZ
Oq7U6KOBdARf9QlRXYtVCHsMqMOrVApAYk1dHhEfMbhiZcQMXTCWiSpg5sI5E9TR
NbWe/dFwv9oz4+bv8cB5XWYMdTywAOlDLMsd8D4FjVlY48oBXA0NmcHgZHhPma+K
dnpkkDCMHSRupOs+S2yOqD2G9lSEwjX1MAbjTCVNW3hBXpFc14gr02jguKrW58EE
vpr2SGaaSYNTGp2OTcAFdgiS/JmYg1SnXClMdG7n/LuYH3sqXKiN2/6/2UUVQXmz
F339cqKjXCEVtBq6WyIDCeI+d4p49/m3XEaDYGj2Q8lICx/ByuPev3sNP1T7jJy0
RJxZc6/OpkguTbrCKrCpqIeoSfc7/HDUNnjUMj7CI/TQP0G0gcNJCnuWLfwbvM+y
brNrUHgnWk7a0SwBYLSu3I74gPMEJ+4t12Eh7vlyMZ7i5E8+rcNkR4Fq/8XM6YvR
HcnooxOWfd3bDjFBb6R5JpOPFPt2tBBvqTlxQFTz59eQmCu71EBYg/a4TKESlm7Y
tE3KtJP0/IOVuzK22tPjBdeoI9FptQ==
=c4O7
-----END PGP PUBLIC KEY BLOCK-----
pub 0B45DDD344B5FFD1
uid Josh Holtz (For maven) <me@joshholtz.com>
@ -4933,6 +5109,22 @@ HxWaEMJtpSkIvHIBz9qoAroGtNFzz2oF4ElRABEBAAE=
=1QGy
-----END PGP PUBLIC KEY BLOCK-----
pub 2838A2C567F74226
uid Seth Tisue <seth.tisue@lightbend.com>
sub B293A312CEB2E9F6
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mDMEYVOgzRYJKwYBBAHaRw8BAQdAPnTbK24vDd1YxFLwAmpdoemwlJMKH7PyGSe/
ab65sry0JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh
U6DNEgorBgEEAZdVAQUBAQdAsh50gWqK3tkXRhXWTv8bKOfUUFs7RLvna3KUwhIX
nXADAQgHiH4EGBYKACYWIQQI7z7CaKgEl+0gMIEoOKLFZ/dCJgUCYVOgzQIbDAUJ
A8JnAAAKCRAoOKLFZ/dCJtYHAQD90Eu8uvLofLKxoY+hbjn+dJ+fzcMZ5I2xoc1s
li442QEAp72J6Hz7p0Vyu1u05NZvb+jLBwWyI0P7Hq2pfR3qFg0=
=rrV8
-----END PGP PUBLIC KEY BLOCK-----
pub 29579F18FA8FD93B
sub 9DF7F2349731D55B
-----BEGIN PGP PUBLIC KEY BLOCK-----
@ -6172,6 +6364,22 @@ eKej8y3YRDgQU+O9SrfNjf8PhhpG98C+k/yOh/tty5HGNfdvyMB8TdVxzTd5uHMN
=m6Ii
-----END PGP PUBLIC KEY BLOCK-----
pub 5365A8A69292AF1A
uid Seth Tisue <seth.tisue@lightbend.com>
sub 6DAC12FEF3928B80
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mDMEYVTpMBYJKwYBBAHaRw8BAQdAgCkGHxDJ2ObI6x5cwp6Cl85hJQ5vIZFH/0+1
wnaiXA20JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh
VOkwEgorBgEEAZdVAQUBAQdAsJWY4kW6HpMZV8X5VYH0oq18gI8vVaQPTK+UXiu3
FkEDAQgHiH4EGBYKACYWIQRgDSEhmWPyKCAKcjdTZaimkpKvGgUCYVTpMAIbDAUJ
A8JnAAAKCRBTZaimkpKvGlyYAQC0bd1I8QbHqLzhkSv7NyKCh8SDTj/xb9DXPF24
09RywQEAjKh4ayeMU3KgTAoCps9UZ1tw/tySVUY0qIzV4dDP1w4=
=82EY
-----END PGP PUBLIC KEY BLOCK-----
pub 55C7E5E701832382
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
@ -6354,6 +6562,22 @@ V3u1xg+t7/QlghTMoJAA0H5G
=hS0U
-----END PGP PUBLIC KEY BLOCK-----
pub 59E05CE618187ED4
uid Taro L. Saito (For GitHub Actions) <leo@xerial.org>
sub 8857595B73BFD468
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.68
mDMEYuRVGhYJKwYBBAHaRw8BAQdA2Dp4m1Yhtb1g94pQzzL24FuP6b9KXF8lP9Dh
hZnynhe0M1Rhcm8gTC4gU2FpdG8gKEZvciBHaXRIdWIgQWN0aW9ucykgPGxlb0B4
ZXJpYWwub3JnPrg4BGLkVRoSCisGAQQBl1UBBQEBB0Atu9kejBi+6wfOT0a9z/LY
EEdNXM/VX6xt1onKToPPdQMBCAeIeAQYFgoAIBYhBMHLp17JvQuvgGGTVFngXOYY
GH7UBQJi5FUaAhsMAAoJEFngXOYYGH7UlMABAKyRCazhVyUFg5FOpAnmckBY38Ca
MGPPLXVyY8Kr6dYFAP9wYLu7nsDZCOXkAgS+et4Pk1WZCggoYUkxsX1o0KZXBQ==
=7Gio
-----END PGP PUBLIC KEY BLOCK-----
pub 5B05CCDE140C2876
sub 9D29AE4A6B50E01F
-----BEGIN PGP PUBLIC KEY BLOCK-----

View file

@ -7,9 +7,6 @@
<trust group="com.android.tools.build" name="aapt2" version="8.2.2-10154469" reason="ships OS specific artifacts (win/linux/osx) - temp global trust"/>
<trust group="com.fasterxml.jackson" name="jackson-base" version="2.14.2" reason="no keys available, no pom artifact to create a checksum"/>
</trusted-artifacts>
<ignored-keys>
<ignored-key id="59E05CE618187ED4" reason="Key couldn't be downloaded from any key server"/>
</ignored-keys>
<trusted-keys>
<trusted-key id="015479E1055341431B4545AB72475FD306B9CAB7" group="com.googlecode.javaewah" name="JavaEWAH" version="1.2.3"/>
<trusted-key id="042B29E928995B9DB963C636C7CA19B7B620D787" group="com.github.stephenc.jcip" name="jcip-annotations" version="1.0-1"/>
@ -25,6 +22,7 @@
<trusting group="org.apache.httpcomponents.client5"/>
<trusting group="org.apache.httpcomponents.core5"/>
</trusted-key>
<trusted-key id="08EF3EC268A80497ED2030812838A2C567F74226" group="org.scala-lang.modules" name="scala-parallel-collections_2.13" version="1.0.4"/>
<trusted-key id="08F0AAB4D0C1A4BDDE340765B341DDB020FCB6AB" group="org.bouncycastle"/>
<trusted-key id="0A784736254716AC0EBEF6E2365D826E84B11B58" group="com.karumi"/>
<trusted-key id="0C6914BDDF32BD0AF3AAEB8A2148325ADD28A1AD" group="^com[.]atlassian($|([.].*))" regex="true"/>
@ -50,7 +48,10 @@
<trusting group="dev.equo.ide" name="solstice" version="1.7.5"/>
</trusted-key>
<trusted-key id="1D9AA7F9E1E2824728B8CD1794B291AEF984A085" group="io.reactivex.rxjava3"/>
<trusted-key id="1FA868A348719E88B6D0DE24C03EF1D7D692BCFF" group="org.scala-lang" name="scala-library" version="2.12.13"/>
<trusted-key id="1FA868A348719E88B6D0DE24C03EF1D7D692BCFF">
<trusting group="org.scala-lang" name="scala-library" version="2.12.13"/>
<trusting group="org.scala-lang" name="scala-library" version="2.13.11"/>
</trusted-key>
<trusted-key id="1FFDCCF6BDC0B17BD26B4A761F012999BF55C33C" group="ar.com.hjg" name="pngj" version="2.1.0"/>
<trusted-key id="24D04176586361FDA94EE0315F7786DF73E61F56" group="com.google.devtools.ksp"/>
<trusted-key id="26CCB560222376C280C15DAC453A03A250A2F726" group="com.github.fondesa" name="kpermissions" version="3.3.0"/>
@ -92,9 +93,13 @@
<trusted-key id="3F2A008A91D11A7FAC4A0786F13D3E721D56BD54" group="org.reflections" name="reflections" version="0.10.2"/>
<trusted-key id="44F4797A52C336FA666CD9271DE461528F1F1B2A" group="org.apache.jackrabbit"/>
<trusted-key id="44FBDBBC1A00FE414F1C1873586654072EAD6677" group="org.sonatype.oss" name="oss-parent" version="9"/>
<trusted-key id="453EA31328DE7D8AAA55AD4ED56C721C1CFF1424" group="^com[.]twelvemonkeys($|([.].*))" regex="true"/>
<trusted-key id="474DA67C32063DCA7FFE9CB5760F395DC40D55A7" group="^io[.]noties($|([.].*))" regex="true"/>
<trusted-key id="47504B76CF89C15C0512D9AFE16AB52D79FD224F" group="com.google.api.grpc" name="proto-google-common-protos" version="2.0.1"/>
<trusted-key id="475F3B8E59E6E63AA78067482C7B12F2A511E325" group="org.slf4j"/>
<trusted-key id="475F3B8E59E6E63AA78067482C7B12F2A511E325">
<trusting group="ch.qos.logback"/>
<trusting group="org.slf4j"/>
</trusted-key>
<trusted-key id="4791825BDEA86EB9286A2ACE88BB19A33A18445F" group="net.ltgt.gradle.incap" name="incap" version="0.2"/>
<trusted-key id="4797B4F5DCC46CEA61059071A1AE06236CA2BA62" group="^com[.]diffplug($|([.].*))" regex="true"/>
<trusted-key id="47BF592261CD1A8A69B703B4E0CB7823CFD00FBF" group="com.jakewharton.android.repackaged" name="dalvik-dx" version="9.0.0_r3"/>
@ -121,12 +126,15 @@
<trusted-key id="517B94F8D0A46317A28D8AB30DA8A5EC02D11EAD" group="net.sf.jopt-simple" name="jopt-simple" version="4.9"/>
<trusted-key id="51B52DC5DD452F92BE342CC2858FC4C4F43856A3" group="xerces" name="xercesImpl" version="2.12.0"/>
<trusted-key id="51BF0A126F41293F40F50A0B8CD7D660AE857DAD" group="com.getkeepsafe.relinker" name="relinker" version="1.4.5"/>
<trusted-key id="52257550C50C003F8AD1CF7FFB63BCA973FAA119" group="com.github.zh79325" name="open-gif" version="1.0.4"/>
<trusted-key id="5267821899275610A75A802D935155A0DE8B1CD6" group="com.sksamuel.scrimage" name="scrimage-core_2.12" version="2.1.8"/>
<trusted-key id="53C935821AA6A755BD337DB53595395EB3D8E1BA" group="org.apache.logging.log4j"/>
<trusted-key id="56B505DC8A29C69138A430B9429C8816DEA04CDB" group="org.xerial" name="sqlite-jdbc" version="3.36.0"/>
<trusted-key id="5897253BEA3046AEEA95A067E93671C7272B7B3F" group="org.jdom" name="jdom2" version="2.0.6"/>
<trusted-key id="59B06224FD8912E36603BE79FEFE78456EDDC34A" group="io.mockk"/>
<trusted-key id="5CBA19E56141E78D54BF716F08A4A4958D61FC3D" group="com.sksamuel.scrimage"/>
<trusted-key id="5F6C2148AD4911FE308110E5F0D0AE433308B042" group="io.gitlab.arturbosch.detekt"/>
<trusted-key id="600D21219963F228200A72375365A8A69292AF1A" group="org.scala-lang.modules" name="scala-xml_2.13" version="2.1.0"/>
<trusted-key id="6016620F8A8FFBBBCC6D44F21AE999FF489B55CB" group="com.github.albfernandez" name="juniversalchardet" version="2.0.3"/>
<trusted-key id="60200AC4AE761F1614D6C46766D68DAA073BE985">
<trusting group="ch.qos.logback"/>
@ -227,6 +235,7 @@
<trusted-key id="BDB5FA4FE719D787FB3D3197F6D4A1D411E9D1AE" group="com.google.guava"/>
<trusted-key id="BFD244AF9E85F6ABDCA2B65CDE61FB98F06CE8AE" group="org.json4s"/>
<trusted-key id="C0612048F3393B80B22639B4F067A2FD751AE3E4" group="io.github.davidburstrom.contester" name="contester-breakpoint" version="0.2.0"/>
<trusted-key id="C1CBA75EC9BD0BAF8061935459E05CE618187ED4" group="org.xerial" name="sqlite-jdbc" version="3.41.2.2"/>
<trusted-key id="C478A820AD150412FF2860C563426A08B91ED6B0" group="org.scala-lang.modules" name="scala-xml_2.12" version="1.3.0"/>
<trusted-key id="C5AA57F4A38EBA7B7F9156DDAB2DA4527F6FFC0B" group="com.squareup"/>
<trusted-key id="C6F7D1C804C821F49AF3BFC13AD93C3C677A106E" group="io.perfmark" name="perfmark-api" version="0.23.0"/>
@ -251,6 +260,7 @@
<trusted-key id="DBD744ACE7ADE6AA50DD591F66B50994442D2D40" group="^com[.]squareup($|([.].*))" regex="true"/>
<trusted-key id="DD80AF584ECDB83D650C4FC78EDF241183415AF1" group="com.github.akarnokd" name="ixjava" version="1.0.0"/>
<trusted-key id="DF25D3C4868FEC177182FAD64D176DC503FB4267" group="io.coil-kt"/>
<trusted-key id="E01AAB301618D23B39DBD41002DE09238A0E4D34" group="com.drewnoakes" name="metadata-extractor" version="2.18.0"/>
<trusted-key id="E3A9F95079E84CE201F7CF60BEDE11EAF1164480" group="org.hamcrest"/>
<trusted-key id="E5C3B1929191DF06136CCB2B164779204E106A76" group="org.javassist" name="javassist" version="3.28.0-GA"/>
<trusted-key id="E77417AC194160A3FABD04969A259C7EE636C5ED" group="^com[.]google($|([.].*))" regex="true"/>
@ -260,6 +270,7 @@
<trusted-key id="EAA526B91DD83BA3E1B9636FA730529CA355A63E" group="org.ccil.cowan.tagsoup" name="tagsoup" version="1.2.1"/>
<trusted-key id="EBB241A545CB17C87FACB2EBD0BF1D737C9A1C22" group="net.sourceforge.pmd"/>
<trusted-key id="EE0CA873074092F806F59B65D364ABAA39A47320" group="com.google.errorprone"/>
<trusted-key id="EF5214AD654CD05F0DA91609ECEAC3B11AD0E0A0" group="com.adobe.xmp" name="xmpcore" version="6.1.11"/>
<trusted-key id="F1A51E051F527E0C8E24D54D4B1E11D5A4B91E89" group="com.google.protobuf"/>
<trusted-key id="F254B35617DC255D9344BCFA873A8E86B4372146">
<trusting group="org.apache" name="apache" version="13"/>
@ -299,6 +310,11 @@
<sha256 value="1dca60bf47543e31a36ba27eb71b898e2ec65bd85c1f8d3782b0945e24341364" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.2.1">
<artifact name="activity-1.2.1.module">
<sha256 value="7e8cd74c2fa8166d82663f75a65c8375d4fdec6f1ba880b526dae4192a29a2c9" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.2.2">
<artifact name="activity-1.2.2.aar">
<sha256 value="e165fb20f006b77894d349572cc3acd2760baa8416ae4d33cb8de6a84dd6730c" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -307,6 +323,11 @@
<sha256 value="b7730754793e2fa510ddb10b7514e65f8706e4ec4b100acf7e4215f0bd5519b4" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.5.1">
<artifact name="activity-1.5.1.module">
<sha256 value="c4317fb95ce2716b88f1f4a5334795efda084097a3f2447ffccb10a412c85be4" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.6.0">
<artifact name="activity-1.6.0.aar">
<sha256 value="7f08723ecabefba616d60c714b0e9a31301bd4d0792fcc7946c1479c57fd2d28" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -315,6 +336,14 @@
<sha256 value="b561e41c1bddb2160f79b9bc7541ad9ed110147ab2ccf63719a23d498470b043" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.7.0">
<artifact name="activity-1.7.0.aar">
<sha256 value="e44b2032273387156982912c591ef7e2dd485ba0b2e689b528b5a42f271a4f27" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="activity-1.7.0.module">
<sha256 value="2a746b0126a8ab2f576e7167f1a785b452ef7ee997abd979ee0c5a29c36f6ea6" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.7.2">
<artifact name="activity-1.7.2.module">
<sha256 value="aa629fbdb50669248338956fab5b308ade51df188f355067d5d0726b3275ff1f" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -328,6 +357,19 @@
<sha256 value="d145d8b53cfd11fd26e47e7dd45c007133ef96ea24f6715cb653c737645d1df6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-compose" version="1.3.0">
<artifact name="activity-compose-1.3.0.module">
<sha256 value="30fd58f97339dde1f7f779b1b6a448c13f65102de46bacd5cc7849b762a4e7d2" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-compose" version="1.7.0">
<artifact name="activity-compose-1.7.0.aar">
<sha256 value="caa72885d1ce7979c1d6c59a8b255c6097b770780d4d4da95d56979a348646cd" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="activity-compose-1.7.0.module">
<sha256 value="f7a29bcba338575dcf89a553cff9cfad3f140340eaf2b56fd0193244da602c0a" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.2.2">
<artifact name="activity-ktx-1.2.2.aar">
<sha256 value="9829e13d6a6b045b03b21a330512e091dc76eb5b3ded0d88d1ab0509cf84a50e" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -336,6 +378,11 @@
<sha256 value="92f4431091650b5a67cc4f654bd9b822c585cf4262180912f075779f07a04ba6" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.3.0">
<artifact name="activity-ktx-1.3.0.module">
<sha256 value="332265dd581e12a704957e4b0a5bc2142cd8362195c74722646064cb1e68280a" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.5.1">
<artifact name="activity-ktx-1.5.1.module">
<sha256 value="890eb6f3aa3d119236b4c96ec6b1beb647c296a4d99ca7e4a500a164a95ca2cb" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -346,6 +393,14 @@
<sha256 value="574b89ee589c530ec4d3fc412aac890066842db45a6a9a1bbe89542e0b47e81b" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.7.0">
<artifact name="activity-ktx-1.7.0.aar">
<sha256 value="fce317d61a22f12967b475bfcb80c89dda66e418975e890ea703cb74e12b5b11" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="activity-ktx-1.7.0.module">
<sha256 value="f4001a709b6f7132b22a5e17c24f8b8a9b3c462a598de3b0f16cc57a4344bab6" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.8.0">
<artifact name="activity-ktx-1.8.0.aar">
<sha256 value="bfee12c1c88c3f74954fbf6e6766bc183956f37478b7c024fae7f5b38493d7a5" origin="Generated by Gradle"/>
@ -666,6 +721,11 @@
<sha256 value="2810e76c7386afb5c6e606c0a18fcf4655471eff3a88ce5b57637384efe882bd" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.0.0">
<artifact name="runtime-1.0.0.module">
<sha256 value="8a82fdb0c8264bc7f4addf715417dfc427e9b0aaed8ad507a2bd11be3eb11b5d" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.0.0-beta03">
<artifact name="runtime-1.0.0-beta03.aar">
<sha256 value="5ab7662bac71ba3f3f48287ec045af083c5b5806dfbf2717662705edd33173de" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -674,6 +734,19 @@
<sha256 value="fb1f6624ceb87426e4b659e7ad868cc98e5fad7c3b8418b9c33114fa0edfd7eb" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.2.1">
<artifact name="runtime-1.2.1.module">
<sha256 value="80bdfc01d2d916afc195ab14b0718e055ebce788a4aca7cfbb81d7660466e816" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime" version="1.4.3">
<artifact name="runtime-1.4.3.aar">
<sha256 value="f975185e13d3e5b0c142e220e924bfe643d4421b0fdae3f2036f1e0160a390f4" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="runtime-1.4.3.module">
<sha256 value="eb9df383e284282a6ebc9b23e09b4dbef196d299beabb68eb3dfbe0f7909041c" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.0.0-beta03">
<artifact name="runtime-saveable-1.0.0-beta03.aar">
<sha256 value="fcbc8bac14f09cc2f8f99d94a3e5affbdf601d682858b23dffd0fca01cd2dfeb" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -682,6 +755,19 @@
<sha256 value="e109d4f78314e6d49a57f47a24304bd2bd55c1eb152bf6f8aeca4c6fd159b37d" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.2.1">
<artifact name="runtime-saveable-1.2.1.module">
<sha256 value="212a29a7961157534989d037ba696ea15dee3deb3fdcfd4f124aeeddbd5c0cf5" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.runtime" name="runtime-saveable" version="1.4.3">
<artifact name="runtime-saveable-1.4.3.aar">
<sha256 value="756d7f53d64b664ad168c7109aa88cc394fb51aee6a2bb7ac86982242834f5ca" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="runtime-saveable-1.4.3.module">
<sha256 value="0200f91f504e138b8c4af2c7da19e510efe1400409903b97af047e9295ea8347" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui" version="1.0.0-beta03">
<artifact name="ui-1.0.0-beta03.aar">
<sha256 value="6218c5e18266dbed86ca100692a91df91ecb005d1eb0782154aa00c2043130f4" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -690,6 +776,14 @@
<sha256 value="d80393dd51cc89361e0edb7d9ca0f2dc7991e290123e62972fd601cdca65da50" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui" version="1.4.3">
<artifact name="ui-1.4.3.aar">
<sha256 value="a49acd04ac5d596a1e3b00fd965612901b7d05975c51cc5bcf5258bfc3dbca43" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-1.4.3.module">
<sha256 value="6368ef2f7070753341b32a8d3d3953fd11cd9383fa9947331a0b17ce91893b70" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-geometry" version="1.0.0-beta03">
<artifact name="ui-geometry-1.0.0-beta03.aar">
<sha256 value="5a27ac60d83a091850310273db3b50f51ff16a2874bd964746a546edf5dd3af4" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -698,6 +792,14 @@
<sha256 value="d8db42ec77b70b35efb03279fc28bfbad741664c7aea2b12194ad4c6abb4661f" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-geometry" version="1.4.3">
<artifact name="ui-geometry-1.4.3.aar">
<sha256 value="ef98ec03f6104730c3152f8ea27404f0764c715872f25a1d893879dd4c2e55bd" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-geometry-1.4.3.module">
<sha256 value="43a9ea188350a9d24c03dda08a76798940a63c8946b36db8fd869ba49adc045c" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-graphics" version="1.0.0-beta03">
<artifact name="ui-graphics-1.0.0-beta03.aar">
<sha256 value="de0049466a031faf2927334df489541c60256aca5519f722dae1140b52385df4" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -706,6 +808,14 @@
<sha256 value="0b6a253de6326f3df4c0206db63b9275c10a26a135844c5871b32c335ef30f72" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-graphics" version="1.4.3">
<artifact name="ui-graphics-1.4.3.aar">
<sha256 value="298cdc2ff4ea610a22b01f666a460239aa260f2467f7762d575d84e773545b2d" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-graphics-1.4.3.module">
<sha256 value="145368f666b9881a571884690a1a480856908e1393d197e2c694e9070c9f9054" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test" version="1.0.0-beta03">
<artifact name="ui-test-1.0.0-beta03.aar">
<sha256 value="4df5a345f1746f6a1f96cd02188353b6e90606774d3bbd82c7cbcbc653365c9d" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -714,6 +824,14 @@
<sha256 value="3d69bf17e92d730856bd7fc02834a3befd7af95e369ac34c0eab4b045788057b" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test" version="1.4.3">
<artifact name="ui-test-1.4.3.aar">
<sha256 value="178ecaeb147a0451ac6ad589eec7b7b1594e5ad16754b49216c4702c73303304" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-test-1.4.3.module">
<sha256 value="d40b581a7f223d04d9180d2c4ba437459933f38d2bcc5db24e57757b234aeb95" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test-junit4" version="1.0.0-beta03">
<artifact name="ui-test-junit4-1.0.0-beta03.aar">
<sha256 value="f376db003a6fea41a07d177763c06d4c97ae7745cf7129b48b37109ab6356c87" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -722,6 +840,14 @@
<sha256 value="a8c79889f157ba9ebcaf940661c5171c807c9754b21ef58c029a4726f857ba91" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-test-junit4" version="1.4.3">
<artifact name="ui-test-junit4-1.4.3.aar">
<sha256 value="5a6a6c8e213613e29e0529336483974f6aea9cd0f09fea7212e58a273ec42ce0" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-test-junit4-1.4.3.module">
<sha256 value="ba440331b8d5370536958c32da04832635e635a30d5263a4ed43be07b44eb14b" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-text" version="1.0.0-beta03">
<artifact name="ui-text-1.0.0-beta03.aar">
<sha256 value="9bb92972c4c66700c77b7ae6c2af1ce51f9e02e70c865875c388f56e4ac70de0" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -730,6 +856,14 @@
<sha256 value="fa42289fa59f360fda2707de2dddf31344845c5430098bb90df719decf02f025" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-text" version="1.4.3">
<artifact name="ui-text-1.4.3.aar">
<sha256 value="dfa801c2b6b29c97a7f6a20fc45a9b2cb8da4d52b1601d9f10c70878f98f1faa" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-text-1.4.3.module">
<sha256 value="1f0e14c174dd69da7f5125a6f6cff9bc6b367fa6aae36bd75f06dde7cbaec218" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-unit" version="1.0.0-beta03">
<artifact name="ui-unit-1.0.0-beta03.aar">
<sha256 value="886206123433a0b07f36a67bfac3d6ea36086305658d4e4c799527116732ac28" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -738,6 +872,14 @@
<sha256 value="0e94b115ba03a9b2af9e89dbe6b3bb313fca43e61054b582dec65c0c2347b0ce" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-unit" version="1.4.3">
<artifact name="ui-unit-1.4.3.aar">
<sha256 value="0dfbac9fbf2ca6dce36cd3d990786c9bc09fcfe962cbe27af531311d49611eb4" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-unit-1.4.3.module">
<sha256 value="70110f247d733d453714f97f88afa1a003258689069d4e458933456c67840f3c" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-util" version="1.0.0-beta03">
<artifact name="ui-util-1.0.0-beta03.aar">
<sha256 value="b3345179a819a40e6dd0201212175ef76e9fd7e32dc943a4237506da767ed6b1" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -746,6 +888,14 @@
<sha256 value="c9d6fbfcf5ded03a6f398303dd2f5d68d95bf90d8f6f55ed0cbc3733b6a93838" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.compose.ui" name="ui-util" version="1.4.3">
<artifact name="ui-util-1.4.3.aar">
<sha256 value="a6ad526f26de348c69f57f1bd8742853ea58b3a22a571fbb76a6d8ba8e620d7e" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="ui-util-1.4.3.module">
<sha256 value="c4d60495386efdb565b7a66c1a00dbe3590c3ef91e9e13a20fbb31d6e17e8009" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.concurrent" name="concurrent-futures" version="1.0.0">
<artifact name="concurrent-futures-1.0.0.jar">
<sha256 value="5595a40e278a7b39fa78a09490e3d7f3faa95c7b01447148bd38b5ade0605c35" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -854,6 +1004,11 @@
<sha256 value="8348e2b5c0c7e283370b85037cec8b32b4acab8d73a7a53235a372446b1387c8" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.core" name="core" version="1.7.0">
<artifact name="core-1.7.0.module">
<sha256 value="988f820899d5a4982e5c878ca1cd417970ace332ea2ff72f5be19b233fa0e788" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.core" name="core" version="1.9.0">
<artifact name="core-1.9.0.aar">
<sha256 value="8bda3ee3a88887d54f6679fb6b6cd788629f73234ac91c8bbed924e721ec85b8" origin="Generated by Gradle"/>
@ -886,6 +1041,11 @@
<sha256 value="29eaddba4e6a35e68a128e594ebae3b72ef7e767f1b273ef93dc2ed019ff97f6" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.core" name="core-ktx" version="1.5.0">
<artifact name="core-ktx-1.5.0.module">
<sha256 value="b037fdfb267dc0141ab9f4e4e85daf87b175cf311248d54b501b58ec42345315" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.core" name="core-ktx" version="1.8.0">
<artifact name="core-ktx-1.8.0.module">
<sha256 value="a91bc3e02f209f643dd8275345a9e3003ce20d64fc0760eccf479c1709842f72" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -1101,6 +1261,14 @@
<sha256 value="9951cb91d43d916e1aa298682121c42d49c1f0280061d002f1f36ff6cb5318ee" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment" version="1.6.0">
<artifact name="fragment-1.6.0.aar">
<sha256 value="eaad568874cea7e1738beebf3298670a8743e25bb4934546764bee62f6d27f26" origin="Generated by Gradle"/>
</artifact>
<artifact name="fragment-1.6.0.module">
<sha256 value="e5e36b5a630ba3e2e96ea852d371579290b5aaa2dc5fb9897989a10bace513c7" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment" version="1.6.1">
<artifact name="fragment-1.6.1.aar">
<sha256 value="5eeb5964a8edb25966d5cc7933fe893e3c58e245ac433d358478b20b6d09d4e3" origin="Generated by Gradle"/>
@ -1122,6 +1290,14 @@
<sha256 value="b3955b619e8a16c38af39c19126867c72d1954db05551709e58c082b946078c4" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-ktx" version="1.6.0">
<artifact name="fragment-ktx-1.6.0.aar">
<sha256 value="48c57ecebc6c1b07baf7dd1b77095560bb1f158aec83ba155645b77a1ce53307" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="fragment-ktx-1.6.0.module">
<sha256 value="cdce823ab3ebfecf9400edcfb9248c3920e1ed62fc7d189692dbdb0145660fab" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-ktx" version="1.6.1">
<artifact name="fragment-ktx-1.6.1.aar">
<sha256 value="3e4595cda9bee392715959366d70790704ff240c77656e702f3c8220b3d9245a" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -1138,6 +1314,14 @@
<sha256 value="75714382c8f9e292b01762852fd0672d33973254c2bd2b9918b50f861792b171" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-testing" version="1.6.0">
<artifact name="fragment-testing-1.6.0.aar">
<sha256 value="60effba842729d21c8134e5f75f38c79a919f3eca345359024582a92a3215c2a" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="fragment-testing-1.6.0.module">
<sha256 value="779fb54ac2b9720ab464f8ba45af8ae2735d7257ad81ba09d0f7c23a6a992aba" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-testing" version="1.6.1">
<artifact name="fragment-testing-1.6.1.aar">
<sha256 value="826e7ae51ba7133e905964b3d37ce8b2a4c7617ae6afa04295fb8dd06810807a" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -1146,6 +1330,14 @@
<sha256 value="2cdb7629e9a4dd6ac87b8a890ce535299e23dfa6ec08dd80626b7d3416f3672a" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-testing-manifest" version="1.6.0">
<artifact name="fragment-testing-manifest-1.6.0.aar">
<sha256 value="27257bd7640fcb6b273639309962afc0d61aaad5f086bcf4ba973f708c389629" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="fragment-testing-manifest-1.6.0.module">
<sha256 value="574f209ab2bde1158082e96fc1edb8f20e235b46105d76fd2e4367a506acb925" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
</component>
<component group="androidx.fragment" name="fragment-testing-manifest" version="1.6.1">
<artifact name="fragment-testing-manifest-1.6.1.aar">
<sha256 value="185dc939a78d2f500188b20a7327e55b28cad7e4b944a73b3396d7ff89bc579c" origin="Generated by Gradle" reason="Artifact is not signed"/>
@ -1680,6 +1872,9 @@
</artifact>
</component>
<component group="androidx.profileinstaller" name="profileinstaller" version="1.3.0">
<artifact name="profileinstaller-1.3.0.aar">
<sha256 value="34e8b2bfc74e23c1525e3da903ae449b7f1b440aef45e18159ee470e91997f48" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
<artifact name="profileinstaller-1.3.0.module">
<sha256 value="a16fe511e599c2042da122be09569aecd3f4f90cad37ef08bd0bbc39118c92c8" origin="Generated by Gradle" reason="Artifact is not signed"/>
</artifact>
@ -2911,6 +3106,11 @@
<sha256 value="9a75f3e32bf9d6e00678d9447ace4de8596a2d221af5cf5bbc7f571cac795006" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml" name="oss-parent" version="41">
<artifact name="oss-parent-41.pom">
<pgp value="8A10792983023D5D14C93B488D7F1BEC1E2ECAE7"/>
</artifact>
</component>
<component group="com.fasterxml" name="oss-parent" version="48">
<artifact name="oss-parent-48.pom">
<sha256 value="11bba22d8631816e09b623a200747453d6491a66eac8f5c089c73da2b749014f" origin="Generated by Gradle" reason="A key couldn't be downloaded"/>