diff --git a/build.gradle.kts b/build.gradle.kts index 55bf6e3f..2f5bfb6d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,4 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.dokka) apply true -} - -apply(from = "docs/deps-graph.gradle") \ No newline at end of file +} \ No newline at end of file diff --git a/docs/deps-graph.gradle b/docs/deps-graph.gradle deleted file mode 100644 index 957161a9..00000000 --- a/docs/deps-graph.gradle +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Copyright 2016 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -task projectDependencyGraph { - doLast { - def dot = new File(rootProject.rootDir, "docs/static/img/dependency-graph.dot") - dot.parentFile.mkdirs() - dot.delete() - - dot << 'digraph {\n' - dot << " graph [label=\"${rootProject.name}\\n \",labelloc=t,fontsize=30,ranksep=1.4];\n" - dot << ' node [style=filled, fillcolor="#bbbbbb"];\n' - dot << ' rankdir=TB;\n' - - def rootProjects = [] - def queue = [rootProject] - while (!queue.isEmpty()) { - def project = queue.remove(0) - rootProjects.add(project) - queue.addAll(project.childProjects.values()) - } - - def projects = new LinkedHashSet() - def dependencies = new LinkedHashMap, List>() - def multiplatformProjects = [] - def jsProjects = [] - def androidProjects = [] - def javaProjects = [] - - queue = [rootProject] - while (!queue.isEmpty()) { - def project = queue.remove(0) - queue.addAll(project.childProjects.values()) - - if (project.plugins.hasPlugin('org.jetbrains.kotlin.multiplatform')) { - multiplatformProjects.add(project) - } - if (project.plugins.hasPlugin('org.jetbrains.kotlin.js')) { - jsProjects.add(project) - } - if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { - androidProjects.add(project) - } - if (project.plugins.hasPlugin('java-library') || project.plugins.hasPlugin('java')) { - javaProjects.add(project) - } - - project.configurations.all { config -> - config.dependencies - .withType(ProjectDependency) - .collect { it.dependencyProject } - .each { dependency -> - projects.add(project) - projects.add(dependency) - rootProjects.remove(dependency) - - def graphKey = new Tuple2(project, dependency) - def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList() } - - if (config.name.toLowerCase().endsWith('implementation')) { - traits.add('style=dotted') - } - } - } - } - - projects = projects.sort { it.path } - - dot << '\n # Projects\n\n' - for (project in projects) { - def traits = [] - - if (rootProjects.contains(project)) { - traits.add('shape=box') - } - - if (project.getPath().startsWith(":core")) { - traits.add('fillcolor="#94c1ff"') - } else if (project.getPath().startsWith(":app")) { - traits.add('fillcolor="#baffc9"') - } else if (project.getPath().startsWith(":data")) { - traits.add('fillcolor="#fff694"') - } else if (project.getPath().startsWith(":services")) { - traits.add('fillcolor="#ff9498"') - } else if (project.getPath().startsWith(":libs")) { - traits.add('fillcolor="#ad94ff"') - } - - dot << " \"${project.path}\" [${traits.join(", ")}];\n" - } - - dot << '\n {rank = same;' - for (project in projects) { - if (rootProjects.contains(project)) { - dot << " \"${project.path}\";" - } - } - dot << '}\n' - - dot << '\n # Dependencies\n\n' - dependencies.forEach { key, traits -> - dot << " \"${key.first.path}\" -> \"${key.second.path}\"" - if (!traits.isEmpty()) { - dot << " [${traits.join(", ")}]" - } - dot << '\n' - } - - dot << '}\n' - - def p = 'dot -Tpng -O dependency-graph.dot'.execute([], dot.parentFile) - p.waitFor() - if (p.exitValue() != 0) { - throw new RuntimeException(p.errorStream.text) - } - - println("Project module dependency graph created.") - } -} diff --git a/docs/docs/developer-guide/project-structure/libraries.md b/docs/docs/developer-guide/project-structure/libraries.md index ef6b6260..90b171f9 100644 --- a/docs/docs/developer-guide/project-structure/libraries.md +++ b/docs/docs/developer-guide/project-structure/libraries.md @@ -4,13 +4,14 @@ sidebar_position: 4 # Libraries -The following libraries are commonly used (libraries that are only used in single modules are not listed here as they are implementation details): +The following libraries are commonly used: -- **KotlinX coroutines** for asynchronous operations -- **Jetpack Compose and Accompanist** for all user interfaces _(TODO: Owncloud and Nextcloud signin are not ported to Compose yet)_ -- **AndroidX Room** to store launcher data in an Sqlite database -- **AndroidX Datastore** to store additional user preferences +- **Jetpack Compose and Accompanist** for UI - **Koin** for dependency injection - **Coil** to load and transform images -- **OkHttp and Retrofit** for HTTP requests _(TODO: Migrate to Ktor (?))_ +- **KotlinX coroutines** for asynchronous operations +- **KotlinX serialization** for JSON serialization +- **AndroidX Room** to store launcher data in an SQLite database +- **AndroidX Datastore** to store additional user preferences +- **OkHttp and Retrofit** for HTTP requests - Several other **AndroidX** libraries (Work, Lifecycle, AppCompat, …) diff --git a/docs/docs/developer-guide/project-structure/modules.md b/docs/docs/developer-guide/project-structure/modules.md index 577d9ef2..7d33cc42 100644 --- a/docs/docs/developer-guide/project-structure/modules.md +++ b/docs/docs/developer-guide/project-structure/modules.md @@ -4,55 +4,73 @@ sidebar_position: 3 # Modules -The project contains of multiple Gradle modules. The structure is kinda scuffed because I didn't know shit when I +The project contains of multiple Gradle modules. The structure is kinda scuffed because I didn't +know shit when I started this project so future refactorings are to be expected. This is the current structure: - `:app`: - - `:app`: The app module. Contains almost nothing except the `Application` class (`de.mm20.launcher2.LauncherApplication`) - - `:ui`: Contains almost the entire user interface (except for account sign-in UIs). The only module that uses Jetpack Compose. -- `:services`: Higher level APIs for the app's business logic. Each module represents a specific functionality of the launcher - - `:accounts`: Common APIs to manage different account types (Google, Microsoft, Nextcloud, …) - - `:backup`: Backup and restore functionality - - `:badges`: Provide different types of badges that are displayed on app icons - - `:icons`: Used to retrieve icons for items. Handles icon packs, themed icons and also custom icons (on a higher level) - - `:music`: Manage media sessions and extract metadata - - `:search`: The search. - - `:tags`: Edit, copy and delete tags - - `:widgets`: High-level APIs to manage widgets -- `:data`: Lower level APIs. Generally, these modules are more multi-purpose and provide the data that is consumed by the `:services` modules. - - `:applications`: Installed apps and app search - - `:appshortcuts`: Query apps shortcuts for apps and shortcut search - - `:calendar`: query calendar events for the calendar widget and calendar search - - `:calculator`: Implements the calculator. Should probably be moved to `:services` - - `:unitconverter`: Unit and currency converter. Should probably be moved to `:services` - - `:contacts`: Query contacts on the device - - `:currencies`: APIs to fetch currency conversion rates, used by `:data:unitconverter` - - `:customattrs`: common (low-level) APIs to store per-app customizations (custom labels, custom icons, tags) - - `:favorites`: Handles pinned, frequently used and hidden items and serialization / deserialization of items. Depends on most of the search modules (`:applications`, `:calendar`, `:contacts`, etc.)´. This module needs to be refactored and split into at least two different modules. - - `:files`: Manage and find files (local and cloud) - - `:notifications`: APIs to read notifications. Contains the app's `NotificationListenerService` - - `:websites`: Website search - - `:weather`: APIs to fetch weather data - - `:widgets`: CRUD operations to store and retrieve widgets in/from the database - - `:wikipedia`: APIs to search Wikipedia + - `:app`: The app module. Contains almost nothing except the `Application` class ( + `de.mm20.launcher2.LauncherApplication`) + - `:ui`: Contains almost the entire user interface (except for account sign-in UIs). The only + module that uses Jetpack Compose. +- `:services`: Higher level APIs for the app's business logic. Each module represents a specific + functionality of the launcher + - `:accounts`: Common APIs to manage different account types (Nextcloud, Owncloud) + - `:backup`: Backup and restore functionality + - `:badges`: Provide different types of badges that are displayed on app icons + - `:favorites`: Handles pinned items and item visibility + - `:global-actions`: Handles global system actions like turning the screen off, and opening the + notification drawer + - `:icons`: Used to retrieve icons for items. Handles icon packs, themed icons and also custom + icons (on a higher level) + - `:music`: Manage media sessions and extract metadata + - `:plugins`: Plugin service to list, enable and disable plugins. + - `:search`: Search service + - `:tags`: Edit, copy and delete tags + - `:widgets`: High-level APIs to manage widgets +- `:data`: Lower level APIs. Usually, these modules implement interfaces from the `:core:base` + module, so that `:services` don't need to depend on `:data` modules directly. + - `:applications`: Implements APIs for app grid and app search + - `:appshortcuts`: Implements app shortcuts (search and shortcuts) + - `:calendar`: Implements calendar search + - `:calculator`: Implements the calculator. + - `:contacts`: Implements contact search + - `:currencies`: APIs to fetch currency conversion rates, used by `:data:unitconverter` + - `:customattrs`: common (low-level) APIs to store per-app customizations (custom labels, custom + icons, tags) + - `:database`: The launcher database, uses AndroidX Room + - `:files`: Implements file search + - `:locations`: Implements location search + - `:notifications`: APIs to read notifications. Contains the app's `NotificationListenerService` + - `:plugins`: Low level plugin APIs. + - `:unitconverter`: Implements unit and currency converter. + - `:weather`: APIs to fetch weather data + - `:websites`: Implements website search + - `:widgets`: CRUD operations to store and retrieve widgets in/from the database + - `:wikipedia`: Implements Wikipedia search - `:core` - - `:base`: Commonly used data classes, helper functions and utilities. Also icon resources (if they do not need localization). - - `:i18n`: All resources that require localization. Mainly strings but can also be used for icon resources if they need localization. - - `:ktx`: Commonly used Kotlin extension functions - - `:compat`: Compatibility helpers for old Android versions - - `:crashreporter`: Crash reporter; based on https://github.com/MindorksOpenSource/CrashReporter - - `:permissions`: Request and observe permission status for this app - - `:preferences`: Store user preferences; uses AndroidX Datastore - - `:database`: the launcher database, uses AndroidX Room + - `:base`: Interface definitions for the most commonly used data types. Commonly used data + classes, helper functions and utilities. + - `:compat`: Compatibility helpers for old Android versions + - `:crashreporter`: Crash reporter; based on https://github.com/MindorksOpenSource/CrashReporter + - `:devicepose`: Location and positioning APIs. + - `:i18n`: All resources that require localization. Mainly strings but can also be used for icon + resources if they need localization. + - `:ktx`: Commonly used Kotlin extension functions + - `:permissions`: Request and observe permission status for this app + - `:preferences`: Store user preferences; uses AndroidX Datastore + - `:profiles`: Manage user profiles on the device - `:libs`: Somewhat standalone modules and 3rd party libraries that do not depend on `:core:base` - - `:g-services`: Google APIs and Google sign-in; used by `:accounts` and `:files` - - `:ms-services`: Microsoft APIs and Microsoft sign-in; used by `:accounts` and `:files` - - `:material-color-utilities`: This library: https://github.com/material-foundation/material-color-utilities (not available as Gradle package yet) - - `:webdav`: common APIs for WebDAV search, used by `:nextcloud` and `:owncloud` - - `:nextcloud`: Nextcloud APIs and Nextcloud sign-in; used by `:accounts` and `:files` - - `:owncloud`: Owncloud APIs and Owncloud sign-in; used by `:accounts` and `:files` + - `:address-formatter`: Fork of https://github.com/woheller69/AndroidAddressFormatter (because + the upstream library is only available as a `-SNAPSHOT` version) + - `:material-color-utilities`: This + library: https://github.com/material-foundation/material-color-utilities (not available as + Gradle package yet) + - `:nextcloud`: Nextcloud APIs and Nextcloud sign-in; used by `:accounts` and `:files` + - `:owncloud`: Owncloud APIs and Owncloud sign-in; used by `:accounts` and `:files` + - `:tinypinyin`: Fork of https://github.com/promeG/TinyPinyin, because the upstream library + isn't available in one of the allowed Maven repositories for F-Droid + - `:webdav`: common APIs for WebDAV search, used by `:nextcloud` and `:owncloud` - -Most of the modules have a `Module.kt` file in their root which contains Koin definitions to make the APIs accessible to other modules. - -[![](/img/dependency-graph.dot.png)](/img/dependency-graph.dot.png)) +Most of the modules have a `Module.kt` file in their root which contains Koin definitions to make +the APIs accessible to other modules. diff --git a/docs/privacy-policy.md b/docs/privacy-policy.md index 91280344..6f34b2de 100644 --- a/docs/privacy-policy.md +++ b/docs/privacy-policy.md @@ -81,9 +81,6 @@ functionality: plugin), your current location may be shared with that plugin (only if you have granted location permissions). -- **First-Party Plugins:** Developed by the Kvaesitso team. -- **Third-Party Plugins:** Developed by external developers. - ### Data Stored by Kvaesitso Kvaesitso may store copies of the data it receives from plugins locally in its own local storage @@ -113,10 +110,6 @@ and subject to the **GitHub Privacy Policy**. - **Data Deletion:** Uninstalling the app or clearing its data removes all stored information. - **Opt-Out:** Optional integrations and plugins can be enabled or disabled at any time. -## 8. Contact Us - -For questions or concerns about this privacy policy, please contact us at [support email]. - ## Appendix A: Plugin Policies ### Google Apps Plugin diff --git a/docs/public/img/dependency-graph.dot b/docs/public/img/dependency-graph.dot deleted file mode 100644 index 41b3f987..00000000 --- a/docs/public/img/dependency-graph.dot +++ /dev/null @@ -1,332 +0,0 @@ -digraph { - graph [label="MM20Launcher2\n ",labelloc=t,fontsize=30,ranksep=1.4]; - node [style=filled, fillcolor="#bbbbbb"]; - rankdir=TB; - - # Projects - - ":app:app" [fillcolor="#baffc9"]; - ":app:ui" [fillcolor="#baffc9"]; - ":core:base" [fillcolor="#94c1ff"]; - ":core:compat" [fillcolor="#94c1ff"]; - ":core:crashreporter" [fillcolor="#94c1ff"]; - ":core:i18n" [fillcolor="#94c1ff"]; - ":core:ktx" [fillcolor="#94c1ff"]; - ":core:permissions" [fillcolor="#94c1ff"]; - ":core:preferences" [fillcolor="#94c1ff"]; - ":core:shared" [fillcolor="#94c1ff"]; - ":data:applications" [fillcolor="#fff694"]; - ":data:appshortcuts" [fillcolor="#fff694"]; - ":data:calculator" [fillcolor="#fff694"]; - ":data:calendar" [fillcolor="#fff694"]; - ":data:contacts" [fillcolor="#fff694"]; - ":data:currencies" [fillcolor="#fff694"]; - ":data:customattrs" [fillcolor="#fff694"]; - ":data:database" [fillcolor="#fff694"]; - ":data:files" [fillcolor="#fff694"]; - ":data:notifications" [fillcolor="#fff694"]; - ":data:search-actions" [fillcolor="#fff694"]; - ":data:searchable" [fillcolor="#fff694"]; - ":data:themes" [fillcolor="#fff694"]; - ":data:unitconverter" [fillcolor="#fff694"]; - ":data:weather" [fillcolor="#fff694"]; - ":data:websites" [fillcolor="#fff694"]; - ":data:widgets" [fillcolor="#fff694"]; - ":data:wikipedia" [fillcolor="#fff694"]; - ":libs:g-services" [fillcolor="#ad94ff"]; - ":libs:material-color-utilities" [fillcolor="#ad94ff"]; - ":libs:ms-services" [fillcolor="#ad94ff"]; - ":libs:nextcloud" [fillcolor="#ad94ff"]; - ":libs:owncloud" [fillcolor="#ad94ff"]; - ":libs:webdav" [fillcolor="#ad94ff"]; - ":plugins:sdk" []; - ":services:accounts" [fillcolor="#ff9498"]; - ":services:backup" [fillcolor="#ff9498"]; - ":services:badges" [fillcolor="#ff9498"]; - ":services:favorites" [fillcolor="#ff9498"]; - ":services:global-actions" [fillcolor="#ff9498"]; - ":services:icons" [fillcolor="#ff9498"]; - ":services:music" [fillcolor="#ff9498"]; - ":services:search" [fillcolor="#ff9498"]; - ":services:tags" [fillcolor="#ff9498"]; - ":services:widgets" [fillcolor="#ff9498"]; - - {rank = same;} - - # Dependencies - - ":app:app" -> ":app:app" - ":app:app" -> ":services:accounts" [style=dotted] - ":app:app" -> ":data:applications" [style=dotted] - ":app:app" -> ":data:appshortcuts" [style=dotted] - ":app:app" -> ":services:backup" [style=dotted] - ":app:app" -> ":services:badges" [style=dotted] - ":app:app" -> ":core:base" [style=dotted] - ":app:app" -> ":data:calculator" [style=dotted] - ":app:app" -> ":data:calendar" [style=dotted] - ":app:app" -> ":data:contacts" [style=dotted] - ":app:app" -> ":core:crashreporter" [style=dotted] - ":app:app" -> ":data:currencies" [style=dotted] - ":app:app" -> ":data:customattrs" [style=dotted] - ":app:app" -> ":data:searchable" [style=dotted] - ":app:app" -> ":data:themes" [style=dotted] - ":app:app" -> ":data:files" [style=dotted] - ":app:app" -> ":libs:g-services" [style=dotted] - ":app:app" -> ":core:i18n" [style=dotted] - ":app:app" -> ":services:icons" [style=dotted] - ":app:app" -> ":core:ktx" [style=dotted] - ":app:app" -> ":services:music" [style=dotted] - ":app:app" -> ":libs:nextcloud" [style=dotted] - ":app:app" -> ":data:notifications" [style=dotted] - ":app:app" -> ":libs:owncloud" [style=dotted] - ":app:app" -> ":core:permissions" [style=dotted] - ":app:app" -> ":core:preferences" [style=dotted] - ":app:app" -> ":services:search" [style=dotted] - ":app:app" -> ":services:tags" [style=dotted] - ":app:app" -> ":data:unitconverter" [style=dotted] - ":app:app" -> ":app:ui" [style=dotted] - ":app:app" -> ":data:weather" [style=dotted] - ":app:app" -> ":data:websites" [style=dotted] - ":app:app" -> ":data:widgets" [style=dotted] - ":app:app" -> ":data:wikipedia" [style=dotted] - ":app:app" -> ":data:database" [style=dotted] - ":app:app" -> ":data:search-actions" [style=dotted] - ":app:app" -> ":services:global-actions" [style=dotted] - ":app:app" -> ":services:widgets" [style=dotted] - ":app:app" -> ":services:favorites" [style=dotted] - ":app:ui" -> ":app:ui" - ":app:ui" -> ":libs:material-color-utilities" [style=dotted] - ":app:ui" -> ":core:base" [style=dotted] - ":app:ui" -> ":core:i18n" [style=dotted] - ":app:ui" -> ":core:compat" [style=dotted] - ":app:ui" -> ":core:ktx" [style=dotted] - ":app:ui" -> ":services:icons" [style=dotted] - ":app:ui" -> ":services:music" [style=dotted] - ":app:ui" -> ":services:tags" [style=dotted] - ":app:ui" -> ":data:weather" [style=dotted] - ":app:ui" -> ":data:calendar" [style=dotted] - ":app:ui" -> ":services:search" [style=dotted] - ":app:ui" -> ":core:preferences" [style=dotted] - ":app:ui" -> ":data:applications" [style=dotted] - ":app:ui" -> ":data:appshortcuts" [style=dotted] - ":app:ui" -> ":data:calculator" [style=dotted] - ":app:ui" -> ":data:files" [style=dotted] - ":app:ui" -> ":data:widgets" [style=dotted] - ":app:ui" -> ":data:searchable" [style=dotted] - ":app:ui" -> ":data:themes" [style=dotted] - ":app:ui" -> ":data:wikipedia" [style=dotted] - ":app:ui" -> ":services:badges" [style=dotted] - ":app:ui" -> ":core:crashreporter" [style=dotted] - ":app:ui" -> ":data:notifications" [style=dotted] - ":app:ui" -> ":data:contacts" [style=dotted] - ":app:ui" -> ":core:permissions" [style=dotted] - ":app:ui" -> ":data:websites" [style=dotted] - ":app:ui" -> ":data:unitconverter" [style=dotted] - ":app:ui" -> ":libs:nextcloud" [style=dotted] - ":app:ui" -> ":libs:g-services" [style=dotted] - ":app:ui" -> ":libs:owncloud" [style=dotted] - ":app:ui" -> ":services:accounts" [style=dotted] - ":app:ui" -> ":services:backup" [style=dotted] - ":app:ui" -> ":data:search-actions" [style=dotted] - ":app:ui" -> ":services:global-actions" [style=dotted] - ":app:ui" -> ":services:widgets" [style=dotted] - ":app:ui" -> ":services:favorites" [style=dotted] - ":core:shared" -> ":core:shared" - ":core:preferences" -> ":core:preferences" - ":core:preferences" -> ":core:ktx" [style=dotted] - ":core:preferences" -> ":core:i18n" [style=dotted] - ":core:preferences" -> ":core:base" [style=dotted] - ":core:preferences" -> ":core:crashreporter" [style=dotted] - ":core:preferences" -> ":libs:material-color-utilities" [style=dotted] - ":core:permissions" -> ":core:permissions" - ":core:permissions" -> ":core:ktx" [style=dotted] - ":core:permissions" -> ":core:base" [style=dotted] - ":core:permissions" -> ":core:crashreporter" [style=dotted] - ":core:compat" -> ":core:compat" - ":core:crashreporter" -> ":core:crashreporter" - ":core:crashreporter" -> ":core:base" [style=dotted] - ":core:i18n" -> ":core:i18n" - ":core:ktx" -> ":core:ktx" - ":core:base" -> ":core:base" - ":core:base" -> ":core:ktx" [style=dotted] - ":core:base" -> ":core:i18n" [style=dotted] - ":core:base" -> ":libs:material-color-utilities" [style=dotted] - ":data:calendar" -> ":data:calendar" - ":data:calendar" -> ":core:ktx" [style=dotted] - ":data:calendar" -> ":core:base" [style=dotted] - ":data:calendar" -> ":core:permissions" [style=dotted] - ":data:calendar" -> ":libs:material-color-utilities" [style=dotted] - ":data:calculator" -> ":data:calculator" - ":data:calculator" -> ":core:base" [style=dotted] - ":data:appshortcuts" -> ":data:appshortcuts" - ":data:appshortcuts" -> ":data:applications" [style=dotted] - ":data:appshortcuts" -> ":core:permissions" [style=dotted] - ":data:appshortcuts" -> ":core:base" [style=dotted] - ":data:appshortcuts" -> ":core:ktx" [style=dotted] - ":data:appshortcuts" -> ":core:crashreporter" [style=dotted] - ":data:widgets" -> ":data:widgets" - ":data:widgets" -> ":data:weather" [style=dotted] - ":data:widgets" -> ":data:calendar" [style=dotted] - ":data:widgets" -> ":services:music" [style=dotted] - ":data:widgets" -> ":core:ktx" [style=dotted] - ":data:widgets" -> ":core:base" [style=dotted] - ":data:widgets" -> ":core:preferences" [style=dotted] - ":data:widgets" -> ":data:database" [style=dotted] - ":data:widgets" -> ":core:crashreporter" [style=dotted] - ":data:searchable" -> ":data:searchable" - ":data:searchable" -> ":core:base" [style=dotted] - ":data:searchable" -> ":data:calendar" [style=dotted] - ":data:searchable" -> ":data:database" [style=dotted] - ":data:searchable" -> ":core:preferences" [style=dotted] - ":data:searchable" -> ":core:ktx" [style=dotted] - ":data:searchable" -> ":data:wikipedia" [style=dotted] - ":data:searchable" -> ":services:badges" [style=dotted] - ":data:searchable" -> ":core:crashreporter" [style=dotted] - ":data:unitconverter" -> ":data:unitconverter" - ":data:unitconverter" -> ":core:preferences" [style=dotted] - ":data:unitconverter" -> ":data:currencies" [style=dotted] - ":data:unitconverter" -> ":core:base" [style=dotted] - ":data:unitconverter" -> ":core:i18n" [style=dotted] - ":data:themes" -> ":data:themes" - ":data:themes" -> ":core:base" [style=dotted] - ":data:themes" -> ":data:database" [style=dotted] - ":data:themes" -> ":core:crashreporter" [style=dotted] - ":data:themes" -> ":libs:material-color-utilities" [style=dotted] - ":data:database" -> ":data:database" - ":data:database" -> ":core:i18n" [style=dotted] - ":data:database" -> ":core:ktx" [style=dotted] - ":data:database" -> ":core:preferences" [style=dotted] - ":data:customattrs" -> ":data:customattrs" - ":data:customattrs" -> ":data:database" [style=dotted] - ":data:customattrs" -> ":core:base" [style=dotted] - ":data:customattrs" -> ":core:ktx" [style=dotted] - ":data:customattrs" -> ":core:crashreporter" [style=dotted] - ":data:customattrs" -> ":data:searchable" [style=dotted] - ":data:weather" -> ":data:weather" - ":data:weather" -> ":data:database" [style=dotted] - ":data:weather" -> ":core:ktx" [style=dotted] - ":data:weather" -> ":core:crashreporter" [style=dotted] - ":data:weather" -> ":core:preferences" [style=dotted] - ":data:weather" -> ":core:permissions" [style=dotted] - ":data:weather" -> ":core:i18n" [style=dotted] - ":data:files" -> ":data:files" - ":data:files" -> ":core:base" [style=dotted] - ":data:files" -> ":core:ktx" [style=dotted] - ":data:files" -> ":libs:g-services" [style=dotted] - ":data:files" -> ":libs:nextcloud" [style=dotted] - ":data:files" -> ":libs:owncloud" [style=dotted] - ":data:files" -> ":core:i18n" [style=dotted] - ":data:files" -> ":core:permissions" [style=dotted] - ":data:files" -> ":core:crashreporter" [style=dotted] - ":data:files" -> ":core:preferences" [style=dotted] - ":data:websites" -> ":data:websites" - ":data:websites" -> ":core:base" [style=dotted] - ":data:websites" -> ":core:ktx" [style=dotted] - ":data:search-actions" -> ":data:search-actions" - ":data:search-actions" -> ":core:base" [style=dotted] - ":data:search-actions" -> ":data:database" [style=dotted] - ":data:search-actions" -> ":core:ktx" [style=dotted] - ":data:search-actions" -> ":core:preferences" [style=dotted] - ":data:search-actions" -> ":core:crashreporter" [style=dotted] - ":data:wikipedia" -> ":data:wikipedia" - ":data:wikipedia" -> ":core:preferences" [style=dotted] - ":data:wikipedia" -> ":core:base" [style=dotted] - ":data:wikipedia" -> ":core:ktx" [style=dotted] - ":data:wikipedia" -> ":core:crashreporter" [style=dotted] - ":data:contacts" -> ":data:contacts" - ":data:contacts" -> ":core:ktx" [style=dotted] - ":data:contacts" -> ":core:base" [style=dotted] - ":data:contacts" -> ":core:permissions" [style=dotted] - ":data:notifications" -> ":data:notifications" - ":data:notifications" -> ":core:permissions" [style=dotted] - ":data:applications" -> ":data:applications" - ":data:applications" -> ":core:base" [style=dotted] - ":data:applications" -> ":core:ktx" [style=dotted] - ":data:applications" -> ":core:compat" [style=dotted] - ":data:currencies" -> ":data:currencies" - ":data:currencies" -> ":core:ktx" [style=dotted] - ":data:currencies" -> ":core:i18n" [style=dotted] - ":data:currencies" -> ":data:database" [style=dotted] - ":data:currencies" -> ":core:crashreporter" [style=dotted] - ":plugins:sdk" -> ":plugins:sdk" - ":plugins:sdk" -> ":core:shared" [style=dotted] - ":services:badges" -> ":services:badges" - ":services:badges" -> ":core:ktx" [style=dotted] - ":services:badges" -> ":data:applications" [style=dotted] - ":services:badges" -> ":data:appshortcuts" [style=dotted] - ":services:badges" -> ":data:notifications" [style=dotted] - ":services:badges" -> ":core:preferences" [style=dotted] - ":services:badges" -> ":core:base" [style=dotted] - ":services:badges" -> ":data:files" [style=dotted] - ":services:favorites" -> ":services:favorites" - ":services:favorites" -> ":core:base" [style=dotted] - ":services:favorites" -> ":core:i18n" [style=dotted] - ":services:favorites" -> ":data:searchable" [style=dotted] - ":services:backup" -> ":services:backup" - ":services:backup" -> ":data:searchable" [style=dotted] - ":services:backup" -> ":data:widgets" [style=dotted] - ":services:backup" -> ":data:search-actions" [style=dotted] - ":services:backup" -> ":core:preferences" [style=dotted] - ":services:backup" -> ":core:ktx" [style=dotted] - ":services:backup" -> ":data:customattrs" [style=dotted] - ":services:backup" -> ":data:themes" [style=dotted] - ":services:search" -> ":services:search" - ":services:search" -> ":data:calculator" [style=dotted] - ":services:search" -> ":data:unitconverter" [style=dotted] - ":services:search" -> ":data:customattrs" [style=dotted] - ":services:search" -> ":data:search-actions" [style=dotted] - ":services:search" -> ":core:base" [style=dotted] - ":services:search" -> ":core:preferences" [style=dotted] - ":services:search" -> ":core:crashreporter" [style=dotted] - ":services:search" -> ":core:ktx" [style=dotted] - ":services:music" -> ":services:music" - ":services:music" -> ":core:ktx" [style=dotted] - ":services:music" -> ":core:preferences" [style=dotted] - ":services:music" -> ":data:notifications" [style=dotted] - ":services:music" -> ":core:crashreporter" [style=dotted] - ":services:accounts" -> ":services:accounts" - ":services:accounts" -> ":libs:g-services" [style=dotted] - ":services:accounts" -> ":libs:owncloud" [style=dotted] - ":services:accounts" -> ":libs:nextcloud" [style=dotted] - ":services:icons" -> ":data:customattrs" - ":services:icons" -> ":services:icons" - ":services:icons" -> ":data:database" [style=dotted] - ":services:icons" -> ":core:preferences" [style=dotted] - ":services:icons" -> ":core:ktx" [style=dotted] - ":services:icons" -> ":core:base" [style=dotted] - ":services:icons" -> ":data:applications" [style=dotted] - ":services:icons" -> ":core:crashreporter" [style=dotted] - ":services:widgets" -> ":services:widgets" - ":services:widgets" -> ":core:base" [style=dotted] - ":services:widgets" -> ":core:i18n" [style=dotted] - ":services:widgets" -> ":data:widgets" [style=dotted] - ":services:global-actions" -> ":services:global-actions" - ":services:global-actions" -> ":core:preferences" [style=dotted] - ":services:global-actions" -> ":core:base" [style=dotted] - ":services:global-actions" -> ":core:i18n" [style=dotted] - ":services:global-actions" -> ":core:permissions" [style=dotted] - ":services:tags" -> ":services:tags" - ":services:tags" -> ":core:preferences" [style=dotted] - ":services:tags" -> ":core:base" [style=dotted] - ":services:tags" -> ":core:ktx" [style=dotted] - ":services:tags" -> ":core:crashreporter" [style=dotted] - ":services:tags" -> ":data:customattrs" [style=dotted] - ":services:tags" -> ":data:searchable" [style=dotted] - ":libs:nextcloud" -> ":libs:webdav" - ":libs:nextcloud" -> ":libs:nextcloud" - ":libs:nextcloud" -> ":core:i18n" [style=dotted] - ":libs:webdav" -> ":libs:webdav" - ":libs:webdav" -> ":core:crashreporter" [style=dotted] - ":libs:webdav" -> ":core:ktx" [style=dotted] - ":libs:g-services" -> ":libs:g-services" - ":libs:g-services" -> ":core:i18n" [style=dotted] - ":libs:g-services" -> ":core:crashreporter" [style=dotted] - ":libs:material-color-utilities" -> ":libs:material-color-utilities" - ":libs:owncloud" -> ":libs:webdav" - ":libs:owncloud" -> ":libs:owncloud" - ":libs:owncloud" -> ":core:crashreporter" [style=dotted] - ":libs:owncloud" -> ":core:ktx" [style=dotted] - ":libs:owncloud" -> ":core:i18n" [style=dotted] - ":libs:ms-services" -> ":libs:ms-services" - ":libs:ms-services" -> ":core:crashreporter" [style=dotted] -} diff --git a/docs/public/img/dependency-graph.dot.png b/docs/public/img/dependency-graph.dot.png deleted file mode 100644 index d1db2a96..00000000 Binary files a/docs/public/img/dependency-graph.dot.png and /dev/null differ