Update docs

This commit is contained in:
MM20 2025-04-19 13:33:36 +02:00
parent 34180ae6b4
commit 92626bff31
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
7 changed files with 72 additions and 525 deletions

View File

@ -6,5 +6,3 @@ plugins {
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.dokka) apply true alias(libs.plugins.dokka) apply true
} }
apply(from = "docs/deps-graph.gradle")

View File

@ -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<Project>()
def dependencies = new LinkedHashMap<Tuple2<Project, Project>, List<String>>()
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, Project>(project, dependency)
def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList<String>() }
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.")
}
}

View File

@ -4,13 +4,14 @@ sidebar_position: 4
# Libraries # 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 UI
- **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
- **Koin** for dependency injection - **Koin** for dependency injection
- **Coil** to load and transform images - **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, …) - Several other **AndroidX** libraries (Work, Lifecycle, AppCompat, …)

View File

@ -4,55 +4,73 @@ sidebar_position: 3
# Modules # 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: started this project so future refactorings are to be expected. This is the current structure:
- `:app`: - `:app`:
- `:app`: The app module. Contains almost nothing except the `Application` class (`de.mm20.launcher2.LauncherApplication`) - `:app`: The app module. Contains almost nothing except the `Application` class (
- `:ui`: Contains almost the entire user interface (except for account sign-in UIs). The only module that uses Jetpack Compose. `de.mm20.launcher2.LauncherApplication`)
- `:services`: Higher level APIs for the app's business logic. Each module represents a specific functionality of the launcher - `:ui`: Contains almost the entire user interface (except for account sign-in UIs). The only
- `:accounts`: Common APIs to manage different account types (Google, Microsoft, Nextcloud, …) module that uses Jetpack Compose.
- `:backup`: Backup and restore functionality - `:services`: Higher level APIs for the app's business logic. Each module represents a specific
- `:badges`: Provide different types of badges that are displayed on app icons functionality of the launcher
- `:icons`: Used to retrieve icons for items. Handles icon packs, themed icons and also custom icons (on a higher level) - `:accounts`: Common APIs to manage different account types (Nextcloud, Owncloud)
- `:music`: Manage media sessions and extract metadata - `:backup`: Backup and restore functionality
- `:search`: The search. - `:badges`: Provide different types of badges that are displayed on app icons
- `:tags`: Edit, copy and delete tags - `:favorites`: Handles pinned items and item visibility
- `:widgets`: High-level APIs to manage widgets - `:global-actions`: Handles global system actions like turning the screen off, and opening the
- `:data`: Lower level APIs. Generally, these modules are more multi-purpose and provide the data that is consumed by the `:services` modules. notification drawer
- `:applications`: Installed apps and app search - `:icons`: Used to retrieve icons for items. Handles icon packs, themed icons and also custom
- `:appshortcuts`: Query apps shortcuts for apps and shortcut search icons (on a higher level)
- `:calendar`: query calendar events for the calendar widget and calendar search - `:music`: Manage media sessions and extract metadata
- `:calculator`: Implements the calculator. Should probably be moved to `:services` - `:plugins`: Plugin service to list, enable and disable plugins.
- `:unitconverter`: Unit and currency converter. Should probably be moved to `:services` - `:search`: Search service
- `:contacts`: Query contacts on the device - `:tags`: Edit, copy and delete tags
- `:currencies`: APIs to fetch currency conversion rates, used by `:data:unitconverter` - `:widgets`: High-level APIs to manage widgets
- `:customattrs`: common (low-level) APIs to store per-app customizations (custom labels, custom icons, tags) - `:data`: Lower level APIs. Usually, these modules implement interfaces from the `:core:base`
- `: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. module, so that `:services` don't need to depend on `:data` modules directly.
- `:files`: Manage and find files (local and cloud) - `:applications`: Implements APIs for app grid and app search
- `:notifications`: APIs to read notifications. Contains the app's `NotificationListenerService` - `:appshortcuts`: Implements app shortcuts (search and shortcuts)
- `:websites`: Website search - `:calendar`: Implements calendar search
- `:weather`: APIs to fetch weather data - `:calculator`: Implements the calculator.
- `:widgets`: CRUD operations to store and retrieve widgets in/from the database - `:contacts`: Implements contact search
- `:wikipedia`: APIs to search Wikipedia - `: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` - `:core`
- `:base`: Commonly used data classes, helper functions and utilities. Also icon resources (if they do not need localization). - `:base`: Interface definitions for the most commonly used data types. Commonly used data
- `:i18n`: All resources that require localization. Mainly strings but can also be used for icon resources if they need localization. classes, helper functions and utilities.
- `:ktx`: Commonly used Kotlin extension functions - `:compat`: Compatibility helpers for old Android versions
- `:compat`: Compatibility helpers for old Android versions - `:crashreporter`: Crash reporter; based on https://github.com/MindorksOpenSource/CrashReporter
- `:crashreporter`: Crash reporter; based on https://github.com/MindorksOpenSource/CrashReporter - `:devicepose`: Location and positioning APIs.
- `:permissions`: Request and observe permission status for this app - `:i18n`: All resources that require localization. Mainly strings but can also be used for icon
- `:preferences`: Store user preferences; uses AndroidX Datastore resources if they need localization.
- `:database`: the launcher database, uses AndroidX Room - `: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` - `: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` - `:address-formatter`: Fork of https://github.com/woheller69/AndroidAddressFormatter (because
- `:ms-services`: Microsoft APIs and Microsoft sign-in; used by `:accounts` and `:files` 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) - `:material-color-utilities`: This
- `:webdav`: common APIs for WebDAV search, used by `:nextcloud` and `:owncloud` library: https://github.com/material-foundation/material-color-utilities (not available as
- `:nextcloud`: Nextcloud APIs and Nextcloud sign-in; used by `:accounts` and `:files` Gradle package yet)
- `:owncloud`: Owncloud APIs and Owncloud sign-in; used by `:accounts` and `:files` - `: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
Most of the modules have a `Module.kt` file in their root which contains Koin definitions to make the APIs accessible to other modules. the APIs accessible to other modules.
[![](/img/dependency-graph.dot.png)](/img/dependency-graph.dot.png))

View File

@ -81,9 +81,6 @@ functionality:
plugin), your current location may be shared with that plugin (only if you have granted location plugin), your current location may be shared with that plugin (only if you have granted location
permissions). permissions).
- **First-Party Plugins:** Developed by the Kvaesitso team.
- **Third-Party Plugins:** Developed by external developers.
### Data Stored by Kvaesitso ### Data Stored by Kvaesitso
Kvaesitso may store copies of the data it receives from plugins locally in its own local storage 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. - **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. - **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 ## Appendix A: Plugin Policies
### Google Apps Plugin ### Google Apps Plugin

View File

@ -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]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB