Compare commits

..

No commits in common. "79a357537ba7982d15d0fd3d9a13849f7c2d942f" and "1ef725ef208c4a5216b5465dd5a90c02abfaf9d5" have entirely different histories.

2357 changed files with 37636 additions and 101994 deletions

Binary file not shown.

View file

@ -1,2 +0,0 @@
#Sun Nov 16 19:38:37 CET 2025
gradle.version=8.7

View file

@ -1,2 +0,0 @@
#Sun Nov 16 19:38:32 CET 2025
java.home=/app/extra/jbr

3
.idea/.gitignore generated vendored
View file

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

File diff suppressed because it is too large Load diff

12
.idea/gradle.xml generated
View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
</GradleProjectSettings>
</option>
</component>
</project>

8
.idea/markdown.xml generated
View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

10
.idea/migrations.xml generated
View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

10
.idea/misc.xml generated
View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View file

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View file

@ -1,65 +1,17 @@
## 3.30.7 (January 6, 2025)
- Fix crash of auto upload settings
Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/104
## 3.30.3 (October 22, 2024)
- Bugfix for two way sync: sync only on wifi
## 3.30.2 (October 21, 2024)
- Bugfix for two way sync. Please check listed folders in settings -> internal two way sync
Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/99
## 3.30.1 (October 11, 2024)
- Bugfixes
Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/99
## 3.29.1 (June 27, 2024)
- Bugfixes
Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/93
<!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-FileCopyrightText: 2016-2024 Tobias Kaminsky <tobias@kaminsky.me>
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
-->
## 3.29.0 (April 24, 2024)
- NC Assistant
- Client certificates
- Personal files view
- REUSE compliance
- Bugfixes
Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/89
## 3.28.2 (April 4th, 2024) ## 3.28.2 (April 4th, 2024)
- Bugfixes - Bugfixes
Minimum: NC 16 Server, Android 7.0 Nougat Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/90 For a full list, please see https://github.com/nextcloud/android/milestone/90
<!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later
-->
## 3.28.1 (March 25th, 2024) ## 3.28.1 (March 25th, 2024)
- Bugfixes - Bugfixes
@ -73,6 +25,7 @@ For a full list, please see https://github.com/nextcloud/android/milestone/90
- E2E sharing - E2E sharing
- Bugfixes - Bugfixes
Minimum: NC 16 Server, Android 7.0 Nougat Minimum: NC 16 Server, Android 7.0 Nougat
For a full list, please see https://github.com/nextcloud/android/milestone/88 For a full list, please see https://github.com/nextcloud/android/milestone/88

View file

@ -1,6 +1,6 @@
<!-- <!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software. In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software.

View file

@ -1,6 +1,6 @@
<!-- <!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
# [Nextcloud](https://nextcloud.com) Android app # [Nextcloud](https://nextcloud.com) Android app
@ -191,17 +191,17 @@ Source code of app:
* Nextcloud - Android Client * Nextcloud - Android Client
* *
* SPDX-FileCopyrightText: 2024 Your Name <your@email.com> * SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */
``` ```
XML (layout) file: XML (layout) file:
```xml ```xml
<!-- <!--
~ Nextcloud - Android Client ~ Nextcloud Talk - Android Client
~ ~
~ SPDX-FileCopyrightText: 2024 Your name <your@email.com> ~ SPDX-FileCopyrightText: 2024 Your name <your@email.com>
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
``` ```

View file

@ -5,44 +5,42 @@ GEM
base64 base64
nkf nkf
rexml rexml
addressable (2.8.7) addressable (2.8.6)
public_suffix (>= 2.0.2, < 7.0) public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.17) artifactory (3.0.17)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.4.0) aws-eventstream (1.3.0)
aws-partitions (1.1121.0) aws-partitions (1.913.0)
aws-sdk-core (3.226.1) aws-sdk-core (3.191.6)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.9) aws-sigv4 (~> 1.8)
base64
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
logger aws-sdk-kms (1.78.0)
aws-sdk-kms (1.106.0) aws-sdk-core (~> 3, >= 3.191.0)
aws-sdk-core (~> 3, >= 3.225.0) aws-sigv4 (~> 1.1)
aws-sigv4 (~> 1.5) aws-sdk-s3 (1.146.1)
aws-sdk-s3 (1.191.0) aws-sdk-core (~> 3, >= 3.191.0)
aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.8)
aws-sigv4 (1.12.1) aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
base64 (0.3.0) base64 (0.2.0)
cgi (0.4.2) cgi (0.4.1)
claide (1.1.0) claide (1.1.0)
colored (1.2) colored (1.2)
colored2 (3.1.2) colored2 (3.1.2)
commander (4.6.0) commander (4.6.0)
highline (~> 2.0.0) highline (~> 2.0.0)
declarative (0.0.20) declarative (0.0.20)
digest-crc (0.7.0) digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0) rake (>= 12.0.0, < 14.0.0)
domain_name (0.6.20240107) domain_name (0.6.20240107)
dotenv (2.8.1) dotenv (2.8.1)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.112.0) excon (0.110.0)
faraday (1.10.4) faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1) faraday-excon (~> 1.1)
@ -58,20 +56,20 @@ GEM
faraday (>= 0.8.0) faraday (>= 0.8.0)
http-cookie (~> 1.0.0) http-cookie (~> 1.0.0)
faraday-em_http (1.0.0) faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.1) faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0) faraday-excon (1.1.0)
faraday-httpclient (1.0.1) faraday-httpclient (1.0.1)
faraday-multipart (1.1.1) faraday-multipart (1.0.4)
multipart-post (~> 2.0) multipart-post (~> 2)
faraday-net_http (1.0.2) faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
faraday-rack (1.0.0) faraday-rack (1.0.0)
faraday-retry (1.0.3) faraday-retry (1.0.3)
faraday_middleware (1.2.1) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.4.0) fastimage (2.3.1)
fastlane (2.228.0) fastlane (2.220.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@ -87,7 +85,6 @@ GEM
faraday-cookie_jar (~> 0.0.6) faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0) faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0) fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0) gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3) google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1) google-apis-playcustomapp_v1 (~> 0.1)
@ -111,12 +108,10 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0) word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0) xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-plugin-huawei_appgallery_connect (1.0.31) fastlane-plugin-huawei_appgallery_connect (1.0.28)
cgi cgi
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0) google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
@ -134,12 +129,12 @@ GEM
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0) google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.8.0) google-cloud-core (1.7.0)
google-cloud-env (>= 1.0, < 3.a) google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.5.0) google-cloud-errors (1.4.0)
google-cloud-storage (1.47.0) google-cloud-storage (1.47.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
@ -155,39 +150,36 @@ GEM
os (>= 0.9, < 2.0) os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a) signet (>= 0.16, < 2.a)
highline (2.0.3) highline (2.0.3)
http-cookie (1.0.8) http-cookie (1.0.5)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.9.0) httpclient (2.8.3)
mutex_m
jmespath (1.6.2) jmespath (1.6.2)
json (2.12.2) json (2.7.2)
jwt (2.10.1) jwt (2.8.1)
base64 base64
logger (1.7.0) mini_magick (4.12.0)
mini_magick (4.13.2)
mini_mime (1.1.5) mini_mime (1.1.5)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.4.1) multipart-post (2.4.0)
mutex_m (0.3.0) nanaimo (0.3.0)
nanaimo (0.4.0) naturally (2.2.1)
naturally (2.3.0)
nkf (0.2.0) nkf (0.2.0)
optparse (0.6.0) optparse (0.4.0)
os (1.1.4) os (1.1.4)
plist (3.7.2) plist (3.7.1)
public_suffix (6.0.2) public_suffix (5.0.5)
rake (13.3.0) rake (13.2.1)
representable (3.2.0) representable (3.2.0)
declarative (< 0.1.0) declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0) uber (< 0.2.0)
retriable (3.1.2) retriable (3.1.2)
rexml (3.4.1) rexml (3.2.6)
rouge (3.28.0) rouge (2.0.7)
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.4.1) rubyzip (2.3.2)
security (0.1.5) security (0.1.5)
signet (0.20.0) signet (0.19.0)
addressable (~> 2.8) addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a) faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
@ -195,7 +187,6 @@ GEM
simctl (1.6.10) simctl (1.6.10)
CFPropertyList CFPropertyList
naturally naturally
sysrandom (1.0.5)
terminal-notifier (2.0.0) terminal-notifier (2.0.0)
terminal-table (3.0.2) terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3) unicode-display_width (>= 1.1.1, < 3)
@ -205,17 +196,17 @@ GEM
tty-spinner (0.9.3) tty-spinner (0.9.3)
tty-cursor (~> 0.7) tty-cursor (~> 0.7)
uber (0.1.0) uber (0.1.0)
unicode-display_width (2.6.0) unicode-display_width (2.5.0)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.27.0) xcodeproj (1.24.0)
CFPropertyList (>= 2.3.3, < 4.0) CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3) atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0) claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1) colored2 (~> 3.1)
nanaimo (~> 0.4.0) nanaimo (~> 0.3.0)
rexml (>= 3.3.6, < 4.0) rexml (~> 3.2.4)
xcpretty (0.4.1) xcpretty (0.3.0)
rouge (~> 3.28.0) rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1) xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7) xcpretty (~> 0.2, >= 0.0.7)

