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.
- `: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 - `:backup`: Backup and restore functionality
- `:badges`: Provide different types of badges that are displayed on app icons - `: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) - `: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 - `:music`: Manage media sessions and extract metadata
- `:search`: The search. - `:plugins`: Plugin service to list, enable and disable plugins.
- `:search`: Search service
- `:tags`: Edit, copy and delete tags - `:tags`: Edit, copy and delete tags
- `:widgets`: High-level APIs to manage widgets - `: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. - `:data`: Lower level APIs. Usually, these modules implement interfaces from the `:core:base`
- `:applications`: Installed apps and app search module, so that `:services` don't need to depend on `:data` modules directly.
- `:appshortcuts`: Query apps shortcuts for apps and shortcut search - `:applications`: Implements APIs for app grid and app search
- `:calendar`: query calendar events for the calendar widget and calendar search - `:appshortcuts`: Implements app shortcuts (search and shortcuts)
- `:calculator`: Implements the calculator. Should probably be moved to `:services` - `:calendar`: Implements calendar search
- `:unitconverter`: Unit and currency converter. Should probably be moved to `:services` - `:calculator`: Implements the calculator.
- `:contacts`: Query contacts on the device - `:contacts`: Implements contact search
- `:currencies`: APIs to fetch currency conversion rates, used by `:data:unitconverter` - `: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) - `:customattrs`: common (low-level) APIs to store per-app customizations (custom labels, custom
- `: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. icons, tags)
- `:files`: Manage and find files (local and cloud) - `: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` - `:notifications`: APIs to read notifications. Contains the app's `NotificationListenerService`
- `:websites`: Website search - `:plugins`: Low level plugin APIs.
- `:unitconverter`: Implements unit and currency converter.
- `:weather`: APIs to fetch weather data - `:weather`: APIs to fetch weather data
- `:websites`: Implements website search
- `:widgets`: CRUD operations to store and retrieve widgets in/from the database - `:widgets`: CRUD operations to store and retrieve widgets in/from the database
- `:wikipedia`: APIs to search Wikipedia - `: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.
- `: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 - `:permissions`: Request and observe permission status for this app
- `:preferences`: Store user preferences; uses AndroidX Datastore - `:preferences`: Store user preferences; uses AndroidX Datastore
- `:database`: the launcher database, uses AndroidX Room - `: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
Gradle package yet)
- `:nextcloud`: Nextcloud APIs and Nextcloud 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` - `: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