Andy Scherzinger
25a5346435
unify room converter's json handling to always use LoganSquare
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:15 +02:00
Andy Scherzinger
2a0ee1c90d
move extension functions to methods
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:14 +02:00
Andy Scherzinger
c9ba0fe870
annotate JvmStatic for more idiomatic access from Java
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:14 +02:00
Andy Scherzinger
74fc56fa7e
Replace Observable with Single, let Repositories serve Models
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:14 +02:00
Andy Scherzinger
359104d6ba
rename to isDbRoomMigrated and setDbRoomMigrated for proper kotlin interoperability
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:13 +02:00
Álvaro Brey
afbec06ad3
WIP improvements during pair programming call
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-07-01 08:59:13 +02:00
Andy Scherzinger
5881e5021c
make disposal of searchViewDisposable null-safe
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:13 +02:00
Andy Scherzinger
d3286bf6bc
update test cases
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:12 +02:00
Andy Scherzinger
925691299a
ignore spotbugs correctness for an android api array access with fixed index
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:12 +02:00
Andy Scherzinger
565903b956
remove flow and use rx
...
...to stay in line with currently used concepts
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:11 +02:00
Álvaro Brey
f7786e1b93
Fix flow listening in SettingsController
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-07-01 08:59:11 +02:00
Andy Scherzinger
27d5059e92
trying to extract flow value
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:10 +02:00
Andy Scherzinger
f7ca1ec804
DB version switcher for requery
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:10 +02:00
Andy Scherzinger
d55c3fa68e
Log db migrations
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:10 +02:00
Andy Scherzinger
8c27b54377
move everything to flows
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:09 +02:00
Andy Scherzinger
730aeb2944
fix detekt and ktlint issues
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:09 +02:00
Andy Scherzinger
5ffa3c44fd
create new capabilities util add license header and format kotlin code
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:08 +02:00
Andy Scherzinger
75c8625aee
run user repo call in coroutine
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:08 +02:00
Andy Scherzinger
349d5fe19b
dual-mode of DB fpr requery and room
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:08 +02:00
Andy Scherzinger
05db482d06
adding arbitrary storage implementation, initial steps towards new util classes
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:59:07 +02:00
Andy Scherzinger
db1dd66204
port room database layer from master-broken to up-to-date master
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-07-01 08:58:56 +02:00
Álvaro Brey
e176b38d8b
NewBaseController: Inject kotlin fields without @JvmField and nullable type
...
These do not need to be nullable as they will be injected immediately.
This will make child controllers code much cleaner.
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-28 17:00:01 +02:00
Tim Krüger
834d310eb8
Use simple class name for logging
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-23 15:35:42 +02:00
Tim Krüger
f87e0a2d85
Set PendingIntent flag immutable
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-23 15:34:11 +02:00
Tim Krüger
174a7e53d8
Remove unneeded '@SuppressLint("InlinedApi")'
...
The annotation '@RequiresApi' was already set correctly.
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-23 15:24:28 +02:00
Tim Krüger
10a4521af9
Rename 'WebRtcAudioManger' to 'WebRtcAudioManager'
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-23 15:20:32 +02:00
drone
272f2e839c
Merge commit '58c40e6ee244e6b78cc8754e8cc621e8400507d7'
2022-06-23 08:59:34 +00:00
Andy Scherzinger
331309405d
Set intent flag required by Android 12 (SDK 31)
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-23 10:21:03 +02:00
Álvaro Brey
c4d9105613
Merge pull request #2148 from nextcloud/fix/callactivity-receiver
...
Use custom permission for unfiltered broadcast receiver in CallActivity
2022-06-23 09:36:00 +02:00
Tim Krüger
f366c75f68
Add mandetory intent flags
...
Since SDK 31 for an 'PendingIntent' the intent flags 'FLAG_IMMUTABLE' or
'FLAG_IMMUTABLE' are mandetory.
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-22 15:33:26 +02:00
Andy Scherzinger
3096d90bc6
only set intent flag for sdk>=31
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-22 11:21:46 +02:00
drone
4b67a71ff4
Merge commit '1f936cb677ed17f93fba461ae59ac84bda5e99db'
2022-06-22 09:00:28 +00:00
Andy Scherzinger
1f936cb677
migrate to sdk=31
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-22 10:59:38 +02:00
Tim Krüger
6e4841ae3a
Rename 'MagicAudioManager' and 'MagicBluetoothManager'
...
It's not magic but WebRtc related.
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-21 15:13:47 +02:00
Tim Krüger
e14f00fae7
Request 'BLUETOOTH_CONNECT' permissions
...
Request the 'BLUETOOTH_CONNECT' permissions if not already granted.
If the permission is be granted in this request, the
'MagicBluetoothManger' will be started.
See: #2132
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-21 15:13:40 +02:00
Andy Scherzinger
205d00d443
harmonize license header in java/kt files
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 16:42:53 +02:00
Andy Scherzinger
0b2b0cca51
Use proper Android logger
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 16:36:02 +02:00
Andy Scherzinger
49792ecf1e
rename blacklist/whitelist variables to include/exclude sets to reflect their collection type
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 16:29:57 +02:00
Andy Scherzinger
61ec38dd5e
replace deprecated listener due to update to exoplayer 2.18.0
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 16:25:27 +02:00
Andy Scherzinger
993e50dbdb
rename variable to reflect its collection type
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 15:37:42 +02:00
Andy Scherzinger
34f8bb5ab7
use fixed strings where possible to limit lint score bump
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 15:25:11 +02:00
Andy Scherzinger
cd44de757c
code reformatting
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 15:17:08 +02:00
Andy Scherzinger
08f5274af9
add cipher migration for version 4 of sqlcipher
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-18 14:44:45 +02:00
Tim Krüger
dedbe40cc0
Launch 'MagicBluetoothManager' independently
...
This change is needed to make the 'MagicBluetoothManager' startable
after the from Android SDK 31 introduced BLUETOOTH_CONNECT is granted by
the user.
Before this change the 'MagicBluetoothManager' was only started in
'MagicAudioManager#start'. Now the new method
'MagicAudioManager#startBluetoothManager' can be used to start the
'MagicBluetoothManager'.
This change is also a preperation to fix #1309 and #2114 .
See: #2132 , #1309 , #2124
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-17 15:51:44 +02:00
Tim Krüger
4821b02729
Add Android build switch for checking bluetooth permissions
...
Refactored method 'hasPermission' to 'hasNoBluetoothPermission'. The new method
respect the in SKD 31 introduced permission BLUETOOTH_CONNECT. For older SDK
versions the permission BLUETOOTH will be used.
Additionaly make methods private which need bluetooth permissions and only
called locally. For public methods which need bluetooth permissions the method
'hasNoBluetoothPermission' is called to check them.
Also add suppress lint annotation for 'MissingPermission'.
From SDK 30 to SDK 31 the bluetooth related permissions changed and it
is suggested to add the attribute 'android:maxSdkVersion="30"' to the
legacy BLUETOOTH permission in the 'AndroidManifest.xml' [1]:
> For your legacy Bluetooth-related permission declarations, set
> android:maxSdkVersion to 30. This app compatibility step helps the system
> grant your app only the Bluetooth permissions that it needs when installed
> on devices that run Android 12 or higher.
This is explicitly not done here!
During runtime (on Android 12) while starting the 'MagicBluetoothManger' the
following part in 'android.bluetooth.BluetootHeadset' constructor will be
executed and results in the previous exception:
// Preserve legacy compatibility where apps were depending on
// registerStateChangeCallback() performing a permissions check which
// has been relaxed in modern platform versions
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.R
&& context.checkSelfPermission(android.Manifest.permission.BLUETOOTH)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Need BLUETOOTH permission");
}
In the 'build.gradle' the 'targetSdkVersion 30' and 'compileSdkVersion 31' is
configured. Because the 'MagicBluetoothManager' checks for the 'targetSdkVersion'
instead of 'Build.VERSION.SDK_INT' also on a Android 12 (SDK 31) the 'BLUETOOTH'
permission is needed.
So the solution is to don't set `android:maxSdkVersion="30"' for the BLUETOOTH
permission and request the BLUETOOTH_CONNECT permission.
Resolves : #2132
See:
[1] https://web.archive.org/web/20220416121005/https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android12-or-higher
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-06-17 15:51:44 +02:00
Marcel Hibbe
c628c23557
fix to load conversation list (restricted user status)
...
when the user status app on server is restricted to only some groups, the capabilities for users that are excluded still contains the "user_status" capability.
For the android talk app, this caused that the conversations were not shown.
With this fix, the conversations will be loaded also if the "user_status" is mistakenly set. Additionally, the option to set the status will be hidden.
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-06-15 13:45:53 +00:00
Álvaro Brey
bb7e82fbcb
Use custom permission for unfiltered broadcast receiver in CallActivity
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-14 15:51:04 +02:00
Andy Scherzinger
dd129b4e6c
further centralize mimetype definitions
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-10 13:13:37 +02:00
Andy Scherzinger
444ff05cf5
centralize mime type definitions
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-09 21:02:31 +02:00
Álvaro Brey
49d2f40e3f
ProfileController: fix non-exhaustive when
...
Crashes Kotlin 1.7.0
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-09 17:57:01 +00:00
Andy Scherzinger
3e99dc065b
improve code base from review comments
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-09 12:03:03 +02:00
Andy Scherzinger
3d0f154d7d
simplify worker call
...
Co-authored-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-09 12:03:03 +02:00
Andy Scherzinger
d96ca1eb67
block selection of encrypted files as well as files that are not allowed to be re-shared
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-09 00:18:27 +02:00
Andy Scherzinger
df61a4df87
replace share files remote item chooser with new implementation and remove any legacy implementation
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 23:40:09 +02:00
Andy Scherzinger
41694b64bb
fix copyright year in header
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:16:37 +02:00
Andy Scherzinger
aa353f064f
fix selection on click for new implementation, move sorting dialog references to new sorting class references
...
... needs duplication of the layout file
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:39 +02:00
Andy Scherzinger
7f85a2f228
Rename ReadFilesystemOperation
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:39 +02:00
Andy Scherzinger
3330df3b66
rename to ReadFolderListingOperation
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:38 +02:00
Andy Scherzinger
4f234032aa
remove now obsolete BrowserForAvatarController
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:38 +02:00
Andy Scherzinger
5bf90157bc
remove legacy references and fix avatar upload permission issues
...
...by using a different location and remove previous avatars upfront
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:38 +02:00
Andy Scherzinger
80eccf3176
create narrow(er) interface for file selection
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:37 +02:00
Andy Scherzinger
ed09934c7a
reformat kotlin
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:37 +02:00
Andy Scherzinger
f2119770bc
migrate sorter classes to kotlin
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:37 +02:00
Andy Scherzinger
c5c52f2f6e
remove "New" suffix from classes
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:36 +02:00
Andy Scherzinger
c71d1da334
mark deprecated and rename legacy sort implementation
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:36 +02:00
Álvaro Brey
57ef995543
RemoteFileBrowser viewmodel: don't filter out root dir
...
The relevant operation no longer returns the current path
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-08 18:15:36 +02:00
Andy Scherzinger
9da5b57804
remove self path from dav result
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:35 +02:00
Álvaro Brey
eba697b8f2
RemoteFileBrowser: move selected paths from activity to viewmodel
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-08 18:15:35 +02:00
Álvaro Brey
ffdadc6c01
RemoteFileBrowser: move currentPath to viewmodel, and fix title bar
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-08 18:15:35 +02:00
Álvaro Brey
2fd97856d8
RemoteFileBrowser: fix file filtering and move it to viewmodel
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-08 18:15:34 +02:00
Álvaro Brey
9d4745ee9b
RemoteFileBrowser: do sorting in ViewModel, not activity
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-08 18:15:34 +02:00
Andy Scherzinger
a41d14c33a
Reimplement BrowserController with new architecture pattern
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-08 18:15:21 +02:00
Dariusz Olszewski
f1dfb00ae0
Use unique request code to make sure that a new PendingIntent gets created for each notification
...
Signed-off-by: Dariusz Olszewski <starypatyk@users.noreply.github.com>
2022-06-07 15:43:09 +00:00
Álvaro Brey
1ee92e39dd
ChatController: fix scroll to unread messages
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-07 11:39:34 +02:00
Andy Scherzinger
ad60de30c6
enforce not null
...
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2022-06-03 13:38:53 +02:00
Álvaro Brey
b097e3aac4
Message search: disable feature if unified search capability not present
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 17:42:59 +02:00
Álvaro Brey
eddb90d31b
Message search: avoid passing user entity to repository, inject userProvider instead
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:20 +02:00
Álvaro Brey
c10c45630c
Fix some lint issues
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
232334efac
Fix spotbugs
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
1f00f426c7
MessageSearchActivity: don't skip viewmodel when selecting message
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
0d21ce4f17
MessageSearchActivity: add loading animation + swipe to refresh
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
dd55ab5741
Add ability to scroll to message selected in search results
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
b5d8f6ee95
Implement search in specific chat
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
d1d61e87a9
Use rxjava to debounce search instead of custom debouncer
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
b10ea2f41f
Add unit tests for MessageSearchHelper
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:19 +02:00
Álvaro Brey
1d632f3c96
Implement global message search
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-06-01 16:49:10 +02:00
Andy Scherzinger
fcf20e3362
Merge pull request #1939 from nextcloud/dependabot/gradle/org.mockito-mockito-core-4.5.1
...
Bump mockito-core from 3.12.4 to 4.5.1
2022-05-27 19:43:09 +02:00
Marcel Hibbe
2435d8d296
Add GenericOCS
...
responses contain "ocs" which was deleted by aab00c5e8f
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-05-27 16:02:46 +02:00
Álvaro Brey
820db1e167
Convert ShareUtils to Kotlin so no TextUtils static mock is needed in tests, and re-enable relevant tests
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-27 14:40:45 +02:00
Álvaro Brey
fd4b7080cc
DoNotDisturbUtils: refactor to avoid mocking static stuff
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-27 14:26:00 +02:00
Tim Krüger
964dc2a76d
Catch RuntimeException thrown by NotificationManager
...
In case anything goes wront during calling
'NotificationManger#activeNotification' an 'RuntimeException' will be
thrown. This results in a crash if not catched.
Resolves : #2078
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-05-27 12:15:09 +02:00
Marcel Hibbe
a23d4ef692
add silent call feature
...
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
2022-05-25 09:58:57 +00:00
Álvaro Brey
1c9730f909
Fix state handling in SharedItemsActivity
...
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-23 17:35:17 +02:00
Álvaro Brey
05340fc466
SharedItems: show loading state when initially loading a tab, and clear remaining TODOs
...
Co-authored-by: Tim Krüger <t@timkrueger.me>
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-23 17:35:15 +02:00
Álvaro Brey
5310ed3f3d
SharedItems: show empty state when there are no shared items
...
Co-authored-by: Tim Krüger <t@timkrueger.me>
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-23 17:35:14 +02:00
Álvaro Brey
ae65de6cce
SharedItemsViewModel: use unified state livedata
...
Co-authored-by: Tim Krüger <t@timkrueger.me>
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
2022-05-23 17:35:13 +02:00
Tim Krüger
10857114f5
Avoid NPE when 'sharedItems' is null
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-05-23 17:35:12 +02:00
Tim Krüger
e5b38856eb
Add missing license headers
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-05-23 17:35:10 +02:00
Tim Krüger
52ec1b76fa
Add comment for refactoring FileViewerUtils
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-05-23 17:35:09 +02:00
Tim Krüger
0d65824fa6
Remove 'UserEntity' from 'SharedItem' model
...
Signed-off-by: Tim Krüger <t@timkrueger.me>
2022-05-23 17:35:08 +02:00