diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml
index e9b1ec853..15e746762 100644
--- a/app/src/main/res/drawable/ic_refresh.xml
+++ b/app/src/main/res/drawable/ic_refresh.xml
@@ -1,7 +1,7 @@
+
+
diff --git a/app/src/main/res/drawable/screenshots_placeholder.png b/app/src/main/res/drawable/screenshots_placeholder.png
new file mode 100644
index 000000000..94698f3aa
Binary files /dev/null and b/app/src/main/res/drawable/screenshots_placeholder.png differ
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..c78bee3b5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..3fbe681d0
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..e7bf26889
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..8068afb72
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..2d2bcf9d7
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..d9b447816
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/values-night/ic_launcher_background.xml b/app/src/main/res/values-night/ic_launcher_background.xml
new file mode 100644
index 000000000..cdde88fb8
--- /dev/null
+++ b/app/src/main/res/values-night/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #000000
+
diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml
index 62535eb6a..8018e2af1 100644
--- a/app/src/main/res/values-sw/strings.xml
+++ b/app/src/main/res/values-sw/strings.xml
@@ -336,7 +336,6 @@
Anwani
Idadi ya apu
Maelezo
- Sasisho la mwisho kupakuliwa
Vioo rasmi
Vioo vya watumiaji
Jina
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 000000000..c5d5899fd
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/new-strings.xml b/app/src/main/res/values/new-strings.xml
new file mode 100644
index 000000000..1e99908b0
--- /dev/null
+++ b/app/src/main/res/values/new-strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ F-Droid distributes (Free and Open Source Software) apps for Android. All apps in its official app repository are built from their source code to ensure that they are completely transparent and only include Free Software.\n\nThis app makes it easy to browse and install apps from F-Droid or other repositories. It also helps you to keep your apps up to date.\n\nF-Droid is a non-profit volunteer project. Although every effort is made to ensure all apps are safe to install, you use it AT YOUR OWN RISK. The app’s source code is automatically checked for potential security or privacy issues. However, this is far from exhaustive and there are no guarantees.\n\nF-Droid respects your privacy. We don’t track you, or your device. We don’t track what you install. You don’t need an account to use this app, and it sends no additional identifying data when communicating with repositories, other than its version number.
+ This program is Free Software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ About
+ Discover
+ My apps
+
+ Retrieving apps…\n\nThis may take some time.
+ We need to download the latest app repository to get you started.
+ However, you seem to be offline. Connect to the internet and tap the button below when ready.
+ However, you are on mobile data and we\'ll need to download more than 10 MB. Tap the button below when ready to download.
+ Download app repository
+ No repositories enabled.\nEnable or add at least one repository to see apps.
+
+ No apps installed.\n\nInstall apps and they will appear here.
+ Apps with issues
+ Hide app issue
+ Do you want to hide the issue with the app \"%1$s\"?
+ Hide
+
+ New apps
+ Recently updated
+ Most downloaded
+ All apps
+ Apps by %s
+
+ Search…
+ No apps found.\n\nTry to use less search terms or add/enable more repositories.
+ No matching apps.\n\nTry to use less search terms or remove filters.
+ No matching apps.\n\nTry to use less search terms.
+ Sorting and compatibility
+ Sort by name
+ Sort by latest
+ Apps compatible with this device
+ Save above as default
+ Clear all filters
+
+ Filter
+
+ selected
+ Category
+
+ Continue with mobile data?
+
+ You are currently on a metered internet connection. Do you want to continue downloading %1$s?
+ You are currently on a metered internet connection. Do you want to continue downloading?
+ Download
+ Tap to load screenshots via mobile data
+
+ Productivity
+ Tools
+ Finances & Wallets
+ Entertainment & Media
+ Communication
+ Device
+ Network
+ Files & Storage
+ Interests
+ Miscellaneous
+
+ By %1$s
+ Last updated: %1$s
+
+ Last updated: %1$s (%2$s)
+ Preparing installation…
+ What\'s new
+ Donate
+ This app has anti-features
+ Developer contact
+ Technical information
+ Package Name:
+ Installed Version:
+ Copy link
+ This app is not compatible with your device.
+ Can not update this app, because all versions have an incompatible signature.\n\nIf you don\'t receive updates through other means, you may need to uninstall and then reinstall this app. The app\'s data will be lost.
+ Can not update this app, because there are no compatible versions in the preferred repository.\n\nTry changing the preferred repository.
+ Auto-update not available, because app targets old version of Android.
+ An update is available in another repository, but will not get installed, because that repository is not preferred.
+ No longer available
+ This app is not receiving updates, because it is no longer in any enabled repository.\n\nIt may have been in a repository you removed or disabled. Or it was simply removed.
+ Show app info
+ Added %1$s
+ Size: %1$s
+ SDK versions: %1$s
+
+ %1$s (Min)
+
+ %1$s (Target)
+
+ %1$s (Max)
+ Signer: %1$s
+ Architectures: %1$s
+ Incompatible • Installation likely to fail
+ Signature mismatch, can\'t install
+ Sorry! There was an unexpected error installing this app.
+
+ Notifications
+ Opens system notification settings
+ Automatically installed apps
+ Displays a notification after apps were installed automatically.
+ Available app updates
+ Displays a notification after repositories were updated and app updates were found.
+
+ Connecting to %1$s…
+ Downloaded %1$s from %2$s
+
+ - Saved %1$d app from %2$s
+ - Saved %1$d apps from %2$s
+
+
+ - Installing %1$d app…
+ - Installing %1$d apps…
+
+
+ - Updating %1$d app…
+ - Updating %1$d apps…
+
+
+ - %1$d app updated
+ - %1$d apps updated
+
+ Installing:
+ Needs user confirmation:
+ Installed:
+ Tap to confirm.
+
+ Filter
+ Here you can apply filters to the list of apps, e.g. showing only apps within a certain category or repository. Changing the sort order is also possible.
+ Got it
+ Clear
+ Error
+ Scanning the QR code can only work if you grant camera permission. Tap to grant it in settings.
+ Had errors updating
+ An error occurred while trying to update this repository:
+ Published %s
+ Downloaded %s
+ Username
+ Password
+ Save Changes
+ Check for updates
+
+ Use system colors
+ Apply dynamic colors from your system settings
+ Opens system language settings
+ Only on WiFi
+ Always (even on mobile data)
+ Never
+ Download and update apps daily when on WiFi and the device isn\'t being used.
+ Download and update apps daily even on mobile data when the device isn\'t being used.
+ Auto-updates disabled • Apps will need to be updated manually
+ Check for updates
+ Periodically ask all repositories for app updates, but only when on WiFi.
+ Periodically ask all repositories for app updates even when on mobile data.
+ Do NOT check for updates • Apps will become outdated
+ Network
+ Connect via SOCKS proxy
+ Connect to the internet without proxy
+ Uses proxy %s to connect
+ Proxy is expected in host:port format.
+ Proxy format invalid
+
+ An unexpected error occurred.
+ This is not your fault.
+ Would you like to e-mail the details to help us fix the issue?
+
+ Tell us what happened right before the crash
+ Send report
+ Could not send report. No email program found :(
+ Save crash report as file
+ Saved report to file
+ Error saving crash report to file
+
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 90c68bdeb..33872af90 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,134 +1,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
index cfcccb746..ffa0c1641 100644
--- a/app/src/main/res/xml/network_security_config.xml
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -1,6 +1,6 @@
-
+
@@ -8,33 +8,7 @@
-
-
- amazonaws.com
-
-
-
- f-droid.org
-
-
-
- github.com
-
-
-
- githubusercontent.com
-
-
-
- github.io
-
-
-
- gitlab.com
-
-
-
- gitlab.io
-
+
+ onion
diff --git a/app/src/test/java/org/fdroid/ui/details/HtmlDescriptionTest.kt b/app/src/test/java/org/fdroid/ui/details/HtmlDescriptionTest.kt
new file mode 100644
index 000000000..7da6d113f
--- /dev/null
+++ b/app/src/test/java/org/fdroid/ui/details/HtmlDescriptionTest.kt
@@ -0,0 +1,69 @@
+package org.fdroid.ui.details
+
+import org.junit.Test
+import kotlin.test.assertEquals
+
+/**
+ * Tests modifications to app details descriptions done in [getHtmlDescription].
+ */
+class HtmlDescriptionTest {
+ @Test
+ fun testLinks() {
+ val description = """
+2. If you have experience with Java and the Android SDK, then we look forward to your contributions! More info: https://mediawiki.org/wiki/Wikimedia_Apps/Team/Android/App_hacking
+
+3. Explanation of permissions needed by the app: https://mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Security_and_Permissions
+ """
+ val expectedDescription = """
+2. If you have experience with Java and the Android SDK, then we look forward to your contributions! More info: https://mediawiki.org/wiki/Wikimedia_Apps/Team/Android/App_hacking
+
+3. Explanation of permissions needed by the app: https://mediawiki.org/wiki/Wikimedia_Apps/Android_FAQ#Security_and_Permissions
+ """
+ assertEquals(expectedDescription, getHtmlDescription(description))
+ }
+
+ @Test
+ fun testLinkAtTheVeryEnd() {
+ val description = """
+Project page: https://github.com/lukaspieper/Gcam-Services-Provider"""
+ val expectedDescription = """
+Project page: https://github.com/lukaspieper/Gcam-Services-Provider"""
+ assertEquals(expectedDescription, getHtmlDescription(description))
+ }
+
+ @Test
+ fun testLinkWithDotAtTheEnd() {
+ val description = """please visit our website: https://wikimediafoundation.org/."""
+
+ @Suppress("ktlint:standard:max-line-length")
+ val expectedDescription = """please visit our website: https://wikimediafoundation.org/."""
+ assertEquals(expectedDescription, getHtmlDescription(description))
+ }
+
+ @Test
+ fun testLinkInRoundBrackets() {
+ val description = """our link (https://wikimediafoundation.org/)."""
+
+ @Suppress("ktlint:standard:max-line-length")
+ val expectedDescription = """our link (https://wikimediafoundation.org/)."""
+ assertEquals(expectedDescription, getHtmlDescription(description))
+ }
+
+ @Test
+ fun testHeadlineRemoval() {
+ val description = """SimpleX - the first messaging platform that has no user identifiers, not even random numbers!
+Security assessment was done by Trail of Bits in November 2022.
+SimpleX Chat features:
+
diff --git a/app/src/main/res/drawable/ic_license.xml b/legacy/src/main/res/drawable/ic_license.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_license.xml
rename to legacy/src/main/res/drawable/ic_license.xml
diff --git a/app/src/main/res/drawable/ic_link.xml b/legacy/src/main/res/drawable/ic_link.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_link.xml
rename to legacy/src/main/res/drawable/ic_link.xml
diff --git a/app/src/main/res/drawable/ic_lock.xml b/legacy/src/main/res/drawable/ic_lock.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_lock.xml
rename to legacy/src/main/res/drawable/ic_lock.xml
diff --git a/app/src/main/res/drawable/ic_more.xml b/legacy/src/main/res/drawable/ic_more.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_more.xml
rename to legacy/src/main/res/drawable/ic_more.xml
diff --git a/app/src/main/res/drawable/ic_more_with_background.xml b/legacy/src/main/res/drawable/ic_more_with_background.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_more_with_background.xml
rename to legacy/src/main/res/drawable/ic_more_with_background.xml
diff --git a/legacy/src/main/res/drawable/ic_notification.xml b/legacy/src/main/res/drawable/ic_notification.xml
new file mode 100644
index 000000000..ecba10fa2
--- /dev/null
+++ b/legacy/src/main/res/drawable/ic_notification.xml
@@ -0,0 +1,16 @@
+