diff --git a/.idea/copyright/IONOS_HiDrive_Next.xml b/.idea/copyright/IONOS_HiDrive_Next.xml
new file mode 100644
index 000000000000..d313733e68e6
--- /dev/null
+++ b/.idea/copyright/IONOS_HiDrive_Next.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
index bc106e52608a..2e31899f7ffd 100644
--- a/.idea/copyright/profiles_settings.xml
+++ b/.idea/copyright/profiles_settings.xml
@@ -1,3 +1,3 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 2e1f6f9ec897..e8125fd2a2aa 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -24,6 +24,8 @@ buildscript {
classpath "org.jacoco:org.jacoco.core:$jacoco_version"
classpath "org.jacoco:org.jacoco.report:$jacoco_version"
classpath "org.jacoco:org.jacoco.agent:$jacoco_version"
+ classpath 'com.google.gms:google-services:4.4.2'
+ classpath "com.google.firebase:firebase-crashlytics-gradle:3.0.2"
}
}
@@ -43,6 +45,7 @@ apply plugin: 'pmd'
apply from: "$rootProject.projectDir/jacoco.gradle"
apply plugin: 'com.github.spotbugs'
apply plugin: 'io.gitlab.arturbosch.detekt'
+apply plugin: 'com.google.firebase.crashlytics'
// needed to make renovate run without shot, as shot requires Android SDK
// https://github.com/pedrovgs/Shot/issues/300
@@ -51,6 +54,9 @@ if (shotTest) {
}
apply plugin: 'com.google.devtools.ksp'
+if (getGradle().getStartParameter().getTaskRequests().toString().contains("Gplay")){
+ apply plugin: 'com.google.gms.google-services'
+}
println "Gradle uses Java ${Jvm.current()}"
@@ -163,8 +169,11 @@ android {
}
gplay {
- applicationId 'com.nextcloud.client'
+ applicationId "com.ionos.hidrivenext"
dimension "default"
+ versionCode 3
+ isDefault = true
+ resConfigs "en", "de", "es", "fr", "nl"
}
huawei {
@@ -322,6 +331,7 @@ dependencies {
gplayImplementation project(':appscan')
huaweiImplementation project(':appscan')
qaImplementation project(':appscan')
+ implementation project(':scanbot')
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.13.0'
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.6.9'
@@ -370,6 +380,9 @@ dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
}
+ implementation reactivex_rxjava2
+ implementation reactivex_rxandroid2
+
// dependencies for local unit tests
testImplementation 'junit:junit:4.13.2'
testImplementation "org.mockito:mockito-core:$mockitoVersion"
@@ -430,6 +443,10 @@ dependencies {
// splash screen dependency ref: https://developer.android.com/develop/ui/views/launch/splash-screen/migrate
implementation 'androidx.core:core-splashscreen:1.0.1'
+
+ implementation(platform("com.google.firebase:firebase-bom:33.7.0"))
+ implementation "com.google.firebase:firebase-analytics"
+ implementation "com.google.firebase:firebase-crashlytics"
}
configurations.configureEach {
diff --git a/app/src/gplay/AndroidManifest.xml b/app/src/gplay/AndroidManifest.xml
index 34de04e2556d..5fee8a23bbf0 100644
--- a/app/src/gplay/AndroidManifest.xml
+++ b/app/src/gplay/AndroidManifest.xml
@@ -15,7 +15,7 @@
@@ -30,13 +30,13 @@
+ tools:node="remove" />
+ tools:node="remove" />
+ tools:node="remove" />
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH
- * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
package com.nextcloud.client.di
+import com.ionos.scanbot.availability.Availability
+import com.ionos.scanbot.di.qualifiers.Scanbot
+import com.ionos.scanbot.di.qualifiers.ScanbotLicense
import com.nextcloud.appscan.ScanPageContract
import com.nextcloud.client.documentscan.AppScanOptionalFeature
import dagger.Module
@@ -17,9 +21,13 @@ import dagger.Reusable
internal class VariantModule {
@Provides
@Reusable
- fun scanOptionalFeature(): AppScanOptionalFeature {
+ fun scanOptionalFeature(
+ @Scanbot featureAvailability: Availability,
+ @ScanbotLicense licenseAvailability: Availability
+ ): AppScanOptionalFeature {
return object : AppScanOptionalFeature() {
override fun getScanContract() = ScanPageContract()
+ override val isAvailable: Boolean = featureAvailability.available() && licenseAvailability.available()
}
}
}
diff --git a/app/src/gplay/release/google-services.json b/app/src/gplay/release/google-services.json
new file mode 100644
index 000000000000..99f046dd7692
--- /dev/null
+++ b/app/src/gplay/release/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "",
+ "project_id": "",
+ "storage_bucket": ""
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "",
+ "android_client_info": {
+ "package_name": "com.ionos.hidrivenext"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": ""
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/src/gplay/res/animator/progress_bar_login_indeterminate.xml b/app/src/gplay/res/animator/progress_bar_login_indeterminate.xml
new file mode 100644
index 000000000000..fd660c547af9
--- /dev/null
+++ b/app/src/gplay/res/animator/progress_bar_login_indeterminate.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/gplay/res/color-night/drawer_item_shape_color.xml b/app/src/gplay/res/color-night/drawer_item_shape_color.xml
new file mode 100644
index 000000000000..a4d31dfa8a72
--- /dev/null
+++ b/app/src/gplay/res/color-night/drawer_item_shape_color.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/color/drawer_item_shape_color.xml b/app/src/gplay/res/color/drawer_item_shape_color.xml
new file mode 100644
index 000000000000..a4d31dfa8a72
--- /dev/null
+++ b/app/src/gplay/res/color/drawer_item_shape_color.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/color/filled_button_bg_color.xml b/app/src/gplay/res/color/filled_button_bg_color.xml
new file mode 100644
index 000000000000..518c975d874c
--- /dev/null
+++ b/app/src/gplay/res/color/filled_button_bg_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/color/filled_button_text_color.xml b/app/src/gplay/res/color/filled_button_text_color.xml
new file mode 100644
index 000000000000..6eef0fe45d18
--- /dev/null
+++ b/app/src/gplay/res/color/filled_button_text_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/color/outlined_button_bg_color.xml b/app/src/gplay/res/color/outlined_button_bg_color.xml
new file mode 100644
index 000000000000..3f66ee2be899
--- /dev/null
+++ b/app/src/gplay/res/color/outlined_button_bg_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/color/outlined_button_stroke_color.xml b/app/src/gplay/res/color/outlined_button_stroke_color.xml
new file mode 100644
index 000000000000..0c25161bc46c
--- /dev/null
+++ b/app/src/gplay/res/color/outlined_button_stroke_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/color/outlined_button_text_color.xml b/app/src/gplay/res/color/outlined_button_text_color.xml
new file mode 100644
index 000000000000..2140ebe47a18
--- /dev/null
+++ b/app/src/gplay/res/color/outlined_button_text_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/color/text_button_text_color.xml b/app/src/gplay/res/color/text_button_text_color.xml
new file mode 100644
index 000000000000..c40c98ad77f3
--- /dev/null
+++ b/app/src/gplay/res/color/text_button_text_color.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable-night/favorite.xml b/app/src/gplay/res/drawable-night/favorite.xml
new file mode 100644
index 000000000000..f2728f1758d5
--- /dev/null
+++ b/app/src/gplay/res/drawable-night/favorite.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable-night/nextcloud_logo.xml b/app/src/gplay/res/drawable-night/nextcloud_logo.xml
new file mode 100644
index 000000000000..939c59c3e3a2
--- /dev/null
+++ b/app/src/gplay/res/drawable-night/nextcloud_logo.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable-night/shared_via_link.xml b/app/src/gplay/res/drawable-night/shared_via_link.xml
new file mode 100644
index 000000000000..f4ef3c4ff1cc
--- /dev/null
+++ b/app/src/gplay/res/drawable-night/shared_via_link.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable-night/shared_via_users.xml b/app/src/gplay/res/drawable-night/shared_via_users.xml
new file mode 100644
index 000000000000..e0389e0ee4b3
--- /dev/null
+++ b/app/src/gplay/res/drawable-night/shared_via_users.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/account_circle_white.xml b/app/src/gplay/res/drawable/account_circle_white.xml
new file mode 100644
index 000000000000..e8ea2101d106
--- /dev/null
+++ b/app/src/gplay/res/drawable/account_circle_white.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/all_files.xml b/app/src/gplay/res/drawable/all_files.xml
new file mode 100644
index 000000000000..9efb2dcd0327
--- /dev/null
+++ b/app/src/gplay/res/drawable/all_files.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/bottom_sheet_drag_handle.xml b/app/src/gplay/res/drawable/bottom_sheet_drag_handle.xml
new file mode 100644
index 000000000000..e060526252b1
--- /dev/null
+++ b/app/src/gplay/res/drawable/bottom_sheet_drag_handle.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/dialog_background.xml b/app/src/gplay/res/drawable/dialog_background.xml
new file mode 100644
index 000000000000..6f14d4c3f227
--- /dev/null
+++ b/app/src/gplay/res/drawable/dialog_background.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/dialog_item_background.xml b/app/src/gplay/res/drawable/dialog_item_background.xml
new file mode 100644
index 000000000000..cbcdd3ff5263
--- /dev/null
+++ b/app/src/gplay/res/drawable/dialog_item_background.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/e2e_border.xml b/app/src/gplay/res/drawable/e2e_border.xml
new file mode 100644
index 000000000000..a545c168e793
--- /dev/null
+++ b/app/src/gplay/res/drawable/e2e_border.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_divider.xml b/app/src/gplay/res/drawable/exo_divider.xml
new file mode 100644
index 000000000000..205032f4f73d
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_divider.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_ic_check.xml b/app/src/gplay/res/drawable/exo_ic_check.xml
new file mode 100644
index 000000000000..d045c84f5db5
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_ic_check.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_audiotrack.xml b/app/src/gplay/res/drawable/exo_styled_controls_audiotrack.xml
new file mode 100644
index 000000000000..fd50f84d0482
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_audiotrack.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_pause.xml b/app/src/gplay/res/drawable/exo_styled_controls_pause.xml
new file mode 100644
index 000000000000..c45c39df05da
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_pause.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_play.xml b/app/src/gplay/res/drawable/exo_styled_controls_play.xml
new file mode 100644
index 000000000000..1956ab230365
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_play.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_settings.xml b/app/src/gplay/res/drawable/exo_styled_controls_settings.xml
new file mode 100644
index 000000000000..d0a127203c85
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_settings.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_simple_fastforward.xml b/app/src/gplay/res/drawable/exo_styled_controls_simple_fastforward.xml
new file mode 100644
index 000000000000..11002787d609
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_simple_fastforward.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_simple_rewind.xml b/app/src/gplay/res/drawable/exo_styled_controls_simple_rewind.xml
new file mode 100644
index 000000000000..c7d2782ea707
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_simple_rewind.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_styled_controls_speed.xml b/app/src/gplay/res/drawable/exo_styled_controls_speed.xml
new file mode 100644
index 000000000000..e10f5e2223e9
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_styled_controls_speed.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/exo_thumb.xml b/app/src/gplay/res/drawable/exo_thumb.xml
new file mode 100644
index 000000000000..d31859726d0a
--- /dev/null
+++ b/app/src/gplay/res/drawable/exo_thumb.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/favorite.xml b/app/src/gplay/res/drawable/favorite.xml
new file mode 100644
index 000000000000..44a725f11469
--- /dev/null
+++ b/app/src/gplay/res/drawable/favorite.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/file.xml b/app/src/gplay/res/drawable/file.xml
new file mode 100644
index 000000000000..bb46adbe85de
--- /dev/null
+++ b/app/src/gplay/res/drawable/file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/file_calendar.xml b/app/src/gplay/res/drawable/file_calendar.xml
new file mode 100644
index 000000000000..d8b720a581e1
--- /dev/null
+++ b/app/src/gplay/res/drawable/file_calendar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/file_details_search_background.xml b/app/src/gplay/res/drawable/file_details_search_background.xml
new file mode 100644
index 000000000000..3fa292870817
--- /dev/null
+++ b/app/src/gplay/res/drawable/file_details_search_background.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/file_image.xml b/app/src/gplay/res/drawable/file_image.xml
new file mode 100644
index 000000000000..aaee3cf2eba8
--- /dev/null
+++ b/app/src/gplay/res/drawable/file_image.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/file_multiple.xml b/app/src/gplay/res/drawable/file_multiple.xml
new file mode 100644
index 000000000000..942c9373d4bc
--- /dev/null
+++ b/app/src/gplay/res/drawable/file_multiple.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/filelist_action_icon_background.xml b/app/src/gplay/res/drawable/filelist_action_icon_background.xml
new file mode 100644
index 000000000000..ad4d33647d47
--- /dev/null
+++ b/app/src/gplay/res/drawable/filelist_action_icon_background.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/folder.xml b/app/src/gplay/res/drawable/folder.xml
new file mode 100644
index 000000000000..8b4fc8a42890
--- /dev/null
+++ b/app/src/gplay/res/drawable/folder.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/folder_star_32dp.xml b/app/src/gplay/res/drawable/folder_star_32dp.xml
new file mode 100644
index 000000000000..8b4fc8a42890
--- /dev/null
+++ b/app/src/gplay/res/drawable/folder_star_32dp.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/grid_mode_item_background.xml b/app/src/gplay/res/drawable/grid_mode_item_background.xml
new file mode 100644
index 000000000000..c3bb6301c093
--- /dev/null
+++ b/app/src/gplay/res/drawable/grid_mode_item_background.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/grid_mode_item_outline.xml b/app/src/gplay/res/drawable/grid_mode_item_outline.xml
new file mode 100644
index 000000000000..670be17089d1
--- /dev/null
+++ b/app/src/gplay/res/drawable/grid_mode_item_outline.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/grid_mode_more_button_background.xml b/app/src/gplay/res/drawable/grid_mode_more_button_background.xml
new file mode 100644
index 000000000000..3dd44347922f
--- /dev/null
+++ b/app/src/gplay/res/drawable/grid_mode_more_button_background.xml
@@ -0,0 +1,21 @@
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/grid_mode_selected_item_background.xml b/app/src/gplay/res/drawable/grid_mode_selected_item_background.xml
new file mode 100644
index 000000000000..756aa8df241b
--- /dev/null
+++ b/app/src/gplay/res/drawable/grid_mode_selected_item_background.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_action_create_dir.xml b/app/src/gplay/res/drawable/ic_action_create_dir.xml
new file mode 100644
index 000000000000..2141f7c78e49
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_action_create_dir.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_action_upload.xml b/app/src/gplay/res/drawable/ic_action_upload.xml
new file mode 100644
index 000000000000..c8a9e0631b0b
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_action_upload.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_activity.xml b/app/src/gplay/res/drawable/ic_activity.xml
new file mode 100644
index 000000000000..2cf83e115e53
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_activity.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_alphabetical_asc.xml b/app/src/gplay/res/drawable/ic_alphabetical_asc.xml
new file mode 100644
index 000000000000..39545cafc5fc
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_alphabetical_asc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_alphabetical_desc.xml b/app/src/gplay/res/drawable/ic_alphabetical_desc.xml
new file mode 100644
index 000000000000..f6c98c61d5f6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_alphabetical_desc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_arrow_back.xml b/app/src/gplay/res/drawable/ic_arrow_back.xml
new file mode 100644
index 000000000000..114ef8a5760e
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_arrow_back.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_assistant.xml b/app/src/gplay/res/drawable/ic_assistant.xml
new file mode 100644
index 000000000000..314febca6a85
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_assistant.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_camera.xml b/app/src/gplay/res/drawable/ic_camera.xml
new file mode 100644
index 000000000000..eaaaecd77eb6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_camera.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_checkbox_blank_outline.xml b/app/src/gplay/res/drawable/ic_checkbox_blank_outline.xml
new file mode 100644
index 000000000000..acbdc3c8bb72
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_checkbox_blank_outline.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_checkbox_marked.xml b/app/src/gplay/res/drawable/ic_checkbox_marked.xml
new file mode 100644
index 000000000000..d249debaeaab
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_checkbox_marked.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_close_search.xml b/app/src/gplay/res/drawable/ic_close_search.xml
new file mode 100644
index 000000000000..f5be8d6d699d
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_close_search.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_cloud.xml b/app/src/gplay/res/drawable/ic_cloud.xml
new file mode 100644
index 000000000000..1fadad4368de
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_cloud.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_cloud_download.xml b/app/src/gplay/res/drawable/ic_cloud_download.xml
new file mode 100644
index 000000000000..37592e253cd6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_cloud_download.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_cloud_sync_off.xml b/app/src/gplay/res/drawable/ic_cloud_sync_off.xml
new file mode 100644
index 000000000000..4da7ffbdf252
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_cloud_sync_off.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_cloud_sync_on.xml b/app/src/gplay/res/drawable/ic_cloud_sync_on.xml
new file mode 100644
index 000000000000..5677bff01515
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_cloud_sync_on.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_cloud_upload.xml b/app/src/gplay/res/drawable/ic_cloud_upload.xml
new file mode 100644
index 000000000000..c4bc7f3dd6ba
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_cloud_upload.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_contact_book.xml b/app/src/gplay/res/drawable/ic_contact_book.xml
new file mode 100644
index 000000000000..587b00881832
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_contact_book.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_content_copy.xml b/app/src/gplay/res/drawable/ic_content_copy.xml
new file mode 100644
index 000000000000..3cfc1e42d971
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_content_copy.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_delete.xml b/app/src/gplay/res/drawable/ic_delete.xml
new file mode 100644
index 000000000000..8a0b2f618a58
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_delete.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_dots_vertical.xml b/app/src/gplay/res/drawable/ic_dots_vertical.xml
new file mode 100644
index 000000000000..e572128d3612
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_dots_vertical.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_edit.xml b/app/src/gplay/res/drawable/ic_edit.xml
new file mode 100644
index 000000000000..b70c7eae487c
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_edit.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_email.xml b/app/src/gplay/res/drawable/ic_email.xml
new file mode 100644
index 000000000000..5c1a5a36f8da
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_email.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_cancel_sync.xml b/app/src/gplay/res/drawable/ic_file_action_cancel_sync.xml
new file mode 100644
index 000000000000..0a9173c21d08
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_cancel_sync.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_download_file.xml b/app/src/gplay/res/drawable/ic_file_action_download_file.xml
new file mode 100644
index 000000000000..9f5e50a293db
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_download_file.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_edit.xml b/app/src/gplay/res/drawable/ic_file_action_edit.xml
new file mode 100644
index 000000000000..43233ac3db1d
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_edit.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_export_file.xml b/app/src/gplay/res/drawable/ic_file_action_export_file.xml
new file mode 100644
index 000000000000..d331d6fb1b57
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_export_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_favorite.xml b/app/src/gplay/res/drawable/ic_file_action_favorite.xml
new file mode 100644
index 000000000000..f03c59e85bf1
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_favorite.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_lock_file.xml b/app/src/gplay/res/drawable/ic_file_action_lock_file.xml
new file mode 100644
index 000000000000..f83bf38fd62d
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_lock_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_move_or_copy.xml b/app/src/gplay/res/drawable/ic_file_action_move_or_copy.xml
new file mode 100644
index 000000000000..1d9b33e52e55
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_move_or_copy.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_open_file_with.xml b/app/src/gplay/res/drawable/ic_file_action_open_file_with.xml
new file mode 100644
index 000000000000..ebd25250a8ec
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_open_file_with.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_pin_to_homescreen.xml b/app/src/gplay/res/drawable/ic_file_action_pin_to_homescreen.xml
new file mode 100644
index 000000000000..12bad2c11102
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_pin_to_homescreen.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_remove_file.xml b/app/src/gplay/res/drawable/ic_file_action_remove_file.xml
new file mode 100644
index 000000000000..8a0b2f618a58
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_remove_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_rename_file.xml b/app/src/gplay/res/drawable/ic_file_action_rename_file.xml
new file mode 100644
index 000000000000..e2a4df854a82
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_rename_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_see_details.xml b/app/src/gplay/res/drawable/ic_file_action_see_details.xml
new file mode 100644
index 000000000000..62f45aa6f038
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_see_details.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_select_all.xml b/app/src/gplay/res/drawable/ic_file_action_select_all.xml
new file mode 100644
index 000000000000..a286b9168a6e
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_select_all.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_select_none.xml b/app/src/gplay/res/drawable/ic_file_action_select_none.xml
new file mode 100644
index 000000000000..929269719e69
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_select_none.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_set_as_wallpaper.xml b/app/src/gplay/res/drawable/ic_file_action_set_as_wallpaper.xml
new file mode 100644
index 000000000000..fdaa13d8c77d
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_set_as_wallpaper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_set_encrypted.xml b/app/src/gplay/res/drawable/ic_file_action_set_encrypted.xml
new file mode 100644
index 000000000000..ca99659b4629
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_set_encrypted.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_share_file.xml b/app/src/gplay/res/drawable/ic_file_action_share_file.xml
new file mode 100644
index 000000000000..a0e14edfa8b2
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_share_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_stream_media.xml b/app/src/gplay/res/drawable/ic_file_action_stream_media.xml
new file mode 100644
index 000000000000..9e4d0662e523
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_stream_media.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_sync_file.xml b/app/src/gplay/res/drawable/ic_file_action_sync_file.xml
new file mode 100644
index 000000000000..297aa442036f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_sync_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_unlock_file.xml b/app/src/gplay/res/drawable/ic_file_action_unlock_file.xml
new file mode 100644
index 000000000000..d4724ca67180
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_unlock_file.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_unset_encrypted.xml b/app/src/gplay/res/drawable/ic_file_action_unset_encrypted.xml
new file mode 100644
index 000000000000..20a8f656fd71
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_unset_encrypted.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_file_action_unset_favorite.xml b/app/src/gplay/res/drawable/ic_file_action_unset_favorite.xml
new file mode 100644
index 000000000000..f38d5c4ea3da
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_file_action_unset_favorite.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_account_group.xml b/app/src/gplay/res/drawable/ic_folder_overlay_account_group.xml
new file mode 100644
index 000000000000..05e232d6895f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_account_group.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_external.xml b/app/src/gplay/res/drawable/ic_folder_overlay_external.xml
new file mode 100644
index 000000000000..7eb67c1c67cb
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_external.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_key.xml b/app/src/gplay/res/drawable/ic_folder_overlay_key.xml
new file mode 100644
index 000000000000..181769358a26
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_key.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_link.xml b/app/src/gplay/res/drawable/ic_folder_overlay_link.xml
new file mode 100644
index 000000000000..05e232d6895f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_link.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_lock.xml b/app/src/gplay/res/drawable/ic_folder_overlay_lock.xml
new file mode 100644
index 000000000000..db30297451b6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_lock.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_share.xml b/app/src/gplay/res/drawable/ic_folder_overlay_share.xml
new file mode 100644
index 000000000000..05e232d6895f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_share.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_folder_overlay_upload.xml b/app/src/gplay/res/drawable/ic_folder_overlay_upload.xml
new file mode 100644
index 000000000000..afe3192f83aa
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_folder_overlay_upload.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_gallery_set_media_folder.xml b/app/src/gplay/res/drawable/ic_gallery_set_media_folder.xml
new file mode 100644
index 000000000000..fdaa13d8c77d
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_gallery_set_media_folder.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_gallery_show_photos.xml b/app/src/gplay/res/drawable/ic_gallery_show_photos.xml
new file mode 100644
index 000000000000..eaaaecd77eb6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_gallery_show_photos.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_gallery_show_videos.xml b/app/src/gplay/res/drawable/ic_gallery_show_videos.xml
new file mode 100644
index 000000000000..a8ea6b923ae0
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_gallery_show_videos.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_gallery_tick.xml b/app/src/gplay/res/drawable/ic_gallery_tick.xml
new file mode 100644
index 000000000000..05a9c15ca270
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_gallery_tick.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_grid_mode_more.xml b/app/src/gplay/res/drawable/ic_grid_mode_more.xml
new file mode 100644
index 000000000000..9d9291500985
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_grid_mode_more.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_history.xml b/app/src/gplay/res/drawable/ic_history.xml
new file mode 100644
index 000000000000..82b62c934363
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_history.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_import.xml b/app/src/gplay/res/drawable/ic_import.xml
new file mode 100644
index 000000000000..b7523313a2c1
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_import.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_launcher_foreground.xml b/app/src/gplay/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 000000000000..7d75ec0175be
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_link.xml b/app/src/gplay/res/drawable/ic_link.xml
new file mode 100644
index 000000000000..b1666422bcc6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_link.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_list_empty_create_folder.xml b/app/src/gplay/res/drawable/ic_list_empty_create_folder.xml
new file mode 100644
index 000000000000..2af06159b73c
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_list_empty_create_folder.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_list_empty_error.xml b/app/src/gplay/res/drawable/ic_list_empty_error.xml
new file mode 100644
index 000000000000..4b64a4e49553
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_list_empty_error.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_list_empty_folder.xml b/app/src/gplay/res/drawable/ic_list_empty_folder.xml
new file mode 100644
index 000000000000..bbeb3f1d05ee
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_list_empty_folder.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_list_empty_recent.xml b/app/src/gplay/res/drawable/ic_list_empty_recent.xml
new file mode 100644
index 000000000000..676879e62d6e
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_list_empty_recent.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_list_empty_shared.xml b/app/src/gplay/res/drawable/ic_list_empty_shared.xml
new file mode 100644
index 000000000000..5cf82c43f9f6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_list_empty_shared.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_menu.xml b/app/src/gplay/res/drawable/ic_menu.xml
new file mode 100644
index 000000000000..d3ae8c8b3080
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_menu.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_modification_asc.xml b/app/src/gplay/res/drawable/ic_modification_asc.xml
new file mode 100644
index 000000000000..19f367facb48
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_modification_asc.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_modification_desc.xml b/app/src/gplay/res/drawable/ic_modification_desc.xml
new file mode 100644
index 000000000000..58c619363535
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_modification_desc.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_pause.xml b/app/src/gplay/res/drawable/ic_pause.xml
new file mode 100644
index 000000000000..af11ea628327
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_pause.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/drawable/ic_play.xml b/app/src/gplay/res/drawable/ic_play.xml
new file mode 100644
index 000000000000..d151770705cf
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_play.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/drawable/ic_plus.xml b/app/src/gplay/res/drawable/ic_plus.xml
new file mode 100644
index 000000000000..1990e792ad8f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_plus.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_progress_bar_login_indeterminate.xml b/app/src/gplay/res/drawable/ic_progress_bar_login_indeterminate.xml
new file mode 100644
index 000000000000..0a5a500b19f7
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_progress_bar_login_indeterminate.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_scan_document.xml b/app/src/gplay/res/drawable/ic_scan_document.xml
new file mode 100644
index 000000000000..8799c9510fbb
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_scan_document.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_search.xml b/app/src/gplay/res/drawable/ic_search.xml
new file mode 100644
index 000000000000..f6d35d2f2bcc
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_search.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_search_grey.xml b/app/src/gplay/res/drawable/ic_search_grey.xml
new file mode 100644
index 000000000000..87e41fad695a
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_search_grey.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_select_all.xml b/app/src/gplay/res/drawable/ic_select_all.xml
new file mode 100644
index 000000000000..50db787d70ae
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_select_all.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_share.xml b/app/src/gplay/res/drawable/ic_share.xml
new file mode 100644
index 000000000000..5cf82c43f9f6
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_share.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_share_settings.xml b/app/src/gplay/res/drawable/ic_share_settings.xml
new file mode 100644
index 000000000000..91a6d5e62bbd
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_share_settings.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_size_asc.xml b/app/src/gplay/res/drawable/ic_size_asc.xml
new file mode 100644
index 000000000000..08e0b390792f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_size_asc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_size_desc.xml b/app/src/gplay/res/drawable/ic_size_desc.xml
new file mode 100644
index 000000000000..d0ffd2c9d99e
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_size_desc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_synced.xml b/app/src/gplay/res/drawable/ic_synced.xml
new file mode 100644
index 000000000000..31b565901f3b
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_synced.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_tick.xml b/app/src/gplay/res/drawable/ic_tick.xml
new file mode 100644
index 000000000000..f4716e25109c
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_tick.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_unshare.xml b/app/src/gplay/res/drawable/ic_unshare.xml
new file mode 100644
index 000000000000..0fa90363eb4a
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_unshare.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_unshared.xml b/app/src/gplay/res/drawable/ic_unshared.xml
new file mode 100644
index 000000000000..e11da31a265e
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_unshared.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_user.xml b/app/src/gplay/res/drawable/ic_user.xml
new file mode 100644
index 000000000000..6517166eeba1
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_user.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_view_list.xml b/app/src/gplay/res/drawable/ic_view_list.xml
new file mode 100644
index 000000000000..3a287644bd8f
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_view_list.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ic_view_module.xml b/app/src/gplay/res/drawable/ic_view_module.xml
new file mode 100644
index 000000000000..8e96d7dfb9bb
--- /dev/null
+++ b/app/src/gplay/res/drawable/ic_view_module.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/image_32dp.xml b/app/src/gplay/res/drawable/image_32dp.xml
new file mode 100644
index 000000000000..13a7fb43c0f2
--- /dev/null
+++ b/app/src/gplay/res/drawable/image_32dp.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/ionos_logo.xml b/app/src/gplay/res/drawable/ionos_logo.xml
new file mode 100644
index 000000000000..9f971f82dba3
--- /dev/null
+++ b/app/src/gplay/res/drawable/ionos_logo.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/logo.xml b/app/src/gplay/res/drawable/logo.xml
new file mode 100644
index 000000000000..9f971f82dba3
--- /dev/null
+++ b/app/src/gplay/res/drawable/logo.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_favorites.xml b/app/src/gplay/res/drawable/nav_favorites.xml
new file mode 100644
index 000000000000..f03c59e85bf1
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_favorites.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_notifications.xml b/app/src/gplay/res/drawable/nav_notifications.xml
new file mode 100644
index 000000000000..f8c12d5af7dc
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_notifications.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_on_device.xml b/app/src/gplay/res/drawable/nav_on_device.xml
new file mode 100644
index 000000000000..902842d03802
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_on_device.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_photos.xml b/app/src/gplay/res/drawable/nav_photos.xml
new file mode 100644
index 000000000000..fdaa13d8c77d
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_photos.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_settings.xml b/app/src/gplay/res/drawable/nav_settings.xml
new file mode 100644
index 000000000000..dfa36583d70f
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_settings.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_shared.xml b/app/src/gplay/res/drawable/nav_shared.xml
new file mode 100644
index 000000000000..d136bc23398e
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_shared.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nav_trashbin.xml b/app/src/gplay/res/drawable/nav_trashbin.xml
new file mode 100644
index 000000000000..75e40f031021
--- /dev/null
+++ b/app/src/gplay/res/drawable/nav_trashbin.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/nextcloud_logo.xml b/app/src/gplay/res/drawable/nextcloud_logo.xml
new file mode 100644
index 000000000000..41f4c5d33874
--- /dev/null
+++ b/app/src/gplay/res/drawable/nextcloud_logo.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/notification_icon.xml b/app/src/gplay/res/drawable/notification_icon.xml
new file mode 100644
index 000000000000..6c1ccab18953
--- /dev/null
+++ b/app/src/gplay/res/drawable/notification_icon.xml
@@ -0,0 +1,17 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/drawable/notifications_icon.xml b/app/src/gplay/res/drawable/notifications_icon.xml
new file mode 100644
index 000000000000..7fbc42b42e90
--- /dev/null
+++ b/app/src/gplay/res/drawable/notifications_icon.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/progress_bar_login_indeterminate.xml b/app/src/gplay/res/drawable/progress_bar_login_indeterminate.xml
new file mode 100644
index 000000000000..01762da59db2
--- /dev/null
+++ b/app/src/gplay/res/drawable/progress_bar_login_indeterminate.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/shared_via_link.xml b/app/src/gplay/res/drawable/shared_via_link.xml
new file mode 100644
index 000000000000..f4ef3c4ff1cc
--- /dev/null
+++ b/app/src/gplay/res/drawable/shared_via_link.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/shared_via_users.xml b/app/src/gplay/res/drawable/shared_via_users.xml
new file mode 100644
index 000000000000..e0389e0ee4b3
--- /dev/null
+++ b/app/src/gplay/res/drawable/shared_via_users.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/uploads.xml b/app/src/gplay/res/drawable/uploads.xml
new file mode 100644
index 000000000000..c26710c81044
--- /dev/null
+++ b/app/src/gplay/res/drawable/uploads.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/drawable/video_32dp.xml b/app/src/gplay/res/drawable/video_32dp.xml
new file mode 100644
index 000000000000..3fb34ed2c2f1
--- /dev/null
+++ b/app/src/gplay/res/drawable/video_32dp.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/account_setup.xml b/app/src/gplay/res/layout/account_setup.xml
new file mode 100644
index 000000000000..b4bcbe1aad04
--- /dev/null
+++ b/app/src/gplay/res/layout/account_setup.xml
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/account_setup_webview.xml b/app/src/gplay/res/layout/account_setup_webview.xml
new file mode 100644
index 000000000000..cf50f7403935
--- /dev/null
+++ b/app/src/gplay/res/layout/account_setup_webview.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/activity_preview_media.xml b/app/src/gplay/res/layout/activity_preview_media.xml
new file mode 100644
index 000000000000..ad88c96e744c
--- /dev/null
+++ b/app/src/gplay/res/layout/activity_preview_media.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/activity_splash.xml b/app/src/gplay/res/layout/activity_splash.xml
new file mode 100644
index 000000000000..a26af2ef1c45
--- /dev/null
+++ b/app/src/gplay/res/layout/activity_splash.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/backup_fragment.xml b/app/src/gplay/res/layout/backup_fragment.xml
new file mode 100644
index 000000000000..40db4e6c3385
--- /dev/null
+++ b/app/src/gplay/res/layout/backup_fragment.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/deep_link_login.xml b/app/src/gplay/res/layout/deep_link_login.xml
new file mode 100644
index 000000000000..1dbf1c43d6fa
--- /dev/null
+++ b/app/src/gplay/res/layout/deep_link_login.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/drawer.xml b/app/src/gplay/res/layout/drawer.xml
new file mode 100644
index 000000000000..c739841894f0
--- /dev/null
+++ b/app/src/gplay/res/layout/drawer.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/empty_list_media.xml b/app/src/gplay/res/layout/empty_list_media.xml
new file mode 100644
index 000000000000..9c6e8c95fc45
--- /dev/null
+++ b/app/src/gplay/res/layout/empty_list_media.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/exo_player_control_view.xml b/app/src/gplay/res/layout/exo_player_control_view.xml
new file mode 100644
index 000000000000..3f457f3a5563
--- /dev/null
+++ b/app/src/gplay/res/layout/exo_player_control_view.xml
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/exo_player_view.xml b/app/src/gplay/res/layout/exo_player_view.xml
new file mode 100644
index 000000000000..930b014b1d30
--- /dev/null
+++ b/app/src/gplay/res/layout/exo_player_view.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_actions_bottom_sheet.xml b/app/src/gplay/res/layout/file_actions_bottom_sheet.xml
new file mode 100644
index 000000000000..c3e243d8225e
--- /dev/null
+++ b/app/src/gplay/res/layout/file_actions_bottom_sheet.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_actions_bottom_sheet_item.xml b/app/src/gplay/res/layout/file_actions_bottom_sheet_item.xml
new file mode 100644
index 000000000000..290f012e9ce0
--- /dev/null
+++ b/app/src/gplay/res/layout/file_actions_bottom_sheet_item.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_details_fragment.xml b/app/src/gplay/res/layout/file_details_fragment.xml
new file mode 100644
index 000000000000..ed791047783e
--- /dev/null
+++ b/app/src/gplay/res/layout/file_details_fragment.xml
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_details_share_link_share_item.xml b/app/src/gplay/res/layout/file_details_share_link_share_item.xml
new file mode 100644
index 000000000000..d307f152bc15
--- /dev/null
+++ b/app/src/gplay/res/layout/file_details_share_link_share_item.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_details_sharing_fragment.xml b/app/src/gplay/res/layout/file_details_sharing_fragment.xml
new file mode 100644
index 000000000000..4f01fdafa858
--- /dev/null
+++ b/app/src/gplay/res/layout/file_details_sharing_fragment.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml b/app/src/gplay/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml
new file mode 100644
index 000000000000..b49d76853225
--- /dev/null
+++ b/app/src/gplay/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/fragment_gallery_bottom_sheet.xml b/app/src/gplay/res/layout/fragment_gallery_bottom_sheet.xml
new file mode 100644
index 000000000000..139a9a827c6b
--- /dev/null
+++ b/app/src/gplay/res/layout/fragment_gallery_bottom_sheet.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/grid_item.xml b/app/src/gplay/res/layout/grid_item.xml
new file mode 100644
index 000000000000..1d0db0e0aab1
--- /dev/null
+++ b/app/src/gplay/res/layout/grid_item.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/info_box.xml b/app/src/gplay/res/layout/info_box.xml
new file mode 100644
index 000000000000..40d99656dd68
--- /dev/null
+++ b/app/src/gplay/res/layout/info_box.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/item_quick_share_permissions.xml b/app/src/gplay/res/layout/item_quick_share_permissions.xml
new file mode 100644
index 000000000000..410088009941
--- /dev/null
+++ b/app/src/gplay/res/layout/item_quick_share_permissions.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/list_item.xml b/app/src/gplay/res/layout/list_item.xml
new file mode 100644
index 000000000000..d4e17e6c8811
--- /dev/null
+++ b/app/src/gplay/res/layout/list_item.xml
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/login_flow_info_layout_v2.xml b/app/src/gplay/res/layout/login_flow_info_layout_v2.xml
new file mode 100644
index 000000000000..3227876ee40e
--- /dev/null
+++ b/app/src/gplay/res/layout/login_flow_info_layout_v2.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/media_control.xml b/app/src/gplay/res/layout/media_control.xml
new file mode 100644
index 000000000000..2b13b15d87b3
--- /dev/null
+++ b/app/src/gplay/res/layout/media_control.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/quick_sharing_permissions_bottom_sheet_fragment.xml b/app/src/gplay/res/layout/quick_sharing_permissions_bottom_sheet_fragment.xml
new file mode 100644
index 000000000000..ae1fd24ba225
--- /dev/null
+++ b/app/src/gplay/res/layout/quick_sharing_permissions_bottom_sheet_fragment.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/settings_preference_first_group.xml b/app/src/gplay/res/layout/settings_preference_first_group.xml
new file mode 100644
index 000000000000..f207114a078e
--- /dev/null
+++ b/app/src/gplay/res/layout/settings_preference_first_group.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/settings_preference_group.xml b/app/src/gplay/res/layout/settings_preference_group.xml
new file mode 100644
index 000000000000..56d0dd055f0e
--- /dev/null
+++ b/app/src/gplay/res/layout/settings_preference_group.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/settings_preference_list_item.xml b/app/src/gplay/res/layout/settings_preference_list_item.xml
new file mode 100644
index 000000000000..5fddbb9bf057
--- /dev/null
+++ b/app/src/gplay/res/layout/settings_preference_list_item.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/settings_preference_switcher.xml b/app/src/gplay/res/layout/settings_preference_switcher.xml
new file mode 100644
index 000000000000..81b7886dd1fd
--- /dev/null
+++ b/app/src/gplay/res/layout/settings_preference_switcher.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/settings_privacy_switchers.xml b/app/src/gplay/res/layout/settings_privacy_switchers.xml
new file mode 100644
index 000000000000..297c6bfceefc
--- /dev/null
+++ b/app/src/gplay/res/layout/settings_privacy_switchers.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/simple_file_list_actions_bottom_sheet_fragment.xml b/app/src/gplay/res/layout/simple_file_list_actions_bottom_sheet_fragment.xml
new file mode 100644
index 000000000000..197853d4bc9e
--- /dev/null
+++ b/app/src/gplay/res/layout/simple_file_list_actions_bottom_sheet_fragment.xml
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/simple_spinner_item.xml b/app/src/gplay/res/layout/simple_spinner_item.xml
new file mode 100644
index 000000000000..4b6e91765dd6
--- /dev/null
+++ b/app/src/gplay/res/layout/simple_spinner_item.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/gplay/res/layout/sorting_order_fragment.xml b/app/src/gplay/res/layout/sorting_order_fragment.xml
new file mode 100644
index 000000000000..ad8ff4cd8e72
--- /dev/null
+++ b/app/src/gplay/res/layout/sorting_order_fragment.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/synced_folders_item_header.xml b/app/src/gplay/res/layout/synced_folders_item_header.xml
new file mode 100644
index 000000000000..14d99248b903
--- /dev/null
+++ b/app/src/gplay/res/layout/synced_folders_item_header.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/toolbar_standard.xml b/app/src/gplay/res/layout/toolbar_standard.xml
new file mode 100644
index 000000000000..914580a1d79c
--- /dev/null
+++ b/app/src/gplay/res/layout/toolbar_standard.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/layout/view_authorization_method.xml b/app/src/gplay/res/layout/view_authorization_method.xml
new file mode 100644
index 000000000000..85d8ec412ce3
--- /dev/null
+++ b/app/src/gplay/res/layout/view_authorization_method.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/layout/view_login_background.xml b/app/src/gplay/res/layout/view_login_background.xml
new file mode 100644
index 000000000000..80064d2ab3c1
--- /dev/null
+++ b/app/src/gplay/res/layout/view_login_background.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/menu/partial_drawer_entries.xml b/app/src/gplay/res/menu/partial_drawer_entries.xml
new file mode 100644
index 000000000000..9e9afddc62ce
--- /dev/null
+++ b/app/src/gplay/res/menu/partial_drawer_entries.xml
@@ -0,0 +1,140 @@
+
+
+
diff --git a/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000000..a1f8fa17e3c4
--- /dev/null
+++ b/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000000..448b38f276ae
--- /dev/null
+++ b/app/src/gplay/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/mipmap-hdpi/ic_launcher.webp b/app/src/gplay/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 000000000000..063c51d877a2
Binary files /dev/null and b/app/src/gplay/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/app/src/gplay/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/gplay/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 000000000000..da712edf87b0
Binary files /dev/null and b/app/src/gplay/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/app/src/gplay/res/mipmap-mdpi/ic_launcher.webp b/app/src/gplay/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 000000000000..3fe3cbdfb17d
Binary files /dev/null and b/app/src/gplay/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/app/src/gplay/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/gplay/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 000000000000..eefd99007825
Binary files /dev/null and b/app/src/gplay/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/app/src/gplay/res/mipmap-xhdpi/ic_launcher.webp b/app/src/gplay/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 000000000000..7f731095ee14
Binary files /dev/null and b/app/src/gplay/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/app/src/gplay/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/gplay/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000000..d3dc506789c7
Binary files /dev/null and b/app/src/gplay/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/app/src/gplay/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/gplay/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 000000000000..4972ec7f3318
Binary files /dev/null and b/app/src/gplay/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/app/src/gplay/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/gplay/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000000..885d2b49ac23
Binary files /dev/null and b/app/src/gplay/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 000000000000..2648a2d213db
Binary files /dev/null and b/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000000..c8a15cadff46
Binary files /dev/null and b/app/src/gplay/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/gplay/res/values-de/setup.xml b/app/src/gplay/res/values-de/setup.xml
new file mode 100644
index 000000000000..c7ef8f525d85
--- /dev/null
+++ b/app/src/gplay/res/values-de/setup.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ https://wl.hidrive.com/easy/0142
+ https://wl.hidrive.com/easy/0092
+
diff --git a/app/src/gplay/res/values-de/string.xml b/app/src/gplay/res/values-de/string.xml
new file mode 100644
index 000000000000..903098581320
--- /dev/null
+++ b/app/src/gplay/res/values-de/string.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Willkommen beim Cloud-Speicher
+ Login
+ Sie müssen sich über den Browser einloggen
+ Abbrechen
+ Wiederholen
+
+
+ Filtern
+
+
+ Verwendeter Speicher
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-es/setup.xml b/app/src/gplay/res/values-es/setup.xml
new file mode 100644
index 000000000000..6b47802d9ef2
--- /dev/null
+++ b/app/src/gplay/res/values-es/setup.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ https://wl.hidrive.com/easy/0152
+ https://wl.hidrive.com/easy/0112
+
diff --git a/app/src/gplay/res/values-es/string.xml b/app/src/gplay/res/values-es/string.xml
new file mode 100644
index 000000000000..5c436328ec11
--- /dev/null
+++ b/app/src/gplay/res/values-es/string.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Bienvenido/a al almacenamiento en la nube
+ Iniciar sesión
+ Tienes que iniciar sesión en el navegador.
+ Cancelar
+ Volver a intentar
+
+
+ Filtro
+
+
+ Memoria utilizada
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-fr/setup.xml b/app/src/gplay/res/values-fr/setup.xml
new file mode 100644
index 000000000000..e33dc6854637
--- /dev/null
+++ b/app/src/gplay/res/values-fr/setup.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ https://wl.hidrive.com/easy/0122
+ https://wl.hidrive.com/easy/0082
+
diff --git a/app/src/gplay/res/values-fr/string.xml b/app/src/gplay/res/values-fr/string.xml
new file mode 100644
index 000000000000..48196d5ae24b
--- /dev/null
+++ b/app/src/gplay/res/values-fr/string.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Bienvenue sur votre cloud
+ Connexion
+ Un navigateur s\'ouvre pour le login
+ Annuler
+ Répéter
+
+
+ Filtre
+
+
+ Stockage occupé
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-land/dimen.xml b/app/src/gplay/res/values-land/dimen.xml
new file mode 100644
index 000000000000..62bf3d0ab28b
--- /dev/null
+++ b/app/src/gplay/res/values-land/dimen.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ - 0.05
+ - 0.4
+ - 0.65
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-large/dimen.xml b/app/src/gplay/res/values-large/dimen.xml
new file mode 100644
index 000000000000..687b1eedea7e
--- /dev/null
+++ b/app/src/gplay/res/values-large/dimen.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ 36dp
+ 48dp
+ 36dp
+ 12dp
+ 48dp
+ 12dp
+ 12dp
+ 48dp
+ 8dp
+ 16sp
+ 14sp
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-large/dims.xml b/app/src/gplay/res/values-large/dims.xml
new file mode 100644
index 000000000000..bcdabf5ee21a
--- /dev/null
+++ b/app/src/gplay/res/values-large/dims.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ 16dp
+ 56dp
+ 72dp
+ 8dp
+ 80dp
+
diff --git a/app/src/gplay/res/values-night/colors.xml b/app/src/gplay/res/values-night/colors.xml
new file mode 100644
index 000000000000..0fe29f4f1467
--- /dev/null
+++ b/app/src/gplay/res/values-night/colors.xml
@@ -0,0 +1,131 @@
+
+
+
+
+ @color/ionos_default_text_color
+ @color/metallic_silver
+ @color/midnight_blue2
+ @color/ionos_toolbar_color
+ @color/navy
+ @color/navy
+ @color/ionos_default_icon_color
+
+ @color/navy
+
+ @color/dark_slate_grey
+ @color/dark_slate_grey
+ @color/dark_slate_grey
+ @color/deep_koamaru
+ @color/jungle_mist
+
+ @color/midnight_blue2
+ @color/ghost_white
+ @color/ghost_white
+ @color/geyser
+ @color/curious_blue
+ @color/orange
+
+ @color/dodger_blue
+ @color/royal_blue
+ @color/dark_slate_grey
+
+ @color/white
+ @color/white
+ @color/dusk
+
+ @color/transparent
+ @color/ghost_white
+ @color/transparent
+ @color/ghost_white
+ @color/ghost_white
+ @color/dusk
+ @color/ghost_white
+ @color/madison
+ @color/dusk
+ @color/curious_blue
+ @color/cornflower
+ @color/dusk
+
+ @color/transparent_ghost_white
+
+ @color/slate_grey
+
+ @color/curious_blue
+ @color/curious_blue
+ @color/curious_blue
+
+ @color/dark_slate_grey
+ @color/white_smoke
+ @color/white_smoke
+
+ @color/ghost_white
+ @color/navy
+ @color/royal_blue
+
+ @color/deep_koamaru
+ @color/metallic_silver
+
+ @color/midnight_blue2
+ @color/dusk
+
+ @color/midnight_blue2
+ @color/curious_blue
+ @color/dodger_blue
+ @color/gull_grayapprox
+
+ @color/curious_blue
+ @color/curious_blue
+ @color/midnight_blue2
+ @color/curious_blue
+ @color/geyser
+ @color/metallic_silver
+ @color/dusk
+
+ @color/curious_blue
+ @color/royal_blue
+ @color/white
+ @color/curious_blue
+ @color/geyser
+ @color/dusk
+ @color/curious_blue
+
+ @color/ionos_default_text_color
+
+ @color/bg_default
+ @color/bg_default
+ @color/transparent
+ @color/appbar
+
+ @color/ghost_white
+ @color/curious_blue
+ @color/slate_grey
+ @color/slate_grey
+ @color/ghost_white
+ @color/dodger_blue
+
+ @color/navy
+ @color/curious_blue
+
+
+ @color/white_smoke
+ @color/dusk
+ @color/dusk
+
+ @color/curious_blue
+ @color/white
+
+ @color/dodger_blue
+
+ @color/curious_blue
+ @color/white
+
+ @color/ghost_white
+ @color/ghost_white
+ @color/gull_grayapprox
+ @color/ghost_white
+
diff --git a/app/src/gplay/res/values-nl/string.xml b/app/src/gplay/res/values-nl/string.xml
new file mode 100644
index 000000000000..c2ba63152289
--- /dev/null
+++ b/app/src/gplay/res/values-nl/string.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Welkom bij je cloud storage
+ Login
+ Je moet inloggen via je browser
+ Annuleren
+ Opnieuw proberen
+
+
+ Filteren
+
+
+ Opslag in gebruik
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values-v27/styles.xml b/app/src/gplay/res/values-v27/styles.xml
new file mode 100644
index 000000000000..436a33c63d75
--- /dev/null
+++ b/app/src/gplay/res/values-v27/styles.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/values/colors.xml b/app/src/gplay/res/values/colors.xml
new file mode 100644
index 000000000000..1b6de3edc210
--- /dev/null
+++ b/app/src/gplay/res/values/colors.xml
@@ -0,0 +1,144 @@
+
+
+
+
+ @color/ionos_default_text_color
+ @color/dusk
+ @color/white
+ @color/ionos_toolbar_color
+ @color/ghost_white
+ @color/white_smoke
+ @color/ionos_default_icon_color
+
+ @color/bg_default
+ @color/bg_default
+
+ @color/ghost_white
+
+ @color/ionos_navigation_bar_background
+ @color/navigation_bar_background_color
+ @color/ghost_white
+ @color/lavender_mist
+ @color/white
+
+ @color/ionos_navigation_bar_background
+ @color/ghost_white
+ @color/navy
+ @color/navy
+ @color/dusk
+ @color/dodger_blue
+ @color/chocolate
+
+ @color/madison
+ @color/dodger_blue
+ @color/gull_grayapprox
+
+ @color/white
+ @color/white
+ @color/geyser
+
+ @color/transparent
+ @color/navy
+ @color/transparent
+ @color/madison
+ @color/navy
+ @color/gull_grayapprox
+ @color/madison
+ @color/white
+ @color/gull_grayapprox
+ @color/dodger_blue
+ @color/royal_blue
+ @color/gull_grayapprox
+
+ @color/lavender_mist
+
+ @color/slate_grey
+
+ @color/geyser
+ @color/geyser
+ @color/metallic_silver
+ @color/white
+ @color/dodger_blue
+ @color/dodger_blue
+
+ @color/bg_default
+
+ @color/bg_default
+ @color/text_color
+ @color/text_color
+ @color/geyser
+ @color/dodger_blue
+
+ @color/ghost_white
+ @color/dusk
+ @color/dusk
+
+ @color/midnight_blue2
+ @color/ghost_white
+ @color/cornflower
+
+ @color/geyser
+ @color/navy
+
+ @color/white
+ @color/dusk
+
+ @color/white
+ @color/dodger_blue
+ @color/royal_blue
+ @color/gull_grayapprox
+
+ @color/dodger_blue
+ @color/dodger_blue
+ @color/ghost_white
+ @color/dodger_blue
+ @color/navy
+ @color/dusk
+ @color/lavender_mist
+
+ @color/white
+ @color/lavender_mist
+ @color/dodger_blue
+ @color/dodger_blue
+ @color/geyser
+ @color/geyser
+ @color/dodger_blue
+
+ @color/ionos_default_text_color
+
+ @color/navy
+ @color/dodger_blue
+ @color/slate_grey
+ @color/slate_grey
+ @color/navy
+ @color/lavender_mist
+
+ @color/lavender_mist
+ @color/dodger_blue
+
+
+ @color/ghost_white
+ @color/dusk
+ @color/dusk
+
+
+ @color/ghost_white
+
+ @color/dodger_blue
+ @color/white
+
+ @color/dodger_blue
+ @color/white
+
+ @color/semitransparent_black
+
+ @color/deep_koamaru
+ @color/dusk
+ @color/marble_blue
+ @color/dusk
+
diff --git a/app/src/gplay/res/values/dimen.xml b/app/src/gplay/res/values/dimen.xml
new file mode 100644
index 000000000000..d994cff22f1c
--- /dev/null
+++ b/app/src/gplay/res/values/dimen.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ - 0.2
+ - 0.4
+ - 0.8
+
+
+ 8dp
+ 16dp
+ 24dp
+ 8dp
+ 16dp
+ 8dp
+ 8dp
+ 16dp
+ 8dp
+ 16sp
+ 14sp
+
+
+ 40dp
+ 44dp
+ 52dp
+ 32dp
+ 96dp
+ 22dp
+ 6dp
+ 24dp
+ 24dp
+
+
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values/dims.xml b/app/src/gplay/res/values/dims.xml
new file mode 100644
index 000000000000..fb6ebed93916
--- /dev/null
+++ b/app/src/gplay/res/values/dims.xml
@@ -0,0 +1,53 @@
+
+
+
+
+ 8dp
+ 56dp
+ 32dp
+ 4dp
+ 80dp
+
+ 16sp
+ 12sp
+ 24sp
+
+ 24dp
+ 24dp
+ 24dp
+ 48dp
+ 12dp
+ 12dp
+ 16dp
+ 16dp
+ 12dp
+
+ 24dp
+ 12dp
+ 12dp
+ 8dp
+ 12dp
+ 12dp
+
+ 12dp
+
+ 16dp
+
+ 32dp
+ 4dp
+ 5dp
+
+ 1dp
+ 8dp
+ 14sp
+ 16dp
+
+ 1000000dp
+
+ 1
+
diff --git a/app/src/gplay/res/values/ic_launcher_background.xml b/app/src/gplay/res/values/ic_launcher_background.xml
new file mode 100644
index 000000000000..28feb1972667
--- /dev/null
+++ b/app/src/gplay/res/values/ic_launcher_background.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ #003D8F
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values/setup.xml b/app/src/gplay/res/values/setup.xml
index 83fadc4e35d1..07d26ef17174 100644
--- a/app/src/gplay/res/values/setup.xml
+++ b/app/src/gplay/res/values/setup.xml
@@ -17,6 +17,48 @@
AIzaSyAWIyOcLafaFp8PFL61h64cy1NNZW2cU_s
nextcloud-a7dea.appspot.com
nextcloud-a7dea
+
+
+ IONOS HiDrive Next
+ com.ionos.hidrivenext
+ com.ionos.hidrivenext.provider
+ com.ionos.hidrivenext.providers.UsersAndGroupsSearchProvider
+ com.ionos.hidrivenext.providers.UsersAndGroupsSearchProvider.action.SHARE_WITH
+ com.ionos.hidrivenext.documents
+ com.ionos.hidrivenext.files
+ com.ionos.hidrivenext.providers.imageCache
+ ionos.db
+ ionos
+ ionos
+ IONOS HiDrive Next
+ Mozilla/5.0 (Android) IONOS HiDrive Next/%1$s%2$s
+ false
+
+
+ https://storage.ionos.fr/login/v2
+
+
+ false
+
+
+ true
+ false
+ false
+
+
+ false
+ true
+ true
+ true
+ true
+ true
+ true
+ https://wl.hidrive.com/easy/0132
+ https://wl.hidrive.com/easy/0192
+
+ https://wl.hidrive.com/easy/0102
+ https://wl.hidrive.com/easy/0162
+ https://wl.hidrive.com/easy/0182
diff --git a/app/src/gplay/res/values/string.xml b/app/src/gplay/res/values/string.xml
new file mode 100644
index 000000000000..c5655b2d2a4b
--- /dev/null
+++ b/app/src/gplay/res/values/string.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Welcome to the cloud storage
+ Log In
+ You need to login over browser
+ Cancel
+ Retry
+
+
+ Filter
+
+
+ Storage used
+
+
\ No newline at end of file
diff --git a/app/src/gplay/res/values/styles.xml b/app/src/gplay/res/values/styles.xml
new file mode 100644
index 000000000000..63ba1e967f10
--- /dev/null
+++ b/app/src/gplay/res/values/styles.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/gplay/res/xml/preferences.xml b/app/src/gplay/res/xml/preferences.xml
new file mode 100644
index 000000000000..16006980e441
--- /dev/null
+++ b/app/src/gplay/res/xml/preferences.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 73493014a302..6fa6305f4df1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,7 +7,8 @@
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
-->
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
@@ -130,6 +131,11 @@
+
+
@@ -283,6 +289,7 @@
android:exported="false" />
@@ -351,13 +358,19 @@
+ android:theme="@style/Theme.ownCloud.PreviewImage" />
+
+
+
+
+
' where other options is not applicable
+* */
+annotation class IonosCustomization(val value: String = "")
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/authorization_method/AuthorizationMethodActivity.kt b/app/src/main/java/com/ionos/authorization_method/AuthorizationMethodActivity.kt
new file mode 100644
index 000000000000..732965836922
--- /dev/null
+++ b/app/src/main/java/com/ionos/authorization_method/AuthorizationMethodActivity.kt
@@ -0,0 +1,43 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.authorization_method
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.owncloud.android.authentication.AuthenticatorActivity
+import com.owncloud.android.databinding.ViewAuthorizationMethodBinding
+
+class AuthorizationMethodActivity : AppCompatActivity() {
+
+ companion object {
+ @JvmStatic
+ fun createInstance(context: Context) = Intent(context, AuthorizationMethodActivity::class.java)
+ }
+
+ private val viewBinding by lazy { ViewAuthorizationMethodBinding.inflate(layoutInflater) }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(viewBinding.root)
+
+ initListeners()
+ }
+
+ private fun initListeners() {
+ viewBinding.bLogin.setOnClickListener { login() }
+ }
+
+ private fun login() {
+ val intent = Intent(this, AuthenticatorActivity::class.java).apply {
+ putExtra(AuthenticatorActivity.EXTRA_USE_PROVIDER_AS_WEBLOGIN, true)
+ }
+ startActivity(intent);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/di/StratoModule.kt b/app/src/main/java/com/ionos/di/StratoModule.kt
new file mode 100644
index 000000000000..92def864016f
--- /dev/null
+++ b/app/src/main/java/com/ionos/di/StratoModule.kt
@@ -0,0 +1,30 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.di
+
+import com.ionos.analycis.AnalyticsManager
+import com.ionos.privacy.DataProtectionActivity
+import com.ionos.analycis.FirebaseAnalyticsManager
+import com.ionos.privacy.PrivacySettingsActivity
+import com.ionos.scanbot.di.NCScanbotModule
+import dagger.Binds
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module(includes = [NCScanbotModule::class])
+abstract class StratoModule {
+
+ @ContributesAndroidInjector
+ abstract fun dataProtectionActivity(): DataProtectionActivity
+
+ @ContributesAndroidInjector
+ abstract fun privacySettingsActivity(): PrivacySettingsActivity
+
+ @Binds
+ abstract fun analyticsManager(firebaseAnalyticsManager: FirebaseAnalyticsManager): AnalyticsManager
+}
diff --git a/app/src/main/java/com/ionos/privacy/DataProtectionActivity.kt b/app/src/main/java/com/ionos/privacy/DataProtectionActivity.kt
new file mode 100644
index 000000000000..91181ff42e69
--- /dev/null
+++ b/app/src/main/java/com/ionos/privacy/DataProtectionActivity.kt
@@ -0,0 +1,148 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.privacy
+
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.text.method.LinkMovementMethod
+import androidx.activity.SystemBarStyle
+import androidx.activity.addCallback
+import androidx.activity.enableEdgeToEdge
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.core.content.ContextCompat
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import androidx.lifecycle.flowWithLifecycle
+import androidx.lifecycle.lifecycleScope
+import com.ionos.utils.context.isDarkMode
+import com.ionos.utils.text.convertAnnotatedTextToLinks
+import com.nextcloud.utils.extensions.getParcelableArgument
+import com.owncloud.android.R
+import com.owncloud.android.databinding.ActivityDataProtectionBinding
+import com.owncloud.android.ui.activity.BaseActivity
+import com.owncloud.android.ui.activity.ExternalSiteWebView
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import javax.inject.Inject
+
+class DataProtectionActivity : BaseActivity() {
+
+ @Inject
+ lateinit var viewModelFactory: DataProtectionViewModel.Factory
+
+ private val viewModel by viewModels { viewModelFactory }
+
+ private val binding by lazy { ActivityDataProtectionBinding.inflate(layoutInflater) }
+
+ private val detailPageOnBackPressedCallback by lazy {
+ onBackPressedDispatcher.addCallback(this) { viewModel.onDetailPageBackButtonClick() }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ enableEdgeToEdge(SystemBarStyle.dark(Color.TRANSPARENT), SystemBarStyle.dark(Color.TRANSPARENT))
+ super.onCreate(savedInstanceState)
+ setContentView(binding.root)
+
+ val descriptionText = getText(R.string.ionos_data_protection_description).convertAnnotatedTextToLinks(
+ linkColor = ContextCompat.getColor(this, R.color.curious_blue),
+ linkUnderline = false,
+ linkHandler = ::handleLink,
+ )
+
+ binding.overviewPage.descriptionTextView.text = descriptionText
+ binding.overviewPage.descriptionTextView.movementMethod = LinkMovementMethod.getInstance()
+
+ binding.overviewPage.agreeButton.setOnClickListener { viewModel.onAgreeButtonClick() }
+ binding.overviewPage.settingsButton.setOnClickListener { viewModel.onSettingsButtonClick() }
+ binding.detailPage.toolbar.setNavigationOnClickListener { viewModel.onDetailPageBackButtonClick() }
+ binding.detailPage.saveButton.setOnClickListener { viewModel.onSaveButtonClick() }
+ binding.detailPage.switchers.analyticsSwitch.setOnCheckedChangeListener { _, isChecked ->
+ viewModel.onAnalyticsCheckedChange(isChecked)
+ }
+
+ ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
+ val insetsType = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout()
+ val insets = windowInsets.getInsets(insetsType)
+ binding.overviewPage.root.setPadding(insets.left, insets.top, insets.right, insets.bottom)
+ binding.detailPage.root.setPadding(insets.left, insets.top, insets.right, insets.bottom)
+ WindowInsetsCompat.CONSUMED
+ }
+
+ viewModel.stateFlow
+ .flowWithLifecycle(lifecycle)
+ .onEach(::updateState)
+ .launchIn(lifecycleScope)
+ }
+
+ override fun isDefaultWindowInsetsHandlingEnabled() = false
+
+ private fun handleLink(type: String) {
+ when (type) {
+ INFORMATION_LINK -> openPrivacyPolicyScreen()
+ REJECT_LINK -> viewModel.onRejectLinkClick()
+ else -> throw IllegalArgumentException("Unknown link type: $type")
+ }
+ }
+
+ private fun openPrivacyPolicyScreen() {
+ val externalWebViewIntent = Intent(this, ExternalSiteWebView::class.java)
+ externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, getString(R.string.privacy))
+ externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_URL, getString(R.string.privacy_url))
+ externalWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_SHOW_SIDEBAR, false)
+ startActivity(externalWebViewIntent)
+ }
+
+ private fun updateState(state: DataProtectionViewModel.State) {
+ if (binding.viewSwitcher.displayedChild != state.page.index) {
+ binding.viewSwitcher.displayedChild = state.page.index
+ }
+ if (state.page == DataProtectionViewModel.Page.OVERVIEW) {
+ delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
+ setSystemBarsAppearance(false)
+ detailPageOnBackPressedCallback.isEnabled = false
+ } else {
+ delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
+ setSystemBarsAppearance(!isDarkMode())
+ detailPageOnBackPressedCallback.isEnabled = true
+ }
+ if (binding.detailPage.switchers.analyticsSwitch.isChecked != state.isAnalyticsEnabled) {
+ binding.detailPage.switchers.analyticsSwitch.isChecked = state.isAnalyticsEnabled
+ }
+ if (state.isProcessed) {
+ intent.getParcelableArgument(TARGET_SCREEN_INTENT_KEY, Intent::class.java)?.let(::startActivity)
+ finish()
+ }
+ }
+
+ private fun setSystemBarsAppearance(isLight: Boolean) {
+ val controller = WindowInsetsControllerCompat(window, window.decorView)
+ controller.isAppearanceLightStatusBars = isLight
+ controller.isAppearanceLightNavigationBars = isLight
+ }
+
+ companion object {
+ private const val TARGET_SCREEN_INTENT_KEY = "target_screen_intent"
+ private const val INFORMATION_LINK = "information_link"
+ private const val REJECT_LINK = "reject_link"
+
+ @JvmStatic
+ fun createIntent(context: Context): Intent {
+ return Intent(context, DataProtectionActivity::class.java)
+ }
+
+ @JvmStatic
+ fun createIntent(context: Context, targetScreenIntent: Intent): Intent {
+ return Intent(context, DataProtectionActivity::class.java)
+ .putExtra(TARGET_SCREEN_INTENT_KEY, targetScreenIntent)
+ }
+ }
+}
diff --git a/app/src/main/java/com/ionos/privacy/DataProtectionViewModel.kt b/app/src/main/java/com/ionos/privacy/DataProtectionViewModel.kt
new file mode 100644
index 000000000000..281561bbd54a
--- /dev/null
+++ b/app/src/main/java/com/ionos/privacy/DataProtectionViewModel.kt
@@ -0,0 +1,81 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.privacy
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.ionos.analycis.AnalyticsManager
+import com.nextcloud.client.account.UserAccountManager
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import javax.inject.Inject
+import javax.inject.Provider
+
+class DataProtectionViewModel @Inject constructor(
+ private val analyticsManager: AnalyticsManager,
+ private val privacyPreferences: PrivacyPreferences,
+ private val userAccountManager: UserAccountManager,
+) : ViewModel() {
+
+ private var _stateFlow = MutableStateFlow(createInitialState())
+ val stateFlow = _stateFlow.asStateFlow()
+
+ fun onAgreeButtonClick() {
+ save(isAnalyticsEnabled = true)
+ }
+
+ fun onRejectLinkClick() {
+ save(isAnalyticsEnabled = false)
+ }
+
+ fun onSettingsButtonClick() {
+ _stateFlow.update { it.copy(page = Page.DETAIL) }
+ }
+
+ fun onDetailPageBackButtonClick() {
+ _stateFlow.update { it.copy(page = Page.OVERVIEW) }
+ }
+
+ fun onAnalyticsCheckedChange(isChecked: Boolean) {
+ _stateFlow.update { it.copy(isAnalyticsEnabled = isChecked) }
+ }
+
+ fun onSaveButtonClick() {
+ save(stateFlow.value.isAnalyticsEnabled)
+ }
+
+ private fun save(isAnalyticsEnabled: Boolean) {
+ analyticsManager.setEnabled(isAnalyticsEnabled)
+ privacyPreferences.setAnalyticsEnabled(isAnalyticsEnabled)
+ privacyPreferences.setDataProtectionProcessed(userAccountManager.currentOwnCloudAccount?.name)
+ _stateFlow.update { it.copy(isProcessed = true) }
+ }
+
+ enum class Page(val index: Int) {
+ OVERVIEW(0),
+ DETAIL(1),
+ }
+
+ private fun createInitialState(): State = State(isAnalyticsEnabled = privacyPreferences.isAnalyticsEnabled())
+
+ data class State(
+ val page: Page = Page.OVERVIEW,
+ val isAnalyticsEnabled: Boolean = false,
+ val isProcessed: Boolean = false,
+ )
+
+ class Factory @Inject constructor(
+ private val viewModelProvider: Provider,
+ ) : ViewModelProvider.Factory {
+
+ override fun create(modelClass: Class): T {
+ return viewModelProvider.get() as T
+ }
+ }
+}
diff --git a/app/src/main/java/com/ionos/privacy/PrivacyPreferences.kt b/app/src/main/java/com/ionos/privacy/PrivacyPreferences.kt
new file mode 100644
index 000000000000..1dc35f7c7567
--- /dev/null
+++ b/app/src/main/java/com/ionos/privacy/PrivacyPreferences.kt
@@ -0,0 +1,59 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.privacy
+
+import android.content.Context
+import javax.inject.Inject
+
+class PrivacyPreferences @Inject constructor(
+ private val context: Context,
+) {
+ private val sharedPreferences by lazy { context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) }
+
+ fun isDataProtectionProcessed(accountName: String?): Boolean =
+ getAccountsWithProcessedDataProtection().contains(accountName)
+
+ fun setDataProtectionProcessed(accountName: String?) {
+ accountName?.let {
+ sharedPreferences
+ .edit()
+ .putStringSet(DATA_PROTECTION_PROCESSED_KEY, getAccountsWithProcessedDataProtection() + accountName)
+ .apply()
+ }
+ }
+
+ fun removeDataProtectionProcessed(accountName: String) {
+ mutableSetOf(*getAccountsWithProcessedDataProtection().toTypedArray())
+ .apply { remove(accountName) }
+ .let { accountsWithProcessedDataProtection ->
+ sharedPreferences
+ .edit()
+ .putStringSet(DATA_PROTECTION_PROCESSED_KEY, accountsWithProcessedDataProtection)
+ .apply()
+ }
+ }
+
+ private fun getAccountsWithProcessedDataProtection(): Set =
+ sharedPreferences
+ .getStringSet(DATA_PROTECTION_PROCESSED_KEY, emptySet())
+ ?: emptySet()
+
+ fun isAnalyticsEnabled(): Boolean {
+ return sharedPreferences.getBoolean(ANALYTICS_ENABLED_KEY, false)
+ }
+
+ fun setAnalyticsEnabled(value: Boolean) {
+ sharedPreferences.edit().putBoolean(ANALYTICS_ENABLED_KEY, value).apply()
+ }
+
+ companion object {
+ private const val FILE_NAME = "privacy_preferences"
+ private const val DATA_PROTECTION_PROCESSED_KEY = "data_protection_processed"
+ private const val ANALYTICS_ENABLED_KEY = "analytics_enabled"
+ }
+}
diff --git a/app/src/main/java/com/ionos/privacy/PrivacySettingsActivity.kt b/app/src/main/java/com/ionos/privacy/PrivacySettingsActivity.kt
new file mode 100644
index 000000000000..6c30c208ce8a
--- /dev/null
+++ b/app/src/main/java/com/ionos/privacy/PrivacySettingsActivity.kt
@@ -0,0 +1,81 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.privacy
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.lifecycle.flowWithLifecycle
+import androidx.lifecycle.lifecycleScope
+import com.owncloud.android.databinding.ActivityPrivacySettingsBinding
+import com.owncloud.android.ui.activity.BaseActivity
+import com.owncloud.android.utils.theme.ViewThemeUtils
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import javax.inject.Inject
+
+class PrivacySettingsActivity : BaseActivity() {
+
+ @Inject
+ lateinit var viewModelFactory: PrivacySettingsViewModel.Factory
+
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
+ private val viewModel by viewModels { viewModelFactory }
+
+ private val binding by lazy { ActivityPrivacySettingsBinding.inflate(layoutInflater) }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(binding.root)
+
+ viewThemeUtils.ionos.platform.themeSystemBars(this);
+
+ binding.toolbar.setNavigationOnClickListener { onBackPressedDispatcher.onBackPressed() }
+ binding.switchers.analyticsSwitch.setOnCheckedChangeListener { _, isChecked ->
+ viewModel.onAnalyticsCheckedChange(isChecked)
+ }
+
+ ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
+ val insetsType = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout()
+ val insets = windowInsets.getInsets(insetsType)
+ binding.root.setPadding(insets.left, insets.top, insets.right, insets.bottom)
+ WindowInsetsCompat.CONSUMED
+ }
+
+ viewModel.stateFlow
+ .flowWithLifecycle(lifecycle)
+ .onEach(::updateState)
+ .launchIn(lifecycleScope)
+ }
+
+ override fun isDefaultWindowInsetsHandlingEnabled() = false
+
+ override fun onStart() {
+ super.onStart()
+ viewModel.onStart()
+ }
+
+ private fun updateState(state: PrivacySettingsViewModel.State) {
+ if (binding.switchers.analyticsSwitch.isChecked != state.isAnalyticsEnabled) {
+ binding.switchers.analyticsSwitch.isChecked = state.isAnalyticsEnabled
+ }
+ }
+
+ companion object {
+
+ @JvmStatic
+ fun createIntent(context: Context): Intent {
+ return Intent(context, PrivacySettingsActivity::class.java)
+ }
+ }
+}
diff --git a/app/src/main/java/com/ionos/privacy/PrivacySettingsViewModel.kt b/app/src/main/java/com/ionos/privacy/PrivacySettingsViewModel.kt
new file mode 100644
index 000000000000..c2c5606bcaf0
--- /dev/null
+++ b/app/src/main/java/com/ionos/privacy/PrivacySettingsViewModel.kt
@@ -0,0 +1,50 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.privacy
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.ionos.analycis.AnalyticsManager
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import javax.inject.Inject
+import javax.inject.Provider
+
+class PrivacySettingsViewModel @Inject constructor(
+ private val analyticsManager: AnalyticsManager,
+ private val privacyPreferences: PrivacyPreferences,
+) : ViewModel() {
+
+ private var _stateFlow = MutableStateFlow(State())
+ val stateFlow = _stateFlow.asStateFlow()
+
+ fun onStart() {
+ val isAnalyticsEnabled = privacyPreferences.isAnalyticsEnabled()
+ _stateFlow.update { it.copy(isAnalyticsEnabled = isAnalyticsEnabled) }
+ }
+
+ fun onAnalyticsCheckedChange(isChecked: Boolean) {
+ _stateFlow.update { it.copy(isAnalyticsEnabled = isChecked) }
+ analyticsManager.setEnabled(isChecked)
+ privacyPreferences.setAnalyticsEnabled(isChecked)
+ }
+
+ data class State(
+ val isAnalyticsEnabled: Boolean = false,
+ )
+
+ class Factory @Inject constructor(
+ private val viewModelProvider: Provider,
+ ) : ViewModelProvider.Factory {
+
+ override fun create(modelClass: Class): T {
+ return viewModelProvider.get() as T
+ }
+ }
+}
diff --git a/app/src/main/java/com/ionos/scanbot/di/NCScanbotModule.kt b/app/src/main/java/com/ionos/scanbot/di/NCScanbotModule.kt
new file mode 100644
index 000000000000..9bd8d3cafe6d
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/di/NCScanbotModule.kt
@@ -0,0 +1,46 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.di
+
+import com.ionos.scanbot.image_loader.ImageLoader
+import com.ionos.scanbot.image_loading.ImageLoaderImpl
+import com.ionos.scanbot.license.LoadScanbotLicense
+import com.ionos.scanbot.license.LoadScanbotLicenseImpl
+import com.ionos.scanbot.logger.ScanbotLogger
+import com.ionos.scanbot.screens.save.SelectDirectoryContract
+import com.ionos.scanbot.upload.ScanbotUploader
+import com.ionos.scanbot.upload.SelectDirectoryContractImpl
+import com.ionos.scanbot.upload.use_case.Uploader
+import com.ionos.scanbot.util.GetLocalFreeSpace
+import com.ionos.scanbot.util.logger.Logger
+import com.ionos.scanbot.utils.GetLocalFreeSpaceImpl
+import dagger.Binds
+import dagger.Module
+
+@Module(includes = [ScanbotModule::class])
+abstract class NCScanbotModule {
+
+ @Binds
+ abstract fun bindLoadLicense(loadScanbotLicense: LoadScanbotLicenseImpl): LoadScanbotLicense
+
+ @Binds
+ abstract fun bindImageLoader(imageLoader: ImageLoaderImpl): ImageLoader
+
+ @Binds
+ abstract fun bindUploader(uploader: ScanbotUploader): Uploader
+
+ @Binds
+ abstract fun bindLogger(logger: ScanbotLogger): Logger
+
+ @Binds
+ abstract fun bindSelectDirectoryContract(contract: SelectDirectoryContractImpl): SelectDirectoryContract
+
+ @Binds
+ abstract fun bindGetLocalFreeSpaceImpl(getLocalFreeSpaceImpl: GetLocalFreeSpaceImpl): GetLocalFreeSpace
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/image_loading/ImageLoaderImpl.kt b/app/src/main/java/com/ionos/scanbot/image_loading/ImageLoaderImpl.kt
new file mode 100644
index 000000000000..59a932a196b4
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/image_loading/ImageLoaderImpl.kt
@@ -0,0 +1,22 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.image_loading
+
+import com.ionos.scanbot.image_loader.ImageLoader
+import com.ionos.scanbot.image_loader.ImageRequestBuilder
+import java.io.File
+import javax.inject.Inject
+
+class ImageLoaderImpl @Inject constructor(
+) : ImageLoader {
+
+ override fun load(file: File): ImageRequestBuilder {
+ return ImageRequestBuilderImpl(file)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/image_loading/ImageRequestBuilderImpl.kt b/app/src/main/java/com/ionos/scanbot/image_loading/ImageRequestBuilderImpl.kt
new file mode 100644
index 000000000000..26b345f12574
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/image_loading/ImageRequestBuilderImpl.kt
@@ -0,0 +1,41 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.image_loading
+
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+import com.ionos.scanbot.image_loader.ImageLoaderOptions
+import com.ionos.scanbot.image_loader.ImageRequestBuilder
+import com.ionos.scanbot.image_loader.ScaleType
+import java.io.File
+
+class ImageRequestBuilderImpl(
+ private val file: File,
+) : ImageRequestBuilder {
+
+ private var options: ImageLoaderOptions? = null
+
+ override fun options(options: ImageLoaderOptions): ImageRequestBuilder {
+ this.options = options
+ return this
+ }
+
+ override fun into(target: ImageView) {
+ Glide.with(target.context)
+ .load(file)
+ .run {
+ when (options?.scaleType) {
+ ScaleType.CENTER_CROP -> centerCrop()
+ ScaleType.CENTER_INSIDE -> fitCenter()
+ else -> this
+ }
+ }
+ .signature(ObjectKey(file.lastModified()))
+ .into(target)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/image_loading/ObjectKey.java b/app/src/main/java/com/ionos/scanbot/image_loading/ObjectKey.java
new file mode 100644
index 000000000000..de9b1fec7535
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/image_loading/ObjectKey.java
@@ -0,0 +1,49 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.image_loading;
+
+import com.bumptech.glide.load.Key;
+
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+
+import androidx.annotation.NonNull;
+
+public final class ObjectKey implements Key {
+ private static final Charset CHARSET = Charset.forName(STRING_CHARSET_NAME);
+
+ private final Object object;
+
+ public ObjectKey(@NonNull Object object) {
+ this.object = object;
+ }
+
+ @Override
+ public String toString() {
+ return "ObjectKey{" + "object=" + object + '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ObjectKey) {
+ ObjectKey other = (ObjectKey) o;
+ return object.equals(other.object);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return object.hashCode();
+ }
+
+ @Override
+ public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
+ messageDigest.update(object.toString().getBytes(CHARSET));
+ }
+}
diff --git a/app/src/main/java/com/ionos/scanbot/license/DownloadLicenseRemoteOperation.kt b/app/src/main/java/com/ionos/scanbot/license/DownloadLicenseRemoteOperation.kt
new file mode 100644
index 000000000000..3f7e8dc70476
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/license/DownloadLicenseRemoteOperation.kt
@@ -0,0 +1,59 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.license
+
+import com.owncloud.android.lib.common.OwnCloudClient
+import com.owncloud.android.lib.common.operations.RemoteOperation
+import com.owncloud.android.lib.common.operations.RemoteOperationResult
+import org.apache.commons.httpclient.methods.GetMethod
+
+class DownloadLicenseRemoteOperation(
+ private val licenseKeyUrl: String,
+) : RemoteOperation() {
+
+ var license: String? = null
+ private set
+
+ override fun run(client: OwnCloudClient?): RemoteOperationResult {
+ return try {
+ if (client == null) throw IllegalArgumentException("Client should not be null")
+
+ val getMethod = GetMethod(licenseKeyUrl)
+
+ license = downloadFile(client, getMethod)
+ RemoteOperationResult(true, getMethod)
+ } catch (e: Exception) {
+ RemoteOperationResult(e)
+ }
+ }
+
+ private fun downloadFile(
+ client: OwnCloudClient,
+ getMethod: GetMethod,
+ ): String? {
+ try {
+ val status = client.executeMethod(getMethod)
+ if (isSuccess(status)) {
+ val bytes = getMethod.responseBodyAsStream
+ .use {
+ it.readBytes()
+ }
+
+ return LicenseResponseTransformer().transform(bytes)
+ }
+ } finally {
+ getMethod.releaseConnection()
+ }
+
+ return null
+ }
+
+ private fun isSuccess(status: Int): Boolean {
+ return status == 200
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/license/LicenseResponseTransformer.kt b/app/src/main/java/com/ionos/scanbot/license/LicenseResponseTransformer.kt
new file mode 100644
index 000000000000..f262e46872bf
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/license/LicenseResponseTransformer.kt
@@ -0,0 +1,43 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.license
+
+/**
+ * User: Dima Muravyov
+ * Date: 06.02.2020
+ */
+internal class LicenseResponseTransformer {
+
+ companion object {
+ private const val SEPARATOR = "\""
+ private const val ESCAPED_NEW_LINE = "\\n"
+ private const val NEW_LINE = "\n"
+ }
+
+ fun transform(bytes: ByteArray): String? {
+ val inlinedResponse = String(bytes)
+
+ var scanbotLicenseKey = ""
+ var startIndex = inlinedResponse.indexOf(SEPARATOR)
+ while (startIndex != -1) {
+ val endIndex = inlinedResponse.indexOf(SEPARATOR, startIndex + 1)
+ if (endIndex == -1) {
+ scanbotLicenseKey = ""
+ break
+ }
+
+ scanbotLicenseKey += inlinedResponse.substring(startIndex + 1, endIndex)
+
+ startIndex = inlinedResponse.indexOf(SEPARATOR, endIndex + 1)
+ }
+
+ scanbotLicenseKey = scanbotLicenseKey.replace(ESCAPED_NEW_LINE, NEW_LINE)
+
+ return if (scanbotLicenseKey.isNotBlank()) scanbotLicenseKey else null
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/license/LoadScanbotLicenseImpl.kt b/app/src/main/java/com/ionos/scanbot/license/LoadScanbotLicenseImpl.kt
new file mode 100644
index 000000000000..f36783fe41c9
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/license/LoadScanbotLicenseImpl.kt
@@ -0,0 +1,42 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.license
+
+import android.content.Context
+import androidx.work.Constraints
+import androidx.work.ExistingWorkPolicy
+import androidx.work.NetworkType
+import androidx.work.OneTimeWorkRequest
+import androidx.work.OutOfQuotaPolicy
+import androidx.work.WorkManager
+import javax.inject.Inject
+
+class LoadScanbotLicenseImpl @Inject constructor(
+ context: Context,
+) : LoadScanbotLicense {
+
+ private val workManager by lazy { WorkManager.getInstance(context) }
+
+ override fun invoke() {
+ val request =
+ OneTimeWorkRequest.Builder(ScanbotLicenseDownloadWorker::class.java)
+ .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
+ .setConstraints(
+ Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED)
+ .build()
+ )
+ .build()
+
+ workManager.enqueueUniqueWork(
+ ScanbotLicenseDownloadWorker.SCANBOT_LICENSE_DOWNLOAD_WORKER,
+ ExistingWorkPolicy.KEEP,
+ request
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseDownloadWorker.kt b/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseDownloadWorker.kt
new file mode 100644
index 000000000000..ca85c02f274c
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseDownloadWorker.kt
@@ -0,0 +1,86 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.license
+
+import android.content.Context
+import android.content.pm.ServiceInfo
+import android.os.Build
+import androidx.work.ForegroundInfo
+import androidx.work.Worker
+import androidx.work.WorkerParameters
+import com.ionos.scanbot.initializer.TryToInitScanbotSdk
+import com.nextcloud.client.account.UserAccountManager
+import com.nextcloud.client.jobs.download.DownloadNotificationManager
+import com.owncloud.android.R
+import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
+import com.owncloud.android.utils.theme.ViewThemeUtils
+import java.security.SecureRandom
+
+class ScanbotLicenseDownloadWorker(
+ licenseUrl: String,
+ viewThemeUtils: ViewThemeUtils,
+ private val accountManager: UserAccountManager,
+ private val licenseKeyStore: LicenseKeyStore,
+ private val tryToInitScanbotSdk: TryToInitScanbotSdk,
+ private val context: Context,
+ params: WorkerParameters,
+): Worker(context, params){
+
+ companion object {
+ const val SCANBOT_LICENSE_DOWNLOAD_WORKER = "SCANBOT_LICENSE_DOWNLOAD_WORKER"
+ }
+
+ private val operation = DownloadLicenseRemoteOperation(licenseUrl)
+ private var notificationManager = DownloadNotificationManager(
+ SecureRandom().nextInt(),
+ context,
+ viewThemeUtils
+ )
+
+ override fun doWork(): Result {
+ return try {
+ val ocAccount = accountManager.user.toOwnCloudAccount()
+ val downloadClient =
+ OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context)
+
+ val result = operation.execute(downloadClient)
+
+ if (result.isSuccess) {
+ operation.license?.let {
+ licenseKeyStore.saveLicenseKey(it)
+ tryToInitScanbotSdk(it)
+ }
+ Result.success()
+ }
+ else Result.retry()
+ }catch (e: Exception){
+ Result.failure()
+ }
+ }
+
+ override fun getForegroundInfo(): ForegroundInfo {
+ notificationManager.notificationBuilder.run {
+ setProgress(100, 0, true)
+ setContentTitle(context.getString(R.string.downloader_download_in_progress_ticker))
+ }
+
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
+ ForegroundInfo(
+ notificationManager.getId(),
+ notificationManager.getNotification(),
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
+ )
+ } else{
+ ForegroundInfo(
+ notificationManager.getId(),
+ notificationManager.getNotification(),
+ )
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseJobFactory.kt b/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseJobFactory.kt
new file mode 100644
index 000000000000..b5ddc52b7892
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/license/ScanbotLicenseJobFactory.kt
@@ -0,0 +1,39 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.license
+
+import android.content.Context
+import androidx.work.WorkerParameters
+import com.ionos.scanbot.di.qualifiers.ScanbotLicenseKeyUrl
+import com.ionos.scanbot.initializer.TryToInitScanbotSdk
+import com.nextcloud.client.account.UserAccountManager
+import com.owncloud.android.utils.theme.ViewThemeUtils
+import javax.inject.Inject
+import javax.inject.Provider
+
+class ScanbotLicenseJobFactory @Inject constructor(
+ @ScanbotLicenseKeyUrl private val scanbotLicenseUrl: String,
+ private val accountManager: UserAccountManager,
+ private val licenseKeyStore: LicenseKeyStore,
+ private val tryToInitScanbotSdk: TryToInitScanbotSdk,
+ private val viewThemeUtils: Provider,
+) {
+
+ fun create(context: Context, params: WorkerParameters): ScanbotLicenseDownloadWorker {
+ return ScanbotLicenseDownloadWorker(
+ scanbotLicenseUrl,
+ viewThemeUtils.get(),
+ accountManager,
+ licenseKeyStore,
+ tryToInitScanbotSdk,
+ context,
+ params
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/logger/ScanbotLogger.kt b/app/src/main/java/com/ionos/scanbot/logger/ScanbotLogger.kt
new file mode 100644
index 000000000000..46c7a67f2de4
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/logger/ScanbotLogger.kt
@@ -0,0 +1,28 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.logger
+
+import com.ionos.scanbot.util.logger.Logger
+import javax.inject.Inject
+import com.nextcloud.client.logger.Logger as NextCloudLogger
+
+class ScanbotLogger @Inject constructor(
+ private val nextCloudLogger: NextCloudLogger
+) : Logger {
+
+ companion object {
+ private const val GLOBAL_TAG = "ScanbotModule"
+ }
+
+ override fun logE(message: String, t: Throwable?) {
+ t?.let {
+ nextCloudLogger.e(GLOBAL_TAG, message, it)
+ } ?: nextCloudLogger.e(GLOBAL_TAG, message)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/upload/ScanbotUploader.kt b/app/src/main/java/com/ionos/scanbot/upload/ScanbotUploader.kt
new file mode 100644
index 000000000000..6ddebd69a5a1
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/upload/ScanbotUploader.kt
@@ -0,0 +1,39 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.upload
+
+import com.ionos.scanbot.upload.use_case.Uploader
+import com.nextcloud.client.account.CurrentAccountProvider
+import com.nextcloud.client.jobs.upload.FileUploadHelper
+import com.nextcloud.client.jobs.upload.FileUploadWorker
+import com.owncloud.android.files.services.NameCollisionPolicy
+import com.owncloud.android.operations.UploadFileOperation
+import java.io.File
+import javax.inject.Inject
+
+class ScanbotUploader @Inject constructor(
+ private val currentAccountProvider: CurrentAccountProvider
+): Uploader {
+ override fun upload(uploadFolder: String, pageList: List) {
+ val uploadPaths = pageList.map {
+ File(uploadFolder, File(it).name).path
+ }.toTypedArray()
+
+ FileUploadHelper.instance().uploadNewFiles(
+ currentAccountProvider.user,
+ pageList.toTypedArray(),
+ uploadPaths,
+ FileUploadWorker.LOCAL_BEHAVIOUR_DELETE,
+ true,
+ UploadFileOperation.CREATED_BY_USER,
+ false,
+ false,
+ NameCollisionPolicy.RENAME
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/upload/SelectDirectoryContractImpl.kt b/app/src/main/java/com/ionos/scanbot/upload/SelectDirectoryContractImpl.kt
new file mode 100644
index 000000000000..6fa9e08699d0
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/upload/SelectDirectoryContractImpl.kt
@@ -0,0 +1,42 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.upload
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import com.ionos.scanbot.screens.save.SelectDirectoryContract
+import com.ionos.scanbot.upload.target.RemoteUploadTarget
+import com.nextcloud.utils.extensions.getParcelableArgument
+import com.owncloud.android.datamodel.OCFile
+import com.owncloud.android.ui.activity.FolderPickerActivity
+import javax.inject.Inject
+
+class SelectDirectoryContractImpl @Inject constructor(
+) : SelectDirectoryContract() {
+
+ override fun createIntent(context: Context, input: Unit): Intent {
+ return Intent(context, FolderPickerActivity::class.java)
+ .apply {
+ putExtra(FolderPickerActivity.EXTRA_ACTION, FolderPickerActivity.CHOOSE_LOCATION)
+ }
+ }
+
+ override fun parseResult(resultCode: Int, intent: Intent?): SelectDirectoryResult {
+ if (resultCode != Activity.RESULT_OK || intent == null || FolderPickerActivity.EXTRA_FOLDER == null)
+ return SelectDirectoryResult.Canceled
+
+ return intent.getParcelableArgument(FolderPickerActivity.EXTRA_FOLDER, OCFile::class.java)
+ ?.remotePath?.let {
+ SelectDirectoryResult.Success(
+ RemoteUploadTarget(it)
+ )
+ } ?: SelectDirectoryResult.Canceled
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/upload/target/RemoteUploadTarget.kt b/app/src/main/java/com/ionos/scanbot/upload/target/RemoteUploadTarget.kt
new file mode 100644
index 000000000000..4d1474a8ef7e
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/upload/target/RemoteUploadTarget.kt
@@ -0,0 +1,14 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.upload.target
+
+import com.ionos.scanbot.upload.target_provider.UploadTarget
+
+class RemoteUploadTarget(
+ override val uploadPath: String
+) : UploadTarget
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/scanbot/utils/GetLocalFreeSpaceImpl.kt b/app/src/main/java/com/ionos/scanbot/utils/GetLocalFreeSpaceImpl.kt
new file mode 100644
index 000000000000..337a612f9d04
--- /dev/null
+++ b/app/src/main/java/com/ionos/scanbot/utils/GetLocalFreeSpaceImpl.kt
@@ -0,0 +1,18 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.scanbot.utils
+
+import com.ionos.scanbot.util.GetLocalFreeSpace
+import com.owncloud.android.utils.FileStorageUtils
+import io.reactivex.Single
+import javax.inject.Inject
+
+class GetLocalFreeSpaceImpl @Inject constructor() : GetLocalFreeSpace {
+ override fun invoke(): Single =
+ Single.fromCallable { FileStorageUtils.getUsableSpace() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ionos/utils/IonosBuildHelper.kt b/app/src/main/java/com/ionos/utils/IonosBuildHelper.kt
new file mode 100644
index 000000000000..d3d966957008
--- /dev/null
+++ b/app/src/main/java/com/ionos/utils/IonosBuildHelper.kt
@@ -0,0 +1,20 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO AG.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+package com.ionos.utils
+
+import com.owncloud.android.BuildConfig
+
+object IonosBuildHelper {
+
+ private const val IONOS_APPLICATION_ID = "com.ionos.hidrivenext"
+
+ @JvmStatic
+ fun isIonosBuild(): Boolean {
+ return IONOS_APPLICATION_ID == BuildConfig.APPLICATION_ID
+ }
+}
diff --git a/app/src/main/java/com/ionos/utils/context/ContextUtils.kt b/app/src/main/java/com/ionos/utils/context/ContextUtils.kt
new file mode 100644
index 000000000000..4b68b515e863
--- /dev/null
+++ b/app/src/main/java/com/ionos/utils/context/ContextUtils.kt
@@ -0,0 +1,18 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+@file:JvmName("ContextUtils")
+
+package com.ionos.utils.context
+
+import android.content.Context
+import android.content.res.Configuration
+
+fun Context.isDarkMode(): Boolean {
+ val uiMode = resources.configuration.uiMode
+ return (uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
+}
diff --git a/app/src/main/java/com/ionos/utils/text/CharSequenceUtils.kt b/app/src/main/java/com/ionos/utils/text/CharSequenceUtils.kt
new file mode 100644
index 000000000000..c83acfa7965a
--- /dev/null
+++ b/app/src/main/java/com/ionos/utils/text/CharSequenceUtils.kt
@@ -0,0 +1,46 @@
+/*
+ * IONOS HiDrive Next - Android Client
+ *
+ * SPDX-FileCopyrightText: 2025 STRATO GmbH.
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+@file:JvmName("CharSequenceUtils")
+
+package com.ionos.utils.text
+
+import android.text.Annotation
+import android.text.SpannableString
+import android.text.Spanned
+import android.text.TextPaint
+import android.text.style.ClickableSpan
+import android.view.View
+
+fun CharSequence.convertAnnotatedTextToLinks(
+ linkColor: Int,
+ linkUnderline: Boolean,
+ linkHandler: (type: String) -> Unit,
+): SpannableString {
+ val spannableString = SpannableString(this)
+ val annotations = spannableString.getSpans(0, spannableString.length, Annotation::class.java)
+
+ annotations.forEach { annotation ->
+ val start = spannableString.getSpanStart(annotation)
+ val end = spannableString.getSpanEnd(annotation)
+
+ val clickableSpan = object : ClickableSpan() {
+ override fun updateDrawState(paint: TextPaint) {
+ paint.color = linkColor
+ paint.isUnderlineText = linkUnderline
+ }
+
+ override fun onClick(widget: View) {
+ linkHandler.invoke(annotation.value)
+ }
+ }
+
+ spannableString.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+ }
+
+ return spannableString
+}
diff --git a/app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java b/app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java
index 2bcc027631a4..4d373fbf1332 100644
--- a/app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java
+++ b/app/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java
@@ -19,6 +19,8 @@
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import com.ionos.annotation.IonosCustomization;
+import com.ionos.authorization_method.AuthorizationMethodActivity;
import com.nextcloud.client.onboarding.FirstRunActivity;
import com.nextcloud.common.NextcloudClient;
import com.nextcloud.utils.extensions.AccountExtensionsKt;
@@ -452,12 +454,13 @@ private String getAccountType() {
}
@Override
+ @IonosCustomization
public void startAccountCreation(final Activity activity) {
// skipping AuthenticatorActivity redirection when user is on Launcher or FirstRun Activity
if (activity instanceof LauncherActivity || activity instanceof FirstRunActivity) return;
- Intent intent = new Intent(context, AuthenticatorActivity.class);
+ Intent intent = AuthorizationMethodActivity.createInstance(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
diff --git a/app/src/main/java/com/nextcloud/client/di/AppComponent.java b/app/src/main/java/com/nextcloud/client/di/AppComponent.java
index 27e69184437c..41520339179a 100644
--- a/app/src/main/java/com/nextcloud/client/di/AppComponent.java
+++ b/app/src/main/java/com/nextcloud/client/di/AppComponent.java
@@ -9,6 +9,8 @@
import android.app.Application;
+import com.ionos.di.StratoModule;
+import com.ionos.scanbot.di.ScanbotComponent;
import com.nextcloud.appReview.InAppReviewModule;
import com.nextcloud.client.appinfo.AppInfoModule;
import com.nextcloud.client.database.DatabaseModule;
@@ -50,6 +52,7 @@
DatabaseModule.class,
DispatcherModule.class,
VariantModule.class,
+ StratoModule.class,
})
@Singleton
public interface AppComponent {
@@ -69,6 +72,8 @@ public interface AppComponent {
void inject(ProgressIndicator progressIndicator);
+ ScanbotComponent scanbotComponent();
+
@Component.Builder
interface Builder {
@BindsInstance
diff --git a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt
index 21d6279b9ecb..2cffe684a28f 100644
--- a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt
+++ b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt
@@ -17,6 +17,7 @@ import androidx.core.view.MenuProvider
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.di.Injectable
import com.nextcloud.client.di.ViewModelFactory
import com.nextcloud.client.logger.Logger
@@ -143,6 +144,7 @@ class DocumentScanActivity : ToolbarActivity(), Injectable {
}
}
+ @IonosCustomization
private fun showExportDialog() {
val dialogBinding = DialogScanExportTypeBinding.inflate(layoutInflater)
@@ -155,7 +157,7 @@ class DocumentScanActivity : ToolbarActivity(), Injectable {
}
.setOnCancelListener { viewModel.onExportCanceled() }
.also {
- viewThemeUtils.dialog.colorMaterialAlertDialogBackground(this@DocumentScanActivity, it)
+ viewThemeUtils.ionos.dialog.colorMaterialAlertDialogBackground(this@DocumentScanActivity, it)
}
.create()
diff --git a/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt b/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt
index 39692a56aabe..6c2241c4e474 100644
--- a/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt
+++ b/app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt
@@ -15,10 +15,12 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.content.res.AppCompatResources
+import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import com.canhub.cropper.CropImageView
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.di.Injectable
import com.nextcloud.client.jobs.upload.FileUploadHelper
import com.nextcloud.client.jobs.upload.FileUploadWorker
@@ -32,7 +34,9 @@ import com.owncloud.android.operations.UploadFileOperation
import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.MimeType
+import com.owncloud.android.utils.theme.ViewThemeUtils
import java.io.File
+import javax.inject.Inject
class EditImageActivity :
FileActivity(),
@@ -45,6 +49,9 @@ class EditImageActivity :
private lateinit var file: OCFile
private lateinit var format: Bitmap.CompressFormat
+ @Inject
+ lateinit var viewThemeUtils: ViewThemeUtils
+
companion object {
const val EXTRA_FILE = "FILE"
const val OPEN_IMAGE_EDITOR = "OPEN_IMAGE_EDITOR"
@@ -63,6 +70,7 @@ class EditImageActivity :
}
}
+ @IonosCustomization
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -81,7 +89,7 @@ class EditImageActivity :
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
- window.navigationBarColor = getColor(R.color.black)
+ viewThemeUtils.ionos.platform.themeSystemBars(this,getColor(R.color.edit_image_background))
setupCropper()
}
diff --git a/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt b/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt
index ebcb5f7dd4d3..408a13575bfc 100644
--- a/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt
+++ b/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt
@@ -17,6 +17,7 @@ import android.text.TextUtils
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.google.gson.Gson
+import com.ionos.privacy.PrivacyPreferences
import com.nextcloud.client.account.User
import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.core.Clock
@@ -58,7 +59,8 @@ class AccountRemovalWork(
private val clock: Clock,
private val eventBus: EventBus,
private val preferences: AppPreferences,
- private val syncedFolderProvider: SyncedFolderProvider
+ private val syncedFolderProvider: SyncedFolderProvider,
+ private val privacyPreferences: PrivacyPreferences,
) : Worker(context, params) {
companion object {
@@ -112,6 +114,8 @@ class AccountRemovalWork(
preferences.currentAccountName = ""
}
+ privacyPreferences.removeDataProtectionProcessed(accountName)
+
// remove all files
storageManager.removeLocalFiles(user, storageManager)
diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt
index 1a8d0df4d294..86da348fd8f4 100644
--- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt
+++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt
@@ -15,6 +15,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.work.ListenableWorker
import androidx.work.WorkerFactory
import androidx.work.WorkerParameters
+import com.ionos.privacy.PrivacyPreferences
import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.core.Clock
import com.nextcloud.client.device.DeviceInfo
@@ -32,6 +33,8 @@ import com.owncloud.android.datamodel.ArbitraryDataProvider
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.datamodel.UploadsStorageManager
import com.owncloud.android.utils.theme.ViewThemeUtils
+import com.ionos.scanbot.license.ScanbotLicenseDownloadWorker
+import com.ionos.scanbot.license.ScanbotLicenseJobFactory
import org.greenrobot.eventbus.EventBus
import javax.inject.Inject
import javax.inject.Provider
@@ -61,7 +64,9 @@ class BackgroundJobFactory @Inject constructor(
private val viewThemeUtils: Provider,
private val localBroadcastManager: Provider,
private val generatePdfUseCase: GeneratePDFUseCase,
- private val syncedFolderProvider: SyncedFolderProvider
+ private val syncedFolderProvider: SyncedFolderProvider,
+ private val scanbotLicenseJobFactory: ScanbotLicenseJobFactory,
+ private val privacyPreferences: PrivacyPreferences,
) : WorkerFactory() {
@SuppressLint("NewApi")
@@ -93,6 +98,7 @@ class BackgroundJobFactory @Inject constructor(
FilesExportWork::class -> createFilesExportWork(context, workerParameters)
FileUploadWorker::class -> createFilesUploadWorker(context, workerParameters)
FileDownloadWorker::class -> createFilesDownloadWorker(context, workerParameters)
+ ScanbotLicenseDownloadWorker::class -> scanbotLicenseJobFactory.create(context, workerParameters)
GeneratePdfFromImagesWork::class -> createPDFGenerateWork(context, workerParameters)
HealthStatusWork::class -> createHealthStatusWork(context, workerParameters)
TestJob::class -> createTestJob(context, workerParameters)
@@ -232,7 +238,8 @@ class BackgroundJobFactory @Inject constructor(
clock,
eventBus,
preferences,
- syncedFolderProvider
+ syncedFolderProvider,
+ privacyPreferences,
)
}
diff --git a/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt b/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt
index 642d22ba0fcc..9f0688af128f 100644
--- a/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt
+++ b/app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt
@@ -16,6 +16,7 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.di.ViewModelFactory
import com.owncloud.android.R
import com.owncloud.android.databinding.LogsActivityBinding
@@ -75,12 +76,12 @@ class LogsActivity : ToolbarActivity() {
}
}
+ @IonosCustomization
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.activity_logs, menu)
(menu.findItem(R.id.action_search).actionView as SearchView).apply {
setOnQueryTextListener(searchBoxListener)
- viewThemeUtils.androidx.themeToolbarSearchView(this)
}
return super.onCreateOptionsMenu(menu)
}
diff --git a/app/src/main/java/com/nextcloud/client/media/Player.kt b/app/src/main/java/com/nextcloud/client/media/Player.kt
index 8990fcdcca04..befcd7280a23 100644
--- a/app/src/main/java/com/nextcloud/client/media/Player.kt
+++ b/app/src/main/java/com/nextcloud/client/media/Player.kt
@@ -261,9 +261,7 @@ internal class Player(
}
override fun seekTo(pos: Int) {
- if (stateMachine.isInState(State.PLAYING)) {
- mediaPlayer?.seekTo(pos)
- }
+ mediaPlayer?.seekTo(pos)
}
override fun getCurrentPosition(): Int {
diff --git a/app/src/main/java/com/nextcloud/client/media/PlayerService.kt b/app/src/main/java/com/nextcloud/client/media/PlayerService.kt
index f953a799735a..1a8dc1f63839 100644
--- a/app/src/main/java/com/nextcloud/client/media/PlayerService.kt
+++ b/app/src/main/java/com/nextcloud/client/media/PlayerService.kt
@@ -7,8 +7,11 @@
package com.nextcloud.client.media
import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.Service
import android.content.Intent
+import android.content.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
+import android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
@@ -17,6 +20,7 @@ import android.widget.MediaController
import android.widget.Toast
import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.account.User
import com.nextcloud.client.network.ClientFactory
import com.nextcloud.utils.ForegroundServiceHelper
@@ -174,9 +178,14 @@ class PlayerService : Service() {
stopServiceAndRemoveNotification(file)
}
+ @IonosCustomization("clickable notification")
private fun startForeground(currentFile: OCFile) {
val ticker = String.format(getString(R.string.media_notif_ticker), getString(R.string.app_name))
val content = getString(R.string.media_state_playing, currentFile.getFileName())
+ val intent = Intent(this, PreviewMediaActivity::class.java)
+ .apply {
+ flags = FLAG_ACTIVITY_REORDER_TO_FRONT or FLAG_ACTIVITY_SINGLE_TOP
+ }
notificationBuilder.run {
setSmallIcon(R.drawable.ic_play_arrow)
@@ -184,6 +193,9 @@ class PlayerService : Service() {
setOngoing(true)
setContentTitle(ticker)
setContentText(content)
+ setContentIntent(
+ PendingIntent.getActivity(mContext, 0, intent, FLAG_IMMUTABLE)
+ )
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_MEDIA)
diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
index 75d50b9b4a2e..88d000cd0f01 100644
--- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
+++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
@@ -17,11 +17,13 @@
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
+import com.ionos.annotation.IonosCustomization;
import com.nextcloud.appReview.AppReviewShownModel;
import com.nextcloud.client.account.User;
import com.nextcloud.client.account.UserAccountManager;
import com.nextcloud.client.account.UserAccountManagerImpl;
import com.nextcloud.client.jobs.LogEntry;
+import com.owncloud.android.R;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.ArbitraryDataProviderImpl;
import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -482,14 +484,9 @@ public void setUploaderBehaviour(int uploaderBehaviour) {
* @return grid columns grid columns
*/
@Override
+ @IonosCustomization
public float getGridColumns() {
- float columns = preferences.getFloat(AUTO_PREF__GRID_COLUMNS, DEFAULT_GRID_COLUMN);
-
- if (columns < 0) {
- return DEFAULT_GRID_COLUMN;
- } else {
- return columns;
- }
+ return context.getResources().getInteger(R.integer.grid_mode_column_count);
}
/**
@@ -498,8 +495,9 @@ public float getGridColumns() {
* @param gridColumns the uploader behavior
*/
@Override
+ @IonosCustomization
public void setGridColumns(float gridColumns) {
- preferences.edit().putFloat(AUTO_PREF__GRID_COLUMNS, gridColumns).apply();
+ // Do nothing
}
@Override
diff --git a/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt b/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt
index edf674d988ba..d1b491cae307 100644
--- a/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt
+++ b/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt
@@ -20,6 +20,7 @@ import android.widget.ImageView
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.account.User
import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.di.Injectable
@@ -72,6 +73,7 @@ class ChooseAccountDialogFragment :
}
@SuppressLint("InflateParams")
+ @IonosCustomization
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
_binding = DialogChooseAccountBinding.inflate(layoutInflater)
dialogView = binding.root
@@ -79,11 +81,12 @@ class ChooseAccountDialogFragment :
val builder = MaterialAlertDialogBuilder(requireContext())
.setView(binding.root)
- viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.statusView.context, builder)
+ viewThemeUtils.ionos.dialog.colorMaterialAlertDialogBackground(binding.statusView.context, builder)
return builder.create()
}
+ @IonosCustomization("Hide account id")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
accountManager = (activity as BaseActivity).userAccountManager
@@ -104,6 +107,7 @@ class ChooseAccountDialogFragment :
binding.currentAccount.userName.text = user.toOwnCloudAccount().displayName
binding.currentAccount.ticker.visibility = View.GONE
binding.currentAccount.account.text = user.accountName
+ binding.currentAccount.account.visibility = View.GONE
// Defining user right indicator
val icon = viewThemeUtils.platform.tintPrimaryDrawable(requireContext(), R.drawable.ic_check_circle)
@@ -169,16 +173,17 @@ class ChooseAccountDialogFragment :
}
}
+ @IonosCustomization
private fun themeViews() {
viewThemeUtils.platform.themeDialogDivider(binding.separatorLine)
- viewThemeUtils.platform.themeDialog(binding.root)
+ viewThemeUtils.ionos.platform.themeDialog(binding.root)
viewThemeUtils.material.colorMaterialTextButton(binding.setStatus)
- viewThemeUtils.dialog.colorDialogMenuText(binding.setStatus)
+ viewThemeUtils.ionos.dialog.colorDialogMenuText(binding.setStatus)
viewThemeUtils.material.colorMaterialTextButton(binding.addAccount)
- viewThemeUtils.dialog.colorDialogMenuText(binding.addAccount)
+ viewThemeUtils.ionos.dialog.colorDialogMenuText(binding.addAccount)
viewThemeUtils.material.colorMaterialTextButton(binding.manageAccounts)
- viewThemeUtils.dialog.colorDialogMenuText(binding.manageAccounts)
+ viewThemeUtils.ionos.dialog.colorDialogMenuText(binding.manageAccounts)
}
private fun getAccountListItems(): List {
diff --git a/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt
index 9ea25e5caca9..60ad4a5af07b 100644
--- a/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt
+++ b/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt
@@ -30,6 +30,7 @@ import com.google.android.material.card.MaterialCardView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.client.account.User
import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.core.AsyncRunner
@@ -124,16 +125,18 @@ class SetStatusDialogFragment :
}
@SuppressLint("InflateParams")
+ @IonosCustomization
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
binding = DialogSetStatusBinding.inflate(layoutInflater)
val builder = MaterialAlertDialogBuilder(requireContext()).setView(binding.root)
- viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.statusView.context, builder)
+ viewThemeUtils.ionos.dialog.colorMaterialAlertDialogBackground(binding.statusView.context, builder)
return builder.create()
}
+ @IonosCustomization()
@SuppressLint("DefaultLocale")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -196,11 +199,11 @@ class SetStatusDialogFragment :
}
}
- viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.clearStatus)
- viewThemeUtils.material.colorMaterialButtonPrimaryTonal(binding.setStatus)
- viewThemeUtils.material.colorTextInputLayout(binding.customStatusInputContainer)
+ viewThemeUtils.ionos.material.colorMaterialButtonPrimaryBorderless(binding.clearStatus)
+ viewThemeUtils.ionos.material.colorMaterialButtonPrimaryTonal(binding.setStatus)
+ viewThemeUtils.ionos.material.colorTextInputLayout(binding.customStatusInputContainer)
- viewThemeUtils.platform.themeDialog(binding.root)
+ viewThemeUtils.ionos.platform.themeDialog(binding.root)
}
private fun updateCurrentStatusViews(it: Status) {
diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt
index 5ed6042149cf..83b093b77ff3 100644
--- a/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt
+++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt
@@ -10,49 +10,51 @@ package com.nextcloud.ui.fileactions
import androidx.annotation.DrawableRes
import androidx.annotation.IdRes
import androidx.annotation.StringRes
+import com.ionos.annotation.IonosCustomization
import com.owncloud.android.R
+@IonosCustomization("Custom icons")
enum class FileAction(@IdRes val id: Int, @StringRes val title: Int, @DrawableRes val icon: Int? = null) {
// selection
- SELECT_ALL(R.id.action_select_all_action_menu, R.string.select_all, R.drawable.ic_select_all),
- SELECT_NONE(R.id.action_deselect_all_action_menu, R.string.deselect_all, R.drawable.ic_select_none),
+ SELECT_ALL(R.id.action_select_all_action_menu, R.string.select_all, R.drawable.ic_file_action_select_all),
+ SELECT_NONE(R.id.action_deselect_all_action_menu, R.string.deselect_all, R.drawable.ic_file_action_select_none),
// generic file actions
- EDIT(R.id.action_edit, R.string.action_edit, R.drawable.ic_edit),
- SEE_DETAILS(R.id.action_see_details, R.string.actionbar_see_details, R.drawable.ic_information_outline),
- REMOVE_FILE(R.id.action_remove_file, R.string.common_remove, R.drawable.ic_delete),
+ EDIT(R.id.action_edit, R.string.action_edit, R.drawable.ic_file_action_edit),
+ SEE_DETAILS(R.id.action_see_details, R.string.actionbar_see_details, R.drawable.ic_file_action_see_details),
+ REMOVE_FILE(R.id.action_remove_file, R.string.common_remove, R.drawable.ic_file_action_remove_file),
// File moving
- RENAME_FILE(R.id.action_rename_file, R.string.common_rename, R.drawable.ic_rename),
- MOVE_OR_COPY(R.id.action_move_or_copy, R.string.actionbar_move_or_copy, R.drawable.ic_external),
+ RENAME_FILE(R.id.action_rename_file, R.string.common_rename, R.drawable.ic_file_action_rename_file),
+ MOVE_OR_COPY(R.id.action_move_or_copy, R.string.actionbar_move_or_copy, R.drawable.ic_file_action_move_or_copy),
// favorites
- FAVORITE(R.id.action_favorite, R.string.favorite, R.drawable.ic_star),
- UNSET_FAVORITE(R.id.action_unset_favorite, R.string.unset_favorite, R.drawable.ic_star_outline),
+ FAVORITE(R.id.action_favorite, R.string.favorite, R.drawable.ic_file_action_favorite),
+ UNSET_FAVORITE(R.id.action_unset_favorite, R.string.unset_favorite, R.drawable.ic_file_action_unset_favorite),
// Uploads and downloads
- DOWNLOAD_FILE(R.id.action_download_file, R.string.filedetails_download, R.drawable.ic_cloud_download),
- SYNC_FILE(R.id.action_sync_file, R.string.filedetails_sync_file, R.drawable.ic_cloud_sync_on),
- CANCEL_SYNC(R.id.action_cancel_sync, R.string.common_cancel_sync, R.drawable.ic_cloud_sync_off),
+ DOWNLOAD_FILE(R.id.action_download_file, R.string.filedetails_download, R.drawable.ic_file_action_download_file),
+ SYNC_FILE(R.id.action_sync_file, R.string.filedetails_sync_file, R.drawable.ic_file_action_sync_file),
+ CANCEL_SYNC(R.id.action_cancel_sync, R.string.common_cancel_sync, R.drawable.ic_file_action_cancel_sync),
// File sharing
- EXPORT_FILE(R.id.action_export_file, R.string.filedetails_export, R.drawable.ic_export),
- SEND_SHARE_FILE(R.id.action_send_share_file, R.string.action_send_share, R.drawable.ic_share),
- SEND_FILE(R.id.action_send_file, R.string.common_send, R.drawable.ic_share),
- OPEN_FILE_WITH(R.id.action_open_file_with, R.string.actionbar_open_with, R.drawable.ic_external),
- STREAM_MEDIA(R.id.action_stream_media, R.string.stream, R.drawable.ic_play_arrow),
- SET_AS_WALLPAPER(R.id.action_set_as_wallpaper, R.string.set_picture_as, R.drawable.ic_wallpaper),
+ EXPORT_FILE(R.id.action_export_file, R.string.filedetails_export, R.drawable.ic_file_action_export_file),
+ SEND_SHARE_FILE(R.id.action_send_share_file, R.string.action_send_share, R.drawable.ic_file_action_share_file),
+ SEND_FILE(R.id.action_send_file, R.string.common_send, R.drawable.ic_file_action_share_file),
+ OPEN_FILE_WITH(R.id.action_open_file_with, R.string.actionbar_open_with, R.drawable.ic_file_action_open_file_with),
+ STREAM_MEDIA(R.id.action_stream_media, R.string.stream, R.drawable.ic_file_action_stream_media),
+ SET_AS_WALLPAPER(R.id.action_set_as_wallpaper, R.string.set_picture_as, R.drawable.ic_file_action_set_as_wallpaper),
// Encryption
- SET_ENCRYPTED(R.id.action_encrypted, R.string.encrypted, R.drawable.ic_encrypt),
- UNSET_ENCRYPTED(R.id.action_unset_encrypted, R.string.unset_encrypted, R.drawable.ic_decrypt),
+ SET_ENCRYPTED(R.id.action_encrypted, R.string.encrypted, R.drawable.ic_file_action_set_encrypted),
+ UNSET_ENCRYPTED(R.id.action_unset_encrypted, R.string.unset_encrypted, R.drawable.ic_file_action_unset_encrypted),
// locks
- UNLOCK_FILE(R.id.action_unlock_file, R.string.unlock_file, R.drawable.ic_lock_open_white),
- LOCK_FILE(R.id.action_lock_file, R.string.lock_file, R.drawable.ic_lock),
+ UNLOCK_FILE(R.id.action_unlock_file, R.string.unlock_file, R.drawable.ic_file_action_unlock_file),
+ LOCK_FILE(R.id.action_lock_file, R.string.lock_file, R.drawable.ic_file_action_lock_file),
// Shortcuts
- PIN_TO_HOMESCREEN(R.id.action_pin_to_homescreen, R.string.pin_home, R.drawable.add_to_home_screen),
+ PIN_TO_HOMESCREEN(R.id.action_pin_to_homescreen, R.string.pin_home, R.drawable.ic_file_action_pin_to_homescreen),
// Retry for offline operation
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry);
diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt
index 1269459f2a94..c70db50f06a8 100644
--- a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt
+++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt
@@ -18,7 +18,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.IdRes
-import androidx.appcompat.content.res.AppCompatResources
import androidx.core.os.bundleOf
import androidx.core.view.isEmpty
import androidx.core.view.isVisible
@@ -29,6 +28,7 @@ import androidx.lifecycle.ViewModelProvider
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+import com.ionos.annotation.IonosCustomization
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.client.account.CurrentAccountProvider
import com.nextcloud.client.di.Injectable
@@ -94,7 +94,7 @@ class FileActionsBottomSheet : BottomSheetDialogFragment(), Injectable {
bottomSheetDialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
bottomSheetDialog.behavior.skipCollapsed = true
- viewThemeUtils.platform.colorViewBackground(binding.bottomSheet, ColorRole.SURFACE)
+ viewThemeUtils.ionos.platform.colorViewBackground(binding.bottomSheet, ColorRole.SURFACE)
return binding.root
}
@@ -145,11 +145,9 @@ class FileActionsBottomSheet : BottomSheetDialogFragment(), Injectable {
}
}
+ @IonosCustomization("Set thumbnail drawable without tint")
private fun setMultipleFilesThumbnail() {
- context?.let {
- val drawable = viewThemeUtils.platform.tintDrawable(it, R.drawable.file_multiple, ColorRole.PRIMARY)
- binding.thumbnailLayout.thumbnail.setImageDrawable(drawable)
- }
+ binding.thumbnailLayout.thumbnail.setImageResource(R.drawable.file_multiple)
}
override fun onDestroyView() {
@@ -270,6 +268,7 @@ class FileActionsBottomSheet : BottomSheetDialogFragment(), Injectable {
binding.title.text = resources.getQuantityString(R.plurals.file_list__footer__file, fileCount, fileCount)
}
+ @IonosCustomization("Set icon drawable without tint")
private fun inflateActionView(action: FileAction): View {
val itemBinding = FileActionsBottomSheetItemBinding.inflate(layoutInflater, binding.fileActionsList, false)
.apply {
@@ -278,12 +277,7 @@ class FileActionsBottomSheet : BottomSheetDialogFragment(), Injectable {
}
text.setText(action.title)
if (action.icon != null) {
- val drawable =
- viewThemeUtils.platform.tintDrawable(
- requireContext(),
- AppCompatResources.getDrawable(requireContext(), action.icon)!!
- )
- icon.setImageDrawable(drawable)
+ icon.setImageResource(action.icon)
}
}
return itemBinding.root
diff --git a/app/src/main/java/com/nmc/android/ui/LauncherActivity.kt b/app/src/main/java/com/nmc/android/ui/LauncherActivity.kt
index b39b3f812299..677b4c3a7456 100644
--- a/app/src/main/java/com/nmc/android/ui/LauncherActivity.kt
+++ b/app/src/main/java/com/nmc/android/ui/LauncherActivity.kt
@@ -16,14 +16,16 @@ import android.text.TextUtils
import android.view.View
import androidx.annotation.VisibleForTesting
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import com.ionos.annotation.IonosCustomization
+import com.ionos.privacy.DataProtectionActivity
+import com.ionos.privacy.PrivacyPreferences
+import com.nextcloud.client.account.UserAccountManager
import com.nextcloud.client.preferences.AppPreferences
-import com.nextcloud.utils.mdm.MDMConfig
import com.owncloud.android.R
import com.owncloud.android.authentication.AuthenticatorActivity
import com.owncloud.android.databinding.ActivitySplashBinding
import com.owncloud.android.ui.activity.BaseActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
-import com.owncloud.android.ui.activity.SettingsActivity
import javax.inject.Inject
class LauncherActivity : BaseActivity() {
@@ -33,6 +35,9 @@ class LauncherActivity : BaseActivity() {
@Inject
lateinit var appPreferences: AppPreferences
+ @Inject
+ lateinit var privacyPreferences: PrivacyPreferences
+
override fun onCreate(savedInstanceState: Bundle?) {
// Mandatory to call this before super method to show system launch screen for api level 31+
installSplashScreen()
@@ -46,6 +51,9 @@ class LauncherActivity : BaseActivity() {
scheduleSplashScreen()
}
+ @IonosCustomization("Remove window insets paddings")
+ override fun isDefaultWindowInsetsHandlingEnabled() = false
+
@VisibleForTesting
fun setSplashTitles(boldText: String, normalText: String) {
binding.splashScreenBold.visibility = View.VISIBLE
@@ -64,13 +72,15 @@ class LauncherActivity : BaseActivity() {
}
}
+ @IonosCustomization
private fun scheduleSplashScreen() {
Handler(Looper.getMainLooper()).postDelayed({
if (user.isPresent) {
- if (MDMConfig.enforceProtection(this) && appPreferences.lockPreference == SettingsActivity.LOCK_NONE) {
- startActivity(Intent(this, SettingsActivity::class.java))
+ val intent = Intent(this, FileDisplayActivity::class.java)
+ if (privacyPreferences.isDataProtectionProcessed(userAccountManager.currentOwnCloudAccount?.name)) {
+ startActivity(intent)
} else {
- startActivity(Intent(this, FileDisplayActivity::class.java))
+ startActivity(DataProtectionActivity.createIntent(this, intent))
}
} else {
startActivity(Intent(this, AuthenticatorActivity::class.java))
diff --git a/app/src/main/java/com/owncloud/android/MainApp.java b/app/src/main/java/com/owncloud/android/MainApp.java
index 95ffbcd0a614..a201e0e27ad7 100644
--- a/app/src/main/java/com/owncloud/android/MainApp.java
+++ b/app/src/main/java/com/owncloud/android/MainApp.java
@@ -39,6 +39,9 @@
import android.view.WindowManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.ionos.analycis.AnalyticsManager;
+import com.ionos.annotation.IonosCustomization;
+import com.ionos.privacy.PrivacyPreferences;
import com.nextcloud.appReview.InAppReviewHelper;
import com.nextcloud.client.account.User;
import com.nextcloud.client.account.UserAccountManager;
@@ -89,6 +92,9 @@
import com.owncloud.android.utils.ReceiversHelper;
import com.owncloud.android.utils.SecurityUtils;
import com.owncloud.android.utils.theme.ViewThemeUtils;
+import com.ionos.scanbot.di.ScanbotComponent;
+import com.ionos.scanbot.di.ScanbotComponentProvider;
+import com.ionos.scanbot.initializer.ScanbotInitializer;
import org.conscrypt.Conscrypt;
import org.greenrobot.eventbus.EventBus;
@@ -128,7 +134,8 @@
* Main Application of the project.
* Contains methods to build the "static" strings. These strings were before constants in different classes.
*/
-public class MainApp extends Application implements HasAndroidInjector, NetworkChangeListener {
+@IonosCustomization("ScanbotComponentProvider")
+public class MainApp extends Application implements HasAndroidInjector, NetworkChangeListener, ScanbotComponentProvider {
public static final OwnCloudVersion OUTDATED_SERVER_VERSION = NextcloudVersion.nextcloud_28;
public static final OwnCloudVersion MINIMUM_SUPPORTED_SERVER_VERSION = OwnCloudVersion.nextcloud_18;
@@ -145,6 +152,12 @@ public class MainApp extends Application implements HasAndroidInjector, NetworkC
@Inject
protected AppPreferences preferences;
+ @Inject
+ protected PrivacyPreferences privacyPreferences;
+
+ @Inject
+ protected AnalyticsManager analyticsManager;
+
@Inject
protected DispatchingAndroidInjector