View file

@ -1,49 +0,0 @@
Trademark policy
April 2023
You may not violate others intellectual property rights, including copyright and trademark.
A trademark is a word, logo, phrase, or device that distinguishes a trademark holders good or service in the marketplace. Trademark law may prevent others from using a trademark in an unauthorized or confusing manner.
What is in violation of this policy?
Using anothers trademark in a way that may mislead or confuse people about your affiliation may be a violation of our trademark policy.
What is not a violation of this policy?
Referencing anothers trademark is not automatically a violation of X's trademark policy. Examples of non-violations include:
* using a trademark in a way that is outside the scope of the trademark registration e.g., in a different territory, or a different class of goods or services than that identified in the registration; and
* using a trademark in a nominative or other fair use manner. For more information, see our Misleading and deceptive identities policy (https://help.twitter.com/en/rules-and-policies/twitter-impersonation-and-deceptive-identities-policy.html).
Who can report violations of this policy?
X only investigates requests that are submitted by the trademark holder or their authorized representative e.g., a legal representative or other representative for a brand.
How can I report violations of this policy?
You can submit a trademark report through our trademark report form (https://help.twitter.com/forms/trademark). Please provide all the information requested in the form. If you submit an incomplete report, well need to follow up about the missing information. Please note that this will result in a delay in processing your report.
Note: We may provide the account holder with your name and other information included in the copy of the report.
What happens if you violate this policy?
If we determine that you violated our trademark policy, we may suspend your account. Depending on the type of violation, we may give you an opportunity to comply with our policies. In other instances, an account may be permanently suspended upon first review. If you believe that your account was suspended in error, you can submit an appeal (https://help.twitter.com/forms/general?subtopic=suspended).
Additional resources
Learn more about our range of enforcement options (https://help.twitter.com/rules-and-policies/enforcement-options) and our approach to policy development and enforcement (https://help.twitter.com/rules-and-policies/enforcement-philosophy).
Legal disclaimer
By using the X trademarks and resources on this site, you agree to follow the X Trademark Guidelines in our Brand Guidelines — as well as our Terms of Service and all other X rules and policies. If you have any questions, contact us at trademarks@x.com.
A copy can be found at https://about.x.com/en/who-we-are/brand-toolkit and https://help.twitter.com/en/rules-and-policies/x-trademark-policy

View file

@ -1,10 +1,10 @@
<!-- <!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
# [Nextcloud](https://nextcloud.com) Android app :iphone: # [Nextcloud](https://nextcloud.com) Android app :iphone:
[![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/android)](https://api.reuse.software/info/github.com/nextcloud/android) [![Build Status](https://drone.nextcloud.com/api/badges/nextcloud/android/status.svg)](https://drone.nextcloud.com/nextcloud/android) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/fb4cf26336774ee3a5c9adfe829c41aa)](https://app.codacy.com/gh/nextcloud/android/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Releases](https://img.shields.io/github/release/nextcloud/android.svg)](https://github.com/nextcloud/android/releases/latest) [![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/android)](https://api.reuse.software/info/github.com/nextcloud/android) [![Build Status](https://drone.nextcloud.com/api/badges/nextcloud/android/status.svg)](https://drone.nextcloud.com/nextcloud/android) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/80401cb343854343b4d94acbfb72d3ec)](https://www.codacy.com/app/Nextcloud/android?utm_source=github.com\&utm_medium=referral\&utm_content=nextcloud/android\&utm_campaign=Badge_Grade) [![Releases](https://img.shields.io/github/release/nextcloud/android.svg)](https://github.com/nextcloud/android/releases/latest)
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play" alt="Download from Google Play"
@ -13,15 +13,6 @@ height="80">](https://play.google.com/store/apps/details?id=com.nextcloud.client
alt="Get it on F-Droid" alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/com.nextcloud.client/) height="80">](https://f-droid.org/packages/com.nextcloud.client/)
Signing certificate fingerprint to [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK:
- APK with "gplay" name, found [here](https://github.com/nextcloud/android/releases) or distributed via Google Play Store
- APK with "nextcloud", found [here](https://github.com/nextcloud/android/releases)
- not suitable for Fdroid downloads, as Fdroid is signing it on their own
```
SHA-256: fb009522f65e25802261b67b10a45fd70e610031976f40b28a649e152ded0373
SHA-1: 74aa1702e714941be481e1f7ce4a8f779c19dcea
```
**The Android client for [Nextcloud](https://nextcloud.com). Easily work with your data on your Nextcloud.** **The Android client for [Nextcloud](https://nextcloud.com). Easily work with your data on your Nextcloud.**
![App screenshots](/doc/Nextcloud_Android_Screenshots.png "App screenshots") ![App screenshots](/doc/Nextcloud_Android_Screenshots.png "App screenshots")

View file

@ -1,42 +0,0 @@
# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later
version = 1
SPDX-PackageName = "Nextcloud Android"
SPDX-PackageSupplier = "Nextcloud Android team <android@nextcloud.com>"
SPDX-PackageDownloadLocation = "https://github.com/nextcloud/android"
[[annotations]]
path = "gradle/wrapper/gradle-wrapper.jar"
precedence = "aggregate"
SPDX-FileCopyrightText = "2015-2021 the original authors"
SPDX-License-Identifier = "Apache-2.0"
[[annotations]]
path = ["user_manual/images/android-1.png", "user_manual/images/android-2.png", "user_manual/images/android-3.png", "user_manual/images/android-4.png", "user_manual/images/android-10.png", "user_manual/images/davdroid-1-button-in-nextcloud-app.png", "user_manual/images/davdroid-2-install-davdroid.png", "user_manual/images/davdroid-3-enter-password.png", "user_manual/images/davdroid-4-specify-owner-email.png"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2016-2024 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
[[annotations]]
path = ["user_manual/conf.py", "user_manual/android_app.rst", "user_manual/index.rst", "user_manual/conf.py", "user_manual/Makefile"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2015-2016 ownCloud Inc., 2016-2024 Nextcloud GmbH"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = ["user_manual/images/android-11.png", "user_manual/images/android-12.png", "user_manual/images/android-13.png", "user_manual/images/android-14.png", "user_manual/images/android-15.png", "user_manual/images/android-5.png", "user_manual/images/android-6.png", "user_manual/images/android-8.png", "user_manual/images/android-9.png"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2015-2016 ownCloud Inc."
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = ["app/src/**/res/mipmap-**dpi/ic_launcher.png", "app/src/**/ic_launcher-web.png", "src/generic/fastlane/metadata/android/en-US/images/icon.png", "src/versionDev/fastlane/metadata/android/en-US/images/icon.png", "app/src/main/ic_launcher-web-round.png"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2017-2024 Nextcloud GmbH <https://nextcloud.com/trademarks/>"
SPDX-License-Identifier = "LicenseRef-NextcloudTrademarks"
[[annotations]]
path = [".idea/**", "app/schemas/com.nextcloud.client.database.NextcloudDatabase/**.json", "app/screenshots/generic/debug/**.png", "app/src/main/res/values-**/strings.xml", "src/**/fastlane/metadata/android/**/**.txt", "src/versionDev/fastlane/metadata/android/**/changelogs/**.txt", "app/src/androidTest/assets/**", "app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker", "app/src/**/google-services.json", "app/src/main/res/drawable-**dpi/checker_16_16.png", "app/src/main/res/raw/encryption_key_words.txt", "app/src/main/resources/ical4j.properties", "app/src/main/res/drawable-**dpi/apk.png", "app/src/main/res/drawable-**dpi/fdroid.png", "app/src/main/res/drawable-**dpi/playstore.png", "app/src/main/res/drawable-**dpi/background.png", "app/src/main/res/drawable-**dpi/background_nc18.png"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2016-2024 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"

View file

@ -1,71 +1,28 @@
<!-- <!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
# Security Policy # Security Policy
# 💡 TLDR: Report issues at [hackerone.com/nextcloud](https://hackerone.com/nextcloud)
# Security Policy
[Security](https://nextcloud.com/security/) is very important to us.
If you believe you have found a security vulnerability that meets our definition of a security
vulnerability, please report is as described below.
## Context
Please review our [threat model and accepted risks](https://nextcloud.com/security/threat-model) to learn what
is currently considered a security vulnerability versus expected behavior. And review what is considered
[in scope or bounty eligible](https://hackerone.com/nextcloud/policy_scopes).
## Reporting a Vulnerability
**⚠️ Please do _not_ report security vulnerabilities through public GitHub issues.**
If you have discovered a security matter with Nextcloud, please read our
[responsible disclosure guidelines](https://nextcloud.com/security/) and contact us at
[hackerone.com/nextcloud](https://hackerone.com/nextcloud).
Your report should include:
- Product version
- A vulnerability description
- Reproduction steps
- Any other details you think are likely to be important
### What to Expect
You should receive an initial acknowledgement within 24 hours in most cases.
A member of the security team will confirm the vulnerability, determine its impact, follow-up with any questions,
and coordinate the fix and publication.
The fix will be applied to all applicable and still supported stable branches, tested, and packaged in the next security release.
The vulnerability will be publicly announced after the release. Finally, your name will be added
to the [hall of fame](https://hackerone.com/nextcloud/thanks) as a thank you from the entire Nextcloud
community.
If the vulnerability involves an app that is not maintained by Nextcloud (i.e. hosted by the
Nextcloud project but community maintained, or hosted elsewhere), the security team will try to coordinate with the
current maintainer and help to get the issue fixed in similar fashion.
### Bug Bounties
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Details
on past bounty ranges can be found at [hackerone.com/nextcloud](https://hackerone.com/nextcloud).
## Existing Security Advisories
Published security advisories for the Nextcloud Server, Clients and Apps can be viewed at
[https://github.com/nextcloud/security-advisories/security/advisories](https://github.com/nextcloud/security-advisories/security/advisories).
## Supported Versions ## Supported Versions
Only the latest version is supported. We release every second month a feature release (currently 3.x) and inbetween a bug fix release (3.x.y). Only the latest version is supported. We release every second month a feature release (currently 3.x) and inbetween a bug fix release (3.x.y).
## Additional Information ## Reporting a Vulnerability
Please visit [https://nextcloud.com/security/](https://nextcloud.com/security/) for further information about Nextcloud security. Security is very important to us. If you have discovered a security issue with Nextcloud,
Please visit [https://nextcloud.com/security/threat-model](https://nextcloud.com/security/threat-model) for our threat model and accepted risks. please read our responsible disclosure guidelines and contact us at [hackerone.com/nextcloud](https://hackerone.com/nextcloud).
Your report should include:
- Product version
- A vulnerability description
- Reproduction steps
A member of the security team will confirm the vulnerability, determine its impact, and develop a fix.
The fix will be applied to the master branch, tested, and packaged in the next bug fix release.
The vulnerability will be publicly announced after the release. Finally, your name will be added
to the [hall of fame](https://hackerone.com/nextcloud/thanks) as a thank you from the entire Nextcloud community. Note our
[threat model](https://nextcloud.com/security/threat-model) to know what is expected behavior.
Please visit https://nextcloud.com/security/ for further information about security.

View file

@ -1,6 +1,6 @@
<!-- <!--
~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
These instructions will help you to set up your development environment, get the source code of the Nextcloud for Android app and build it by yourself. If you want to help developing the app take a look to the [contribution guidelines][0]. These instructions will help you to set up your development environment, get the source code of the Nextcloud for Android app and build it by yourself. If you want to help developing the app take a look to the [contribution guidelines][0].

2
app/.gitignore vendored
View file

@ -1,3 +1,3 @@
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only # SPDX-License-Identifier: AGPL-3.0-or-later
/build /build

View file

@ -2,11 +2,11 @@
* Nextcloud - Android Client * Nextcloud - Android Client
* *
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com> * SPDX-FileCopyrightText: 2024 Alper Ozturk <alper_ozturk@proton.me>
* SPDX-FileCopyrightText: 2024 Tobias Kaminsky <tobias@kaminsky.me> * SPDX-FileCopyrightText: 2024 Tobias Kaminsky <tobias@kaminsky.me>
* SPDX-FileCopyrightText: 2024 Andy Scherzinger <info@andy-scherzinger.de> * SPDX-FileCopyrightText: 2024 Andy Scherzinger <info@andy-scherzinger.de>
* SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas <alvaro@alvarobrey.com> * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas <alvaro@alvarobrey.com>
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */
import com.github.spotbugs.snom.Confidence import com.github.spotbugs.snom.Confidence
import com.github.spotbugs.snom.Effort import com.github.spotbugs.snom.Effort
@ -16,11 +16,11 @@ import org.gradle.internal.jvm.Jvm
buildscript { buildscript {
dependencies { dependencies {
classpath "com.android.tools.build:gradle:$androidPluginVersion" classpath "com.android.tools.build:gradle:$androidPluginVersion"
classpath libs.spotbugs.gradle.plugin classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.12'
classpath libs.kotlin.gradle.plugin classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath libs.detekt.gradle.plugin classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.6"
classpath libs.commons.httpclient.commons.httpclient // remove after entire switch to lib v2 classpath "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
classpath libs.shot classpath 'com.karumi:shot:6.1.0'
classpath "org.jacoco:org.jacoco.core:$jacoco_version" classpath "org.jacoco:org.jacoco.core:$jacoco_version"
classpath "org.jacoco:org.jacoco.report:$jacoco_version" classpath "org.jacoco:org.jacoco.report:$jacoco_version"
classpath "org.jacoco:org.jacoco.agent:$jacoco_version" classpath "org.jacoco:org.jacoco.agent:$jacoco_version"
@ -28,35 +28,40 @@ buildscript {
} }
plugins { plugins {
alias(libs.plugins.kotlin.compose) id "com.diffplug.spotless" version "6.20.0"
alias(libs.plugins.spotless) id 'com.google.devtools.ksp' version '1.9.23-1.0.20' apply false
alias(libs.plugins.kapt)
alias(libs.plugins.ksp) apply false
} }
apply plugin: "com.android.application" apply plugin: 'com.android.application'
apply plugin: "kotlin-android" apply plugin: 'kotlin-android'
apply plugin: "kotlin-parcelize" apply plugin: 'kotlin-kapt'
apply plugin: "checkstyle" apply plugin: 'kotlin-parcelize'
apply plugin: "pmd" apply plugin: 'checkstyle'
apply plugin: 'pmd'
apply from: "$rootProject.projectDir/jacoco.gradle" apply from: "$rootProject.projectDir/jacoco.gradle"
apply plugin: "com.github.spotbugs" apply plugin: 'com.github.spotbugs'
apply plugin: "io.gitlab.arturbosch.detekt" apply plugin: 'io.gitlab.arturbosch.detekt'
// needed to make renovate run without shot, as shot requires Android SDK // needed to make renovate run without shot, as shot requires Android SDK
// https://github.com/pedrovgs/Shot/issues/300 // https://github.com/pedrovgs/Shot/issues/300
if (shotTest) { if (shotTest) {
apply plugin: "shot" apply plugin: 'shot'
} }
apply plugin: "com.google.devtools.ksp" apply plugin: 'com.google.devtools.ksp'
println "Gradle uses Java ${Jvm.current()}" println "Gradle uses Java ${Jvm.current()}"
configurations { configurations {
configureEach { configureEach {
exclude group: "org.jetbrains", module: "annotations-java5" // via prism4j, already using annotations explicitly exclude group: 'org.jetbrains', module: 'annotations-java5' // via prism4j, already using annotations explicitly
// check for updates every build
resolutionStrategy {
cacheChangingModulesFor 0, 'seconds'
exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"
}
} }
} }
@ -67,59 +72,39 @@ configurations.configureEach {
useVersion(checkerVersion) useVersion(checkerVersion)
because("https://github.com/google/ExoPlayer/issues/10007") because("https://github.com/google/ExoPlayer/issues/10007")
} }
if (requested.group == "commons-logging" && requested.name == "commons-logging") {
useTarget("org.slf4j:jcl-over-slf4j:1.7.4")
}
} }
} }
// semantic versioning for version code // semantic versioning for version code
def versionMajor = 3 def versionMajor = 3
def versionMinor = 34 def versionMinor = 29
def versionPatch = 1 def versionPatch = 3
def versionBuild = 90 // 0-50=Alpha / 51-98=RC / 90-99=stable def versionBuild = 90 // 0-50=Alpha / 51-98=RC / 90-99=stable
def ndkEnv = new HashMap<String, String>() def ndkEnv = new HashMap<String, String>()
file("$project.rootDir/ndk.env").readLines().each() { file("$project.rootDir/ndk.env").readLines().each() {
def (key, value) = it.tokenize("=") def (key, value) = it.tokenize('=')
ndkEnv.put(key, value) ndkEnv.put(key, value)
} }
def perfAnalysis = project.hasProperty("perfAnalysis") def perfAnalysis = project.hasProperty('perfAnalysis')
def getConfigProperties() {
def props = new Properties()
def file = rootProject.file(".gradle/config.properties")
if (file.exists()) {
props.load(new FileInputStream(file))
}
return props
}
def configProps = getConfigProperties()
android { android {
// install this NDK version and Cmake to produce smaller APKs. Build will still work if not installed // install this NDK version and Cmake to produce smaller APKs. Build will still work if not installed
ndkVersion = "${ndkEnv.get("NDK_VERSION")}" ndkVersion "${ndkEnv.get("NDK_VERSION")}"
namespace = "com.owncloud.android" namespace 'com.owncloud.android'
testNamespace = "${namespace}.test" testNamespace "${namespace}.test"
androidResources {
generateLocaleConfig = true
}
defaultConfig { defaultConfig {
applicationId = "com.nextcloud.client" minSdkVersion 24
minSdk = 27 targetSdkVersion 34
targetSdk = 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()
javaCompileOptions { javaCompileOptions {
annotationProcessorOptions { annotationProcessorOptions {
@ -136,7 +121,7 @@ android {
testInstrumentationRunnerArgument "TEST_SERVER_URL", "${NC_TEST_SERVER_BASEURL}" testInstrumentationRunnerArgument "TEST_SERVER_URL", "${NC_TEST_SERVER_BASEURL}"
testInstrumentationRunnerArgument "TEST_SERVER_USERNAME", "${NC_TEST_SERVER_USERNAME}" testInstrumentationRunnerArgument "TEST_SERVER_USERNAME", "${NC_TEST_SERVER_USERNAME}"
testInstrumentationRunnerArgument "TEST_SERVER_PASSWORD", "${NC_TEST_SERVER_PASSWORD}" testInstrumentationRunnerArgument "TEST_SERVER_PASSWORD", "${NC_TEST_SERVER_PASSWORD}"
testInstrumentationRunnerArguments disableAnalytics: "true" testInstrumentationRunnerArguments disableAnalytics: 'true'
versionCode versionMajor * 10000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild versionCode versionMajor * 10000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
@ -154,15 +139,8 @@ android {
flavorDimensions += "default" flavorDimensions += "default"
buildTypes { buildTypes {
release {
buildConfigField "String", "NC_TEST_SERVER_DATA_STRING", "\"\""
}
debug { debug {
testCoverageEnabled = project.hasProperty("coverage") testCoverageEnabled(project.hasProperty('coverage'))
resConfigs "xxxhdpi"
buildConfigField "String", "NC_TEST_SERVER_DATA_STRING", "\"nc://login/user:${configProps['NC_TEST_SERVER_USERNAME']}&password:${configProps['NC_TEST_SERVER_PASSWORD']}&server:${configProps['NC_TEST_SERVER_BASEURL']}\""
} }
} }
@ -173,17 +151,17 @@ android {
productFlavors { productFlavors {
// used for f-droid // used for f-droid
generic { generic {
applicationId "com.nextcloud.client" applicationId 'com.nextcloud.client'
dimension "default" dimension "default"
} }
gplay { gplay {
applicationId "com.nextcloud.client" applicationId 'com.nextcloud.client'
dimension "default" dimension "default"
} }
huawei { huawei {
applicationId "com.nextcloud.client" applicationId 'com.nextcloud.client'
dimension "default" dimension "default"
} }
@ -202,9 +180,10 @@ android {
} }
} }
testOptions { testOptions {
unitTests.returnDefaultValues = true unitTests.returnDefaultValues = true
animationsDisabled = true animationsDisabled true
} }
} }
@ -212,18 +191,17 @@ android {
// see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure
packagingOptions { packagingOptions {
resources { resources {
excludes += "META-INF/LICENSE*" excludes += 'META-INF/LICENSE*'
excludes += "META-INF/versions/9/OSGI-INF/MANIFEST*" pickFirst 'MANIFEST.MF' // workaround for duplicated manifest on some dependencies
pickFirst "MANIFEST.MF" // workaround for duplicated manifest on some dependencies
} }
} }
tasks.register("checkstyle", Checkstyle) { tasks.register("checkstyle", Checkstyle) {
configFile = file("${rootProject.projectDir}/checkstyle.xml") configFile = file("${rootProject.projectDir}/checkstyle.xml")
configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath
source "src" source 'src'
include "**/*.java" include '**/*.java'
exclude "**/gen/**" exclude '**/gen/**'
classpath = files() classpath = files()
} }
@ -232,26 +210,26 @@ android {
ignoreFailures = true // should continue checking ignoreFailures = true // should continue checking
ruleSets = [] ruleSets = []
source "src" source 'src'
include "**/*.java" include '**/*.java'
exclude "**/gen/**" exclude '**/gen/**'
reports { reports {
xml { xml {
destination = layout.buildDirectory.file("reports/pmd/pmd.xml").get().asFile destination = file("$project.buildDir/reports/pmd/pmd.xml")
} }
html { html {
destination = layout.buildDirectory.file("reports/pmd/pmd.html").get().asFile destination = file("$project.buildDir/reports/pmd/pmd.html")
} }
} }
} }
check.dependsOn "checkstyle", "spotbugsGplayDebug", "pmd", "lint", "spotlessKotlinCheck", "detekt" check.dependsOn 'checkstyle', 'spotbugsGplayDebug', 'pmd', 'lint', 'spotlessKotlinCheck', 'detekt'
buildFeatures { buildFeatures {
dataBinding = true dataBinding true
viewBinding = true viewBinding true
aidl = true aidl true
compose = true compose = true
} }
@ -265,11 +243,11 @@ android {
} }
lint { lint {
abortOnError = false abortOnError false
checkGeneratedSources = true checkGeneratedSources true
disable "MissingTranslation", "GradleDependency", "VectorPath", "IconMissingDensityFolder", "IconDensities", "GoogleAppIndexingWarning", "MissingDefaultResource", "InvalidPeriodicWorkRequestInterval", "StringFormatInvalid", "MissingQuantity" disable 'MissingTranslation', 'GradleDependency', 'VectorPath', 'IconMissingDensityFolder', 'IconDensities', 'GoogleAppIndexingWarning', 'MissingDefaultResource', 'InvalidPeriodicWorkRequestInterval', 'StringFormatInvalid', 'MissingQuantity'
htmlOutput = layout.buildDirectory.file("reports/lint/lint.html").get().asFile htmlOutput file("$project.buildDir/reports/lint/lint.html")
htmlReport = true htmlReport true
} }
sourceSets { sourceSets {
@ -277,251 +255,189 @@ android {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
} }
kapt { composeOptions {
useBuildCache = true kotlinCompilerExtensionVersion = "1.5.11"
} }
} }
dependencies { dependencies {
// region Nextcloud library
implementation("com.github.nextcloud:android-library:$androidLibraryVersion") { implementation("com.github.nextcloud:android-library:$androidLibraryVersion") {
exclude group: "org.ogce", module: "xpp3" // unused in Android and brings wrong Junit version exclude group: 'org.ogce', module: 'xpp3' // unused in Android and brings wrong Junit version
} }
// endregion
// region Splash Screen // Jetpack Compose
implementation libs.splashscreen implementation(platform("androidx.compose:compose-bom:2024.04.00"))
// endregion implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.material3:material3")
implementation("androidx.compose.ui:ui-tooling-preview:1.6.5")
debugImplementation 'androidx.compose.ui:ui-tooling:1.6.5'
// region Jetpack Compose compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
implementation(platform(libs.compose.bom)) // remove after entire switch to lib v2
implementation(libs.compose.ui) implementation "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
implementation(libs.compose.ui.graphics) implementation 'org.apache.jackrabbit:jackrabbit-webdav:2.13.5' // remove after entire switch to lib v2
implementation(libs.compose.material3) implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
debugImplementation(libs.compose.ui.tooling) implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation(libs.compose.ui.tooling.preview) implementation 'com.google.android.material:material:1.11.0'
// endregion implementation 'com.jakewharton:disklrucache:2.0.2'
implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation 'androidx.webkit:webkit:1.10.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.exifinterface:exifinterface:1.3.7'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1"
implementation "androidx.lifecycle:lifecycle-service:2.8.1"
implementation "androidx.work:work-runtime:$workRuntime"
implementation "androidx.work:work-runtime-ktx:$workRuntime"
implementation "androidx.fragment:fragment-ktx:1.6.2"
implementation 'com.github.albfernandez:juniversalchardet:2.0.3' // need this version for Android <7
compileOnly 'com.google.code.findbugs:annotations:3.0.1u2'
implementation 'commons-io:commons-io:2.16.1'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.12.1'
implementation 'org.lukhnos:nnio:0.3'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'com.github.nextcloud-deps:sectioned-recyclerview:0.6.1'
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.28'
implementation 'com.github.nextcloud-deps:qrcodescanner:0.1.2.4' // 'com.github.blikoon:QRCodeScanner:0.1.2'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation('com.github.bumptech.glide:glide:3.8.0') {
exclude group: "com.android.support"
}
implementation 'com.caverock:androidsvg:1.4'
implementation 'androidx.annotation:annotation:1.7.1'
implementation 'com.vanniktech:emoji-google:0.18.0'
// region Media3 implementation "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido:$fidoVersion"
implementation libs.media3.ui implementation "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido2:$fidoVersion"
implementation libs.media3.session
implementation libs.media3.exoplayer
implementation libs.media3.datasource
// endregion
// region Room // document scanner not available on FDroid (generic) due to OpenCV binaries
implementation libs.room.runtime gplayImplementation project(':appscan')
ksp "androidx.room:room-compiler:$roomVersion" huaweiImplementation project(':appscan')
androidTestImplementation libs.room.testing qaImplementation project(':appscan')
// endregion
// region Espresso spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.13.0'
androidTestImplementation libs.espresso.core spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.4'
androidTestImplementation libs.espresso.contrib
androidTestImplementation libs.espresso.web
androidTestImplementation libs.espresso.accessibility
androidTestImplementation libs.espresso.intents
androidTestImplementation libs.espresso.idling.resource
// endregion
// region Glide implementation "com.google.dagger:dagger:$daggerVersion"
implementation libs.glide implementation "com.google.dagger:dagger-android:$daggerVersion"
ksp libs.ksp implementation "com.google.dagger:dagger-android-support:$daggerVersion"
// endregion
// region UI
implementation libs.appcompat
implementation libs.webkit
implementation libs.cardview
implementation libs.exifinterface
implementation libs.fragment.ktx
// endregion
// region Worker
implementation libs.work.runtime
implementation libs.work.runtime.ktx
// endregion
// region Lifecycle
implementation libs.lifecycle.viewmodel.ktx
implementation libs.lifecycle.service
implementation(libs.lifecycle.runtime.ktx)
// endregion
// region JUnit
androidTestImplementation libs.junit
androidTestImplementation libs.rules
androidTestImplementation libs.runner
androidTestUtil libs.orchestrator
androidTestImplementation libs.core.ktx
androidTestImplementation libs.core.testing
// endregion
// region other libraries
compileOnly libs.org.jbundle.util.osgi.wrapped.org.apache.http.client
implementation libs.commons.httpclient.commons.httpclient // remove after entire switch to lib v2
implementation libs.jackrabbit.webdav // remove after entire switch to lib v2
implementation libs.constraintlayout
implementation libs.legacy.support.v4
implementation libs.material
implementation libs.disklrucache
implementation libs.juniversalchardet // need this version for Android <7
compileOnly libs.annotations
implementation libs.commons.io
implementation libs.eventbus
implementation libs.ez.vcard
implementation libs.nnio
implementation libs.bcpkix.jdk18on
implementation libs.gson
implementation libs.sectioned.recyclerview
implementation libs.photoview
implementation libs.android.gif.drawable
implementation libs.qrcodescanner // "com.github.blikoon:QRCodeScanner:0.1.2"
implementation libs.flexbox
implementation libs.androidsvg
implementation libs.annotation
implementation libs.emoji.google
// endregion
// region AppScan, document scanner not available on FDroid (generic) due to OpenCV binaries
gplayImplementation project(":appscan")
huaweiImplementation project(":appscan")
qaImplementation project(":appscan")
// endregion
// region SpotBugs
spotbugsPlugins libs.findsecbugs.plugin
spotbugsPlugins libs.fb.contrib
// endregion
// region Dagger
implementation libs.dagger
implementation libs.dagger.android
implementation libs.dagger.android.support
kapt "com.google.dagger:dagger-compiler:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion"
kapt "com.google.dagger:dagger-android-processor:$daggerVersion" kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
// endregion
// region Crypto implementation 'org.conscrypt:conscrypt-android:2.5.2'
implementation libs.conscrypt.android
// endregion
// region Library implementation "androidx.media3:media3-ui:$androidxMediaVersion"
implementation libs.library implementation "androidx.media3:media3-exoplayer:$androidxMediaVersion"
// endregion implementation "androidx.media3:media3-datasource-okhttp:$androidxMediaVersion"
// region Shimmer implementation 'me.zhanghai.android.fastscroll:library:1.3.0'
implementation libs.loaderviewlibrary
// endregion
// region Markdown rendering // Shimmer animation
implementation libs.core implementation 'io.github.elye:loaderviewlibrary:3.0.0'
implementation libs.ext.strikethrough
implementation libs.ext.tables // dependencies for markdown rendering
implementation libs.ext.tasklist implementation "io.noties.markwon:core:$markwonVersion"
implementation libs.html implementation "io.noties.markwon:ext-strikethrough:$markwonVersion"
implementation libs.syntax.highlight implementation "io.noties.markwon:ext-tables:$markwonVersion"
implementation libs.prism4j implementation "io.noties.markwon:ext-tasklist:$markwonVersion"
implementation "io.noties.markwon:html:$markwonVersion"
implementation "io.noties.markwon:syntax-highlight:$markwonVersion"
implementation "io.noties:prism4j:$prismVersion"
kapt "io.noties:prism4j-bundler:$prismVersion" kapt "io.noties:prism4j-bundler:$prismVersion"
// endregion
// region Image cropping / rotation // dependencies for image cropping and rotation
implementation libs.android.image.cropper implementation 'com.vanniktech:android-image-cropper:4.5.0'
// endregion
// region Maps implementation 'org.osmdroid:osmdroid-android:6.1.18'
implementation libs.osmdroid.android
// endregion
// region iCal4j implementation('org.mnode.ical4j:ical4j:3.0.0') {
implementation(libs.ical4j) { ['org.apache.commons', 'commons-logging'].each {
["org.apache.commons", "commons-logging"].each {
exclude group: "$it" exclude group: "$it"
} }
} }
// endregion
// region LeakCanary
if (perfAnalysis) { if (perfAnalysis) {
debugImplementation "com.squareup.leakcanary:leakcanary-android:2.14" debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.13'
} }
// endregion
// region Local Unit Test // dependencies for local unit tests
testImplementation libs.junit.junit testImplementation 'junit:junit:4.13.2'
testImplementation libs.mockito.core testImplementation "org.mockito:mockito-core:$mockitoVersion"
testImplementation libs.test.core testImplementation "androidx.test:core:$androidxTestVersion"
testImplementation libs.json testImplementation 'org.json:json:20240303'
testImplementation libs.mockito.kotlin testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
testImplementation libs.core.testing testImplementation 'androidx.arch.core:core-testing:2.2.0'
testImplementation "io.mockk:mockk:$mockkVersion" testImplementation "io.mockk:mockk:$mockkVersion"
testImplementation libs.mockk.android testImplementation "io.mockk:mockk-android:$mockkVersion"
// endregion
// region Mocking support // dependencies for instrumented tests
androidTestImplementation libs.dexopener // required to allow mocking on API 27 and older // JUnit4 Rules
androidTestImplementation libs.mockito.kotlin androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation libs.mockito.core androidTestImplementation "androidx.test:rules:$androidxTestVersion"
androidTestImplementation(libs.mockito.android) // Android JUnit Runner
androidTestImplementation libs.mockk.android androidTestImplementation "androidx.test:runner:1.5.2"
androidTestImplementation libs.screenshot.core androidTestUtil "androidx.test:orchestrator:1.4.2"
// endregion androidTestImplementation "androidx.test:core-ktx:$androidxTestVersion"
// Espresso
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-web:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion"
// Mocking support
androidTestImplementation 'com.github.tmurakami:dexopener:2.0.5' // required to allow mocking on API 27 and older
androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
androidTestImplementation "org.mockito:mockito-core:$mockitoVersion"
androidTestImplementation("org.mockito:mockito-android:$mockitoVersion")
androidTestImplementation "io.mockk:mockk-android:$mockkVersion"
androidTestImplementation 'androidx.arch.core:core-testing:2.2.0'
androidTestImplementation "com.facebook.testing.screenshot:core:0.15.0"
// region UIAutomator
// UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests
// androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0" // androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
// fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details
//androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}" //androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}"
androidTestImplementation libs.screengrab androidTestImplementation 'tools.fastlane:screengrab:2.1.1'
// endregion implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// region Kotlin implementation "com.github.stateless4j:stateless4j:2.6.0"
implementation libs.kotlin.stdlib
// endregion
// region Stateless // upon each update first test: new registration, receive push
implementation libs.stateless4j gplayImplementation "com.google.firebase:firebase-messaging:23.4.1"
// endregion gplayImplementation 'com.google.android.play:review-ktx:2.0.1'
// region Google Play dependencies, upon each update first test: new registration, receive push implementation 'com.github.nextcloud.android-common:ui:0.17.0'
gplayImplementation libs.firebase.messaging
gplayImplementation libs.play.services.base
gplayImplementation libs.review.ktx
// endregion
// region UI implementation "androidx.room:room-runtime:$roomVersion"
implementation libs.ui ksp "androidx.room:room-compiler:$roomVersion"
// endregion androidTestImplementation "androidx.room:room-testing:$roomVersion"
// region Image loading implementation "io.coil-kt:coil:2.6.0"
implementation libs.coil
// endregion // splash screen dependency ref: https://developer.android.com/develop/ui/views/launch/splash-screen/migrate
implementation 'androidx.core:core-splashscreen:1.0.1'
} }
configurations.configureEach { configurations.configureEach {
resolutionStrategy { resolutionStrategy {
force "org.objenesis:objenesis:3.4" cacheChangingModulesFor 0, 'seconds'
force 'org.objenesis:objenesis:3.3'
eachDependency { details -> eachDependency { details ->
if ("org.jacoco" == details.requested.group) { if ('org.jacoco' == details.requested.group) {
details.useVersion "$jacoco_version" details.useVersion "$jacoco_version"
} }
} }
} }
} }
// Run the compiler as a separate process
tasks.withType(JavaCompile).configureEach {
options.fork = true
// Enable Incremental Compilation
options.incremental = true
}
tasks.withType(Test).configureEach { tasks.withType(Test).configureEach {
// Run tests in parallel
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
// increased logging for tests // increased logging for tests
testLogging { testLogging {
events "passed", "skipped", "failed" events "passed", "skipped", "failed"
@ -549,7 +465,7 @@ if (shotTest) {
showOnlyFailingTestsInReports = ciBuild showOnlyFailingTestsInReports = ciBuild
// CI environment renders some shadows slightly different from local VMs // CI environment renders some shadows slightly different from local VMs
// Add a 0.5% tolerance to account for that // Add a 0.5% tolerance to account for that
tolerance = ciBuild ? 0.1 : 0 tolerance = ciBuild ? 0.5 : 0
} }
} }
@ -560,7 +476,7 @@ jacoco {
spotbugs { spotbugs {
ignoreFailures = true // should continue checking ignoreFailures = true // should continue checking
effort = Effort.MAX effort = Effort.MAX
reportLevel = Confidence.valueOf("MEDIUM") reportLevel = Confidence.valueOf('MEDIUM')
} }
tasks.withType(SpotBugsTask){task -> tasks.withType(SpotBugsTask){task ->
@ -568,7 +484,7 @@ tasks.withType(SpotBugsTask){task ->
String variantName = variantNameCap.substring(0, 1).toLowerCase() + variantNameCap.substring(1) String variantName = variantNameCap.substring(0, 1).toLowerCase() + variantNameCap.substring(1)
dependsOn "compile${variantNameCap}Sources" dependsOn "compile${variantNameCap}Sources"
classes = fileTree(layout.buildDirectory.get().asFile.toString()+"/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/") classes = fileTree("$project.buildDir/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/")
excludeFilter = file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml") excludeFilter = file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml")
reports { reports {
xml { xml {
@ -576,12 +492,12 @@ tasks.withType(SpotBugsTask){task ->
} }
html { html {
required = true required = true
outputLocation = layout.buildDirectory.file("reports/spotbugs/spotbugs.html").get().asFile outputLocation = file("$project.buildDir/reports/spotbugs/spotbugs.html")
stylesheet = "fancy.xsl" stylesheet = 'fancy.xsl'
} }
} }
} }
ksp { ksp {
arg("room.schemaLocation", "$projectDir/schemas") arg('room.schemaLocation', "$projectDir/schemas")
} }

View file

@ -1,5 +1,5 @@
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only # SPDX-License-Identifier: AGPL-3.0-or-later
build: build:
maxIssues: 2 maxIssues: 2
weights: weights:

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
~ Nextcloud - Android Client ~ Nextcloud Talk - Android Client
~ ~
~ SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
~ SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de> ~ SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de>
~ SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com> ~ SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
~ SPDX-FileCopyrightText: 2022 Tobias Kaminsky <tobias@kaminsky.me> ~ SPDX-FileCopyrightText: 2022 Tobias Kaminsky <tobias@kaminsky.me>
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only ~ SPDX-License-Identifier: AGPL-3.0-or-later
--> -->
<lint> <lint>
<issue id="UnusedAttribute"> <issue id="UnusedAttribute">
@ -23,16 +23,12 @@
<ignore regexp="store_short_desc|store_full_desc|store_short_dev_desc|store_full_dev_desc" /> <ignore regexp="store_short_desc|store_full_desc|store_short_dev_desc|store_full_dev_desc" />
<ignore <ignore
regexp="screenshot_01_gridView|screenshot_02_listView|screenshot_03_drawer|screenshot_04_accounts|screenshot_05_autoUpload|screenshot_06_davdroid"/> regexp="screenshot_01_gridView|screenshot_02_listView|screenshot_03_drawer|screenshot_04_accounts|screenshot_05_autoUpload|screenshot_06_davdroid"/>
<ignore path="**/drawable/zdc_*.xml" /> <ignore path="**/raw/encryption_key_words.txt" />
<ignore path="**/drawable/iconclose.xml" />
</issue>
<issue id="ImpliedQuantity">
<ignore path="**/values-**/strings.xml" />
</issue> </issue>
<issue id="MissingQuantity"> <issue id="MissingQuantity">
<ignore path="**/values-**/strings.xml" /> <ignore path="**/values-ka-rGE/strings.xml"/>
<ignore path="**/values-ar/strings.xml" />
</issue> </issue>
<issue id="UnusedQuantity"> <issue id="UnusedQuantity">
@ -60,7 +56,7 @@
<issue id="TrustAllX509TrustManager"> <issue id="TrustAllX509TrustManager">
<ignore path="**/bouncycastle/est/jcajce/*.class" /> <ignore path="**/bouncycastle/est/jcajce/*.class" />
<ignore path="**/bcpkix-jdk15to18-1.**.jar" /> <ignore path="**/bcpkix-jdk15to18-1.72.jar" />
<ignore path="**/bcpkix-jdk18on-1.**.jar" /> <ignore path="**/bcpkix-jdk18on-1.**.jar" />
</issue> </issue>
@ -81,8 +77,4 @@
<ignore path="**/jetified-firebase-installations**/**/lint.jar" /> <ignore path="**/jetified-firebase-installations**/**/lint.jar" />
<ignore path="**/appcompat-1.**/**/lint.jar" /> <ignore path="**/appcompat-1.**/**/lint.jar" />
</issue> </issue>
<issue id="Aligned16KB">
<ignore path="**/arm64-v8a/libmockkjvmtiagent.so" />
</issue>
</lint> </lint>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Some files were not shown because too many files have changed in this diff Show more