diff --git a/CHANGELOG.md b/CHANGELOG.md index 3374f92..144f074 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,95 +1,3 @@ -## 3.33.0 (September 10, 2025) - -- Migrate to Glide 4 -- Performance improvements -- Fix gallery image scaling -- Bugfixes - -Minimum: NC 18 Server, Android 8.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/112 - -## 3.32.3 (August 21, 2025) - -- Bugfixes - -Minimum: NC 18 Server, Android 8.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/114 - -## 3.32.2 (July 18, 2025) - -- Resolved image blurriness issue. -- Fixed crash occurring in the conflict resolution dialog. -- Addressed crash in the upload finish receiver event handler. - -Minimum: NC 18 Server, Android 8.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/115 - -## 3.32.1 (July 14, 2025) - -- Bug fixes. - -Minimum: NC 18 Server, Android 8.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/113 - -## 3.32.0 (July 2, 2025) - -- Minimum supported Android version is 8.0. -- Scrolling performance has been increased in the media tab. -- Multi-select feature added to the media tab. -- Custom share permissions have been added. -- Bug fixes. - -Minimum: NC 18 Server, Android 8.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/107 - -## 3.31.4 (June 3, 2025) - -- Add missing auto migration - -Minimum: NC 18 Server, Android 7.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/110 - -## 3.31.3 (May 28, 2025) - -- fix simple sign up -- bugfixes -- update translations - -Minimum: NC 18 Server, Android 7.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/110 - -## 3.31.2 (May 20, 2025) - -- bring back MANAGE_EXTERNAL_STORAGE permission - -Minimum: NC 18 Server, Android 7.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/108 - -## 3.31.1 (April 3, 2025) - -- Various bug fixes and performance enhancements - -Minimum: NC 18 Server, Android 7.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/108 - -## 3.31.0 (February 25, 2025) - -- New share layout -- Various bug fixes and performance enhancements - -Minimum: NC 18 Server, Android 7.1 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/100 - ## 3.30.7 (January 6, 2025) - Fix crash of auto upload settings diff --git a/README.md b/README.md index 2e534f1..2c9f897 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ ~ SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only --> -# Only a copy of the Nextcloud Repository on GitHub - # [Nextcloud](https://nextcloud.com) Android app :iphone: [![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/android)](https://api.reuse.software/info/github.com/nextcloud/android) [![Build Status](https://drone.nextcloud.com/api/badges/nextcloud/android/status.svg)](https://drone.nextcloud.com/nextcloud/android) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/fb4cf26336774ee3a5c9adfe829c41aa)](https://app.codacy.com/gh/nextcloud/android/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Releases](https://img.shields.io/github/release/nextcloud/android.svg)](https://github.com/nextcloud/android/releases/latest) diff --git a/app/build.gradle b/app/build.gradle index 0f2854f..ba7c735 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,9 +76,9 @@ configurations.configureEach { // semantic versioning for version code def versionMajor = 3 -def versionMinor = 35 +def versionMinor = 34 def versionPatch = 0 -def versionBuild = 0 // 0-50=Alpha / 51-98=RC / 90-99=stable +def versionBuild = 90 // 0-50=Alpha / 51-98=RC / 90-99=stable def ndkEnv = new HashMap() diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty.png deleted file mode 100644 index dd1710e..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty_light_white.png deleted file mode 100644 index 77c579d..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error.png deleted file mode 100644 index 196a8e0..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error_light_white.png deleted file mode 100644 index d6e8ed7..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_loading.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_loading.png deleted file mode 100644 index a9acbd4..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_loading.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png deleted file mode 100644 index 833e68d..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_black.png deleted file mode 100644 index 3076d94..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_blue.png deleted file mode 100644 index d5c15f3..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_white.png deleted file mode 100644 index 2188909..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_black.png deleted file mode 100644 index 2acd76c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_white.png deleted file mode 100644 index c3c8cd4..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities.png deleted file mode 100644 index d2014c5..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities_light_white.png deleted file mode 100644 index 65ac34e..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png deleted file mode 100644 index a351456..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_black.png deleted file mode 100644 index 515349c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_blue.png deleted file mode 100644 index 515349c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_white.png deleted file mode 100644 index 515349c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_black.png deleted file mode 100644 index 515349c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_white.png deleted file mode 100644 index 515349c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open.png deleted file mode 100644 index 912c0b5..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_black.png deleted file mode 100644 index 290a8c1..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_blue.png deleted file mode 100644 index a8ae0ac..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_white.png deleted file mode 100644 index d1a46b9..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_black.png deleted file mode 100644 index 21ef8e7..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_white.png deleted file mode 100644 index f71a768..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.CommunityActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_shareToCircle.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_shareToCircle.png deleted file mode 100644 index b2a4b29..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_shareToCircle.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showAccounts.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showAccounts.png deleted file mode 100644 index 9652ab3..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showAccounts.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showShares.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showShares.png deleted file mode 100644 index 9e21869..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityIT_showShares.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png deleted file mode 100644 index d980721..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_black.png deleted file mode 100644 index 5cd78a4..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_blue.png deleted file mode 100644 index 038077c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_white.png deleted file mode 100644 index 170e169..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_black.png deleted file mode 100644 index ee092b4..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_white.png deleted file mode 100644 index ff64ce5..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open.png deleted file mode 100644 index a2cae83..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_black.png deleted file mode 100644 index aafd6c2..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_blue.png deleted file mode 100644 index aafd6c2..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_white.png deleted file mode 100644 index f730359..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_black.png deleted file mode 100644 index c66e6f3..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_white.png deleted file mode 100644 index f3ad464..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_showMediaThenAllFiles.png b/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_showMediaThenAllFiles.png deleted file mode 100644 index c3ad35c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_showMediaThenAllFiles.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open.png deleted file mode 100644 index bb9d810..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_black.png deleted file mode 100644 index ac2e60f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_blue.png deleted file mode 100644 index ac2e60f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_white.png deleted file mode 100644 index ac2e60f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_black.png deleted file mode 100644 index ac2e60f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_white.png deleted file mode 100644 index ac2e60f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.FirstRunActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open.png deleted file mode 100644 index a5159c8..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_black.png deleted file mode 100644 index c7f41ff..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_blue.png deleted file mode 100644 index a096daf..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_white.png deleted file mode 100644 index c7f41ff..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_black.png deleted file mode 100644 index 6da4a72..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_white.png deleted file mode 100644 index 45d083f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error.png deleted file mode 100644 index f243297..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_black.png deleted file mode 100644 index 2b2b883..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_blue.png deleted file mode 100644 index 5f6b586..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_white.png deleted file mode 100644 index 2b2b883..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_black.png deleted file mode 100644 index fab5fbc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_white.png deleted file mode 100644 index 96effe5..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open.png deleted file mode 100644 index 562481f..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer.png deleted file mode 100644 index f0934cf..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_blue.png deleted file mode 100644 index 495e6d3..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_white.png deleted file mode 100644 index 2ef4149..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_light_white.png deleted file mode 100644 index 28f34bc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_openDrawer_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_black.png deleted file mode 100644 index 2abfddc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_blue.png deleted file mode 100644 index 2abfddc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_white.png deleted file mode 100644 index 2abfddc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_black.png deleted file mode 100644 index 5539967..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_white.png deleted file mode 100644 index 5539967..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog.png deleted file mode 100644 index 272d022..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_black.png deleted file mode 100644 index 0227594..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_blue.png deleted file mode 100644 index 7c69afc..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_white.png deleted file mode 100644 index 0227594..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_black.png deleted file mode 100644 index ecbca7c..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_white.png deleted file mode 100644 index bb43b1b..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_testSyncedFolderDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png deleted file mode 100644 index 10d5bac..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_black.png deleted file mode 100644 index 5b2ff3d..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_blue.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_blue.png deleted file mode 100644 index 467ece0..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_white.png deleted file mode 100644 index f08c5db..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_black.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_black.png deleted file mode 100644 index a65362b..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_white.png b/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_white.png deleted file mode 100644 index 96e8a00..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_accounts.png b/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_accounts.png deleted file mode 100644 index f4dc216..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_accounts.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_overview.png b/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_overview.png deleted file mode 100644 index d710906..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_overview.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png b/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png deleted file mode 100644 index 668c4cd..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_roundBitmap.png b/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_roundBitmap.png deleted file mode 100644 index 0a5549b..0000000 Binary files a/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_roundBitmap.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth.png deleted file mode 100644 index d73ab84..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_black.png deleted file mode 100644 index 0d3cc82..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_blue.png deleted file mode 100644 index 02f65be..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_white.png deleted file mode 100644 index 49af02d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_black.png deleted file mode 100644 index 36b176b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_white.png deleted file mode 100644 index 123a2bb..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting.png deleted file mode 100644 index 11aa236..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_black.png deleted file mode 100644 index 45f0899..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_blue.png deleted file mode 100644 index 68de8ce..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_white.png deleted file mode 100644 index b1ef98d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_black.png deleted file mode 100644 index 3c6e2e5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_white.png deleted file mode 100644 index cef1834..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew.png deleted file mode 100644 index ce379cf..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_black.png deleted file mode 100644 index 5491867..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_blue.png deleted file mode 100644 index 595f7d7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_white.png deleted file mode 100644 index 48fb018..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_black.png deleted file mode 100644 index d9c9f27..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_white.png deleted file mode 100644 index 38af7a8..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles.png deleted file mode 100644 index fa9a10c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_black.png deleted file mode 100644 index 27fe02f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_blue.png deleted file mode 100644 index d550431..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_white.png deleted file mode 100644 index e528ebb..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_black.png deleted file mode 100644 index 21c9d22..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_white.png deleted file mode 100644 index ea036af..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference.png deleted file mode 100644 index 720e76b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_black.png deleted file mode 100644 index c33972e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_blue.png deleted file mode 100644 index da04a13..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_white.png deleted file mode 100644 index 3174fd6..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_black.png deleted file mode 100644 index 1f384ef..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_white.png deleted file mode 100644 index a42bdee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF.png deleted file mode 100644 index eadc8cd..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_black.png deleted file mode 100644 index 83a2d78..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_blue.png deleted file mode 100644 index 83a2d78..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_white.png deleted file mode 100644 index 83a2d78..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_black.png deleted file mode 100644 index 6273452..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_white.png deleted file mode 100644 index 6273452..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open.png deleted file mode 100644 index 37ca6ec..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_black.png deleted file mode 100644 index b573343..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_blue.png deleted file mode 100644 index 91f9426..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_white.png deleted file mode 100644 index a354bea..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_black.png deleted file mode 100644 index 764d74a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_white.png deleted file mode 100644 index f834799..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testChooseLocationAction.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testChooseLocationAction.png deleted file mode 100644 index e49c41b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testChooseLocationAction.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testMoveOrCopy.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testMoveOrCopy.png deleted file mode 100644 index fe3726f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_testMoveOrCopy.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open.png deleted file mode 100644 index 36cbbc4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_black.png deleted file mode 100644 index 8d45368..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_blue.png deleted file mode 100644 index d24ac4a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_white.png deleted file mode 100644 index 504ce4c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_black.png deleted file mode 100644 index 976a5b9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_white.png deleted file mode 100644 index 9c8c90f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail.png deleted file mode 100644 index df06b48..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_black.png deleted file mode 100644 index 3c9b13d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_blue.png deleted file mode 100644 index ac4ec1b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_white.png deleted file mode 100644 index 1c86ed3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_black.png deleted file mode 100644 index ab5baaa..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_white.png deleted file mode 100644 index 6b960a7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png deleted file mode 100644 index bb3975b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_black.png deleted file mode 100644 index 80a9a97..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_blue.png deleted file mode 100644 index 80a9a97..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_white.png deleted file mode 100644 index 80a9a97..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_black.png deleted file mode 100644 index 30e74ed..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_white.png deleted file mode 100644 index 30e74ed..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png deleted file mode 100644 index e2ec6b9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_black.png deleted file mode 100644 index 0e8c551..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_blue.png deleted file mode 100644 index 0e8c551..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_white.png deleted file mode 100644 index 0e8c551..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_black.png deleted file mode 100644 index 1150a3f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_white.png deleted file mode 100644 index 1150a3f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png deleted file mode 100644 index ff2419d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_black.png deleted file mode 100644 index 8fdf4c8..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_blue.png deleted file mode 100644 index 574185b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_white.png deleted file mode 100644 index f0cbda7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_black.png deleted file mode 100644 index 8da4376..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_white.png deleted file mode 100644 index 4a473e7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check.png deleted file mode 100644 index 0e9310c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_black.png deleted file mode 100644 index 0c8484f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_blue.png deleted file mode 100644 index 8402d80..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_white.png deleted file mode 100644 index c52ed23..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_black.png deleted file mode 100644 index 59c505f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_white.png deleted file mode 100644 index 21e37c9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete.png deleted file mode 100644 index cf556b7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_black.png deleted file mode 100644 index e2c6e00..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_blue.png deleted file mode 100644 index e02f1a0..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_white.png deleted file mode 100644 index bf346d3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_black.png deleted file mode 100644 index 375f9c0..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_white.png deleted file mode 100644 index 118f9cc..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request.png deleted file mode 100644 index 8ae67d6..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_black.png deleted file mode 100644 index 1b60952..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_blue.png deleted file mode 100644 index 833f1d2..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_white.png deleted file mode 100644 index b12891f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_black.png deleted file mode 100644 index 1e2e88f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_white.png deleted file mode 100644 index 96fb3fc..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_open.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_open.png deleted file mode 100644 index 1bb7b1f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_openMultiAccount.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_openMultiAccount.png deleted file mode 100644 index 4af8e9a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.ReceiveExternalFilesActivityIT_openMultiAccount.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_localFolderPickerMode.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_localFolderPickerMode.png deleted file mode 100644 index a029978..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_localFolderPickerMode.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_noneSelected.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_noneSelected.png deleted file mode 100644 index 3e5fbdf..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_noneSelected.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_open.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_open.png deleted file mode 100644 index 4e1d996..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_open.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail.png deleted file mode 100644 index 3335880..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_black.png deleted file mode 100644 index 619404b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_blue.png deleted file mode 100644 index 3d9088c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_white.png deleted file mode 100644 index 5aebab5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_black.png deleted file mode 100644 index 7477c8f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_white.png deleted file mode 100644 index 8c8eeb6..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog.png deleted file mode 100644 index de21099..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled.png deleted file mode 100644 index 0f0607c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_black.png deleted file mode 100644 index 0e49dae..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_blue.png deleted file mode 100644 index 0e49dae..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_white.png deleted file mode 100644 index 0e49dae..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_black.png deleted file mode 100644 index 35c6f84..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_white.png deleted file mode 100644 index 35c6f84..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away.png deleted file mode 100644 index 971dd17..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_black.png deleted file mode 100644 index 380eb47..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_blue.png deleted file mode 100644 index 380eb47..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_white.png deleted file mode 100644 index 380eb47..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_black.png deleted file mode 100644 index e91bc31..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_white.png deleted file mode 100644 index e91bc31..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_black.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_blue.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_white.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd.png deleted file mode 100644 index 4ce6435..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_black.png deleted file mode 100644 index 0176b9c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_blue.png deleted file mode 100644 index 0176b9c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_white.png deleted file mode 100644 index 0176b9c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_black.png deleted file mode 100644 index 8eaf607..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_white.png deleted file mode 100644 index 8eaf607..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun.png deleted file mode 100644 index 6e5ea2a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_black.png deleted file mode 100644 index 414ccad..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_blue.png deleted file mode 100644 index 414ccad..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_white.png deleted file mode 100644 index 414ccad..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_black.png deleted file mode 100644 index bc93f99..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_white.png deleted file mode 100644 index bc93f99..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_black.png deleted file mode 100644 index c4699f1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_white.png deleted file mode 100644 index c4699f1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline.png deleted file mode 100644 index de21099..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_black.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_blue.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_white.png deleted file mode 100644 index eefb1ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_black.png deleted file mode 100644 index c4699f1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_white.png deleted file mode 100644 index c4699f1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online.png deleted file mode 100644 index f66a7ee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_black.png deleted file mode 100644 index 05a0e82..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_blue.png deleted file mode 100644 index 05a0e82..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_white.png deleted file mode 100644 index 05a0e82..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_black.png deleted file mode 100644 index 7cbb6f5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_white.png deleted file mode 100644 index 7cbb6f5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet.png deleted file mode 100644 index 0b64a27..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_black.png deleted file mode 100644 index dfd1273..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_blue.png deleted file mode 100644 index dfd1273..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_white.png deleted file mode 100644 index dfd1273..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_black.png deleted file mode 100644 index 9a2628d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_white.png deleted file mode 100644 index 9a2628d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithOneAction.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithOneAction.png deleted file mode 100644 index 3977140..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithOneAction.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeAction.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeAction.png deleted file mode 100644 index 1ffb0f9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeAction.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeActionRTL.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeActionRTL.png deleted file mode 100644 index 365aed3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithThreeActionRTL.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithTwoAction.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithTwoAction.png deleted file mode 100644 index e9fd77f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testConfirmationDialogWithTwoAction.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testEnforcedPasswordDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testEnforcedPasswordDialog.png deleted file mode 100644 index 815f93d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testEnforcedPasswordDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testFileActionsBottomSheet.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testFileActionsBottomSheet.png deleted file mode 100644 index 72d4ba3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testFileActionsBottomSheet.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog.png deleted file mode 100644 index 237dcd1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_black.png deleted file mode 100644 index a05c4b4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_blue.png deleted file mode 100644 index a05c4b4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_white.png deleted file mode 100644 index a05c4b4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_black.png deleted file mode 100644 index 36dba67..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_white.png deleted file mode 100644 index 36dba67..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testLoadingDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog.png deleted file mode 100644 index d4dfd20..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_black.png deleted file mode 100644 index b0a6aa0..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_blue.png deleted file mode 100644 index 2e29eb1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_white.png deleted file mode 100644 index 2e29eb1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_black.png deleted file mode 100644 index 81853f2..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_white.png deleted file mode 100644 index 8847cef..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testNewFolderDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testOptionalPasswordDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testOptionalPasswordDialog.png deleted file mode 100644 index 69859a4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testOptionalPasswordDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testProfileBottomSheet.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testProfileBottomSheet.png deleted file mode 100644 index 1c57c3c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testProfileBottomSheet.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png deleted file mode 100644 index cce676c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_black.png deleted file mode 100644 index 996d430..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_blue.png deleted file mode 100644 index 996d430..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_white.png deleted file mode 100644 index 996d430..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_black.png deleted file mode 100644 index 4b98224..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_white.png deleted file mode 100644 index 4b98224..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFileDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog.png deleted file mode 100644 index 5e73170..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_black.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_blue.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_white.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_black.png deleted file mode 100644 index ae3c101..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_white.png deleted file mode 100644 index ae3c101..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFilesDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog.png deleted file mode 100644 index 9a367f2..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_black.png deleted file mode 100644 index 2b7e033..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_blue.png deleted file mode 100644 index 2b7e033..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_white.png deleted file mode 100644 index 2b7e033..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_black.png deleted file mode 100644 index ab0580e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_white.png deleted file mode 100644 index ab0580e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFolderDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog.png deleted file mode 100644 index 5e73170..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_black.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_blue.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_white.png deleted file mode 100644 index 5e81324..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_black.png deleted file mode 100644 index ae3c101..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_white.png deleted file mode 100644 index ae3c101..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRemoveFoldersDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog.png deleted file mode 100644 index 18f8e02..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_black.png deleted file mode 100644 index 4c6f318..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_blue.png deleted file mode 100644 index 225ffb0..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_white.png deleted file mode 100644 index 225ffb0..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_black.png deleted file mode 100644 index 1472223..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_white.png deleted file mode 100644 index 8d93463..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testRenameFileDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testSslUntrustedCertDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testSslUntrustedCertDialog.png deleted file mode 100644 index 655039e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testSslUntrustedCertDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testStoragePermissionDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testStoragePermissionDialog.png deleted file mode 100644 index c0b1971..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testStoragePermissionDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testAccountChooserDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testAccountChooserDialog.png deleted file mode 100644 index cbab280..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testAccountChooserDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testLoadingDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testLoadingDialog.png deleted file mode 100644 index 4a35c42..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testLoadingDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testNewFolderDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testNewFolderDialog.png deleted file mode 100644 index 441d947..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testNewFolderDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFileDialog.png deleted file mode 100644 index b8dedb7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFileDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFilesDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFilesDialog.png deleted file mode 100644 index acadc28..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFilesDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFolderDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFolderDialog.png deleted file mode 100644 index 6ca0936..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFolderDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFoldersDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFoldersDialog.png deleted file mode 100644 index acadc28..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRemoveFoldersDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRenameFileDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRenameFileDialog.png deleted file mode 100644 index 2e517af..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentTest_testRenameFileDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialogDifferentTypes_Screenshot.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialogDifferentTypes_Screenshot.png deleted file mode 100644 index f8d7757..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialogDifferentTypes_Screenshot.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_Screenshot.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_Screenshot.png deleted file mode 100644 index f8d7757..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_Screenshot.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_black.png deleted file mode 100644 index aa423a9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_blue.png deleted file mode 100644 index aa423a9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_white.png deleted file mode 100644 index aa423a9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_black.png deleted file mode 100644 index 41c7ad9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_white.png deleted file mode 100644 index 41c7ad9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog.png deleted file mode 100644 index 188f61c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_black.png deleted file mode 100644 index 472466e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_blue.png deleted file mode 100644 index 472466e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_white.png deleted file mode 100644 index 562136a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_black.png deleted file mode 100644 index d5bf6d8..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_white.png deleted file mode 100644 index 17f6105..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error.png deleted file mode 100644 index 2ced2a1..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_black.png deleted file mode 100644 index 3fcc14f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_blue.png deleted file mode 100644 index 3fcc14f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_white.png deleted file mode 100644 index 631137e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_black.png deleted file mode 100644 index 4c97474..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_white.png deleted file mode 100644 index d79cc4e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic.png deleted file mode 100644 index 10c94a3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_black.png deleted file mode 100644 index 951f517..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_blue.png deleted file mode 100644 index 4ee10a4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_white.png deleted file mode 100644 index 2b62362..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_black.png deleted file mode 100644 index f97fa92..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_white.png deleted file mode 100644 index f97e270..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_showMnemonic_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFile.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFile.png deleted file mode 100644 index 4f32978..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFile.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFolder.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFolder.png deleted file mode 100644 index 1257bde..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest_showNotEnoughSpaceDialogForFolder.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars.png deleted file mode 100644 index df3df20..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus.png deleted file mode 100644 index c8ab612..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_black.png deleted file mode 100644 index 3df457c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_blue.png deleted file mode 100644 index 3df457c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_white.png deleted file mode 100644 index 3df457c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_black.png deleted file mode 100644 index c8ab612..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_white.png deleted file mode 100644 index c8ab612..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatarsWithStatus_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_black.png deleted file mode 100644 index 12c02d5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_blue.png deleted file mode 100644 index 12c02d5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_white.png deleted file mode 100644 index 12c02d5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_black.png deleted file mode 100644 index ace71f3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_white.png deleted file mode 100644 index ace71f3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarAndContactsList.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarAndContactsList.png deleted file mode 100644 index 84625b4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarAndContactsList.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarList.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarList.png deleted file mode 100644 index 568024b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showCalendarList.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showContactList.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showContactList.png deleted file mode 100644 index d9a3848..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showContactList.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showLoading.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showLoading.png deleted file mode 100644 index eadc8cd..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.BackupListFragmentIT_showLoading.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading.png deleted file mode 100644 index 6384489..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_black.png deleted file mode 100644 index 9741dfe..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_blue.png deleted file mode 100644 index 9741dfe..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_white.png deleted file mode 100644 index 9741dfe..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_black.png deleted file mode 100644 index 6384489..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_white.png deleted file mode 100644 index 6384489..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.ContactListFragmentIT_showContactListFragmentLoading_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities.png deleted file mode 100644 index 73192a7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError.png deleted file mode 100644 index 2b6b39e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_black.png deleted file mode 100644 index 3df384b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_blue.png deleted file mode 100644 index a380ae5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_white.png deleted file mode 100644 index 9111644..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_black.png deleted file mode 100644 index fc67ca4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_white.png deleted file mode 100644 index 6143341..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone.png deleted file mode 100644 index 7befbd3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_black.png deleted file mode 100644 index e16a498..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_blue.png deleted file mode 100644 index 296f881..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_white.png deleted file mode 100644 index f1f1e98..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_black.png deleted file mode 100644 index 93e06ca..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_white.png deleted file mode 100644 index 9d05bfa..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_black.png deleted file mode 100644 index 2f3abdf..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_blue.png deleted file mode 100644 index 8175a2e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_white.png deleted file mode 100644 index 913e56f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_black.png deleted file mode 100644 index 0dde55a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_white.png deleted file mode 100644 index a939b68..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing.png deleted file mode 100644 index 04a448a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_black.png deleted file mode 100644 index 742fc58..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_blue.png deleted file mode 100644 index cd34ffd..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_white.png deleted file mode 100644 index 8240f95..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_black.png deleted file mode 100644 index 34038df..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_white.png deleted file mode 100644 index 96a7707..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png deleted file mode 100644 index a95c5c6..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png deleted file mode 100644 index 555209f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png deleted file mode 100644 index 9295a4e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_black.png deleted file mode 100644 index 2cce494..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_blue.png deleted file mode 100644 index 2cce494..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_white.png deleted file mode 100644 index 2cce494..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_black.png deleted file mode 100644 index d006278..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_white.png deleted file mode 100644 index d006278..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailDetailsFragment.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailDetailsFragment.png deleted file mode 100644 index 6f4fd28..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailDetailsFragment.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment.png deleted file mode 100644 index 30e9b93..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_black.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_blue.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_white.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_black.png deleted file mode 100644 index d0e3d8e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_white.png deleted file mode 100644 index d0e3d8e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes.png deleted file mode 100644 index 21818eb..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_black.png deleted file mode 100644 index b9012ab..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_blue.png deleted file mode 100644 index b9012ab..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_white.png deleted file mode 100644 index f686f0e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_black.png deleted file mode 100644 index 4406098..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_white.png deleted file mode 100644 index 29262d8..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone.png deleted file mode 100644 index 9345a24..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_black.png deleted file mode 100644 index b2e952b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_blue.png deleted file mode 100644 index b2e952b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_white.png deleted file mode 100644 index b2e952b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_black.png deleted file mode 100644 index f792909..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_white.png deleted file mode 100644 index f792909..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileNone_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed.png deleted file mode 100644 index 40f2398..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_black.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_blue.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_white.png deleted file mode 100644 index 2811150..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_black.png deleted file mode 100644 index d0e3d8e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_white.png deleted file mode 100644 index d0e3d8e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileResharingNotAllowed_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_allShareTypes.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_allShareTypes.png deleted file mode 100644 index c9634d7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_allShareTypes.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_none.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_none.png deleted file mode 100644 index eed7aa4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_none.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_resharing_not_allowed.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_resharing_not_allowed.png deleted file mode 100644 index 7423f57..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listShares_file_resharing_not_allowed.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_publicLink_optionMenu.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_publicLink_optionMenu.png deleted file mode 100644 index eed7aa4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_publicLink_optionMenu.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showEmpty.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showEmpty.png deleted file mode 100644 index 587ec2f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showEmpty.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showGallery.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showGallery.png deleted file mode 100644 index 7998931..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GalleryFragmentIT_showGallery.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showEmpty.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showEmpty.png deleted file mode 100644 index a4a82a3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showEmpty.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolder.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolder.png deleted file mode 100644 index 12f3388..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolder.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolders.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolders.png deleted file mode 100644 index cdc2a72..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.GroupfolderListFragmentIT_showGroupfolders.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png deleted file mode 100644 index 5f325fe..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png deleted file mode 100644 index a4fa4f5..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png deleted file mode 100644 index ed15490..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png deleted file mode 100644 index afd2879..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png deleted file mode 100644 index b912411..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_black.png deleted file mode 100644 index 9833a7a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_blue.png deleted file mode 100644 index 9833a7a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_white.png deleted file mode 100644 index 9833a7a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_black.png deleted file mode 100644 index 745ac5c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_white.png deleted file mode 100644 index 745ac5c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png deleted file mode 100644 index 6befb0a..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showOneFile.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showOneFile.png deleted file mode 100644 index 696d50e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showOneFile.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace.png deleted file mode 100644 index 5579f8b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_black.png deleted file mode 100644 index 0b9524f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_blue.png deleted file mode 100644 index 0b9524f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_white.png deleted file mode 100644 index 0b9524f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_black.png deleted file mode 100644 index 9abc237..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_white.png deleted file mode 100644 index 9abc237..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png deleted file mode 100644 index 9082d3e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_black.png deleted file mode 100644 index 153ed95..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_blue.png deleted file mode 100644 index 153ed95..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_white.png deleted file mode 100644 index 05cb3b2..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_black.png deleted file mode 100644 index 435df38..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_white.png deleted file mode 100644 index 26cbbe2..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.SharedListFragmentIT_showSharedFiles.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.SharedListFragmentIT_showSharedFiles.png deleted file mode 100644 index 37662fd..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.SharedListFragmentIT_showSharedFiles.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewBitmapScreenshotIT_showBitmap.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewBitmapScreenshotIT_showBitmap.png deleted file mode 100644 index f159bac..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewBitmapScreenshotIT_showBitmap.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage.png deleted file mode 100644 index 4b4233d..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage_dark_blue.png deleted file mode 100644 index 5de752f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_corruptImage_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage.png deleted file mode 100644 index 85b58a4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage_dark_blue.png deleted file mode 100644 index 5de752f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewImageFragmentIT_validImage_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displayJavaSnippetFile.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displayJavaSnippetFile.png deleted file mode 100644 index 4b8e5ba..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displayJavaSnippetFile.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displaySimpleTextFile.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displaySimpleTextFile.png deleted file mode 100644 index bba71fe..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.PreviewTextFileFragmentTest_displaySimpleTextFile.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.pdf.PreviewPdfFragmentScreenshotIT_showPdf.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.pdf.PreviewPdfFragmentScreenshotIT_showPdf.png deleted file mode 100644 index 7a7493c..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.preview.pdf.PreviewPdfFragmentScreenshotIT_showPdf.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_differentUser.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_differentUser.png deleted file mode 100644 index dc7e979..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_differentUser.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty.png deleted file mode 100644 index 12c7db3..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_black.png deleted file mode 100644 index 8931fa7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_blue.png deleted file mode 100644 index 8931fa7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_white.png deleted file mode 100644 index 8931fa7..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_black.png deleted file mode 100644 index 13f8a3f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_white.png deleted file mode 100644 index 13f8a3f..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error.png deleted file mode 100644 index dc7e979..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_black.png deleted file mode 100644 index 5fb0762..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_blue.png deleted file mode 100644 index 5fb0762..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_white.png deleted file mode 100644 index 5fb0762..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_black.png deleted file mode 100644 index d781f06..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_white.png deleted file mode 100644 index d781f06..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files.png deleted file mode 100644 index e07bb83..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_black.png deleted file mode 100644 index b882319..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_blue.png deleted file mode 100644 index 3e3356e..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_white.png deleted file mode 100644 index 8ff7b49..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_black.png deleted file mode 100644 index d9975f4..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_white.png deleted file mode 100644 index d1e4cee..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading.png deleted file mode 100644 index b59f361..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_black.png deleted file mode 100644 index 58ac9df..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_blue.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_blue.png deleted file mode 100644 index 58ac9df..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_blue.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_white.png deleted file mode 100644 index 58ac9df..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_dark_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_black.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_black.png deleted file mode 100644 index ee2a02b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_black.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_white.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_white.png deleted file mode 100644 index ee2a02b..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_loading_light_white.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_normalUser.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_normalUser.png deleted file mode 100644 index cf104f9..0000000 Binary files a/app/screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_normalUser.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/richworkspaces_dark.png b/app/screenshots/gplay/debug/richworkspaces_dark.png deleted file mode 100644 index 5a30083..0000000 Binary files a/app/screenshots/gplay/debug/richworkspaces_dark.png and /dev/null differ diff --git a/app/screenshots/gplay/debug/richworkspaces_light.png b/app/screenshots/gplay/debug/richworkspaces_light.png deleted file mode 100644 index 9ebdf08..0000000 Binary files a/app/screenshots/gplay/debug/richworkspaces_light.png and /dev/null differ diff --git a/app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.java b/app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.java deleted file mode 100644 index 2fbf002..0000000 --- a/app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.nextcloud.client; - -import android.app.Activity; - -import com.nextcloud.test.GrantStoragePermissionRule; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.ui.activity.CommunityActivity; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestRule; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - - -public class CommunityActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(CommunityActivity.class, - true, - false); - - @Rule - public final TestRule permissionRule = GrantStoragePermissionRule.grant(); - - @Test - @ScreenshotTest - public void open() { - Activity sut = activityRule.launchActivity(null); - - screenshot(sut); - } -} diff --git a/app/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java b/app/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java deleted file mode 100644 index b025a25..0000000 --- a/app/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.nextcloud.client; - -import android.app.Activity; - -import com.nextcloud.client.onboarding.FirstRunActivity; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -public class FirstRunActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(FirstRunActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void open() { - Activity sut = activityRule.launchActivity(null); - - screenshot(sut); - } - -} diff --git a/app/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java b/app/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java deleted file mode 100644 index ba43a43..0000000 --- a/app/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.nextcloud.client; - -import android.app.Activity; -import android.content.Intent; - -import com.nextcloud.client.preferences.SubFolderRule; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.databinding.SyncedFoldersLayoutBinding; -import com.owncloud.android.datamodel.MediaFolderType; -import com.owncloud.android.datamodel.SyncedFolder; -import com.owncloud.android.datamodel.SyncedFolderDisplayItem; -import com.owncloud.android.ui.activity.SyncedFoldersActivity; -import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import java.util.Objects; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - - -public class SyncedFoldersActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(SyncedFoldersActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void open() { - SyncedFoldersActivity activity = activityRule.launchActivity(null); - activity.adapter.clear(); - SyncedFoldersLayoutBinding sut = activity.binding; - shortSleep(); - screenshot(sut.emptyList.emptyListView); - } - - @Test - @ScreenshotTest - public void testSyncedFolderDialog() { - SyncedFolderDisplayItem item = new SyncedFolderDisplayItem(1, - "/sdcard/DCIM/", - "/InstantUpload/", - true, - false, - false, - true, - "test@https://nextcloud.localhost", - 0, - 0, - true, - 1000, - "Name", - MediaFolderType.IMAGE, - false, - SubFolderRule.YEAR_MONTH, - false, - SyncedFolder.NOT_SCANNED_YET); - SyncedFolderPreferencesDialogFragment sut = SyncedFolderPreferencesDialogFragment.newInstance(item, 0); - - Intent intent = new Intent(targetContext, SyncedFoldersActivity.class); - SyncedFoldersActivity activity = activityRule.launchActivity(intent); - - sut.show(activity.getSupportFragmentManager(), ""); - - getInstrumentation().waitForIdleSync(); - shortSleep(); - - screenshot(Objects.requireNonNull(sut.requireDialog().getWindow()).getDecorView()); - } -} diff --git a/app/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java b/app/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java deleted file mode 100644 index c8415b0..0000000 --- a/app/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.nextcloud.client; - -import com.owncloud.android.AbstractIT; -import com.owncloud.android.ui.activity.UploadListActivity; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - - -public class UploadListActivityActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(UploadListActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void openDrawer() { - super.openDrawer(activityRule); - } -} diff --git a/app/src/androidTest/java/com/nextcloud/ui/SetStatusDialogFragmentIT.kt b/app/src/androidTest/java/com/nextcloud/ui/SetStatusDialogFragmentIT.kt deleted file mode 100644 index 4a75751..0000000 --- a/app/src/androidTest/java/com/nextcloud/ui/SetStatusDialogFragmentIT.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.nextcloud.ui - -import androidx.test.espresso.intent.rule.IntentsTestRule -import com.owncloud.android.AbstractIT -import com.owncloud.android.lib.resources.users.ClearAt -import com.owncloud.android.lib.resources.users.PredefinedStatus -import com.owncloud.android.lib.resources.users.Status -import com.owncloud.android.lib.resources.users.StatusType -import com.owncloud.android.ui.activity.FileDisplayActivity -import org.junit.Rule -import org.junit.Test - -class SetStatusDialogFragmentIT : AbstractIT() { - @get:Rule - var activityRule = IntentsTestRule(FileDisplayActivity::class.java, true, false) - - @Test - fun open() { - val sut = SetStatusDialogFragment.newInstance(user, Status(StatusType.DND, "Working hard…", "🤖", -1)) - val activity = activityRule.launchActivity(null) - - sut.show(activity.supportFragmentManager, "") - - val predefinedStatus: ArrayList = arrayListOf( - PredefinedStatus("meeting", "📅", "In a meeting", ClearAt("period", "3600")), - PredefinedStatus("commuting", "🚌", "Commuting", ClearAt("period", "1800")), - PredefinedStatus("remote-work", "🏡", "Working remotely", ClearAt("end-of", "day")), - PredefinedStatus("sick-leave", "🤒", "Out sick", ClearAt("end-of", "day")), - PredefinedStatus("vacationing", "🌴", "Vacationing", null) - ) - - shortSleep() - - activity.runOnUiThread { sut.setPredefinedStatus(predefinedStatus) } - - longSleep() - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ScreenshotsIT.java b/app/src/androidTest/java/com/owncloud/android/ScreenshotsIT.java deleted file mode 100644 index f7b95f9..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ScreenshotsIT.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Tobias Kaminsky - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android; - -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.operations.CreateFolderOperation; -import com.owncloud.android.operations.common.SyncOperation; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.activity.SettingsActivity; -import com.owncloud.android.ui.activity.SyncedFoldersActivity; - -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import androidx.test.core.app.ActivityScenario; -import androidx.test.espresso.action.ViewActions; -import androidx.test.espresso.contrib.DrawerActions; -import androidx.test.espresso.contrib.RecyclerViewActions; -import androidx.test.espresso.matcher.PreferenceMatchers; -import androidx.test.filters.LargeTest; -import tools.fastlane.screengrab.Screengrab; -import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; -import tools.fastlane.screengrab.locale.LocaleTestRule; - -import static androidx.test.espresso.Espresso.onData; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.Espresso.pressBack; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.core.AnyOf.anyOf; -import static org.junit.Assert.assertTrue; - -@LargeTest -@RunWith(JUnit4.class) -public class ScreenshotsIT extends AbstractOnServerIT { - @ClassRule - public static final LocaleTestRule localeTestRule = new LocaleTestRule(); - - @BeforeClass - public static void beforeScreenshot() { - Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); - } - - @Test - public void gridViewScreenshot() { - ActivityScenario.launch(FileDisplayActivity.class); - - onView(anyOf(withText(R.string.action_switch_grid_view), withId(R.id.switch_grid_view_button))).perform(click()); - - shortSleep(); - - Screengrab.screenshot("01_gridView"); - - onView(anyOf(withText(R.string.action_switch_list_view), withId(R.id.switch_grid_view_button))).perform(click()); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void listViewScreenshot() { - String path = "/Camera/"; - - // folder does not exist yet - if (getStorageManager().getFileByEncryptedRemotePath(path) == null) { - SyncOperation syncOp = new CreateFolderOperation(path, user, targetContext, getStorageManager()); - RemoteOperationResult result = syncOp.execute(client); - - assertTrue(result.isSuccess()); - } - - ActivityScenario.launch(FileDisplayActivity.class); - - // go into work folder - onView(withId(R.id.list_root)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); - - Screengrab.screenshot("02_listView"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void drawerScreenshot() { - ActivityScenario.launch(FileDisplayActivity.class); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); - - Screengrab.screenshot("03_drawer"); - - onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void multipleAccountsScreenshot() { - ActivityScenario.launch(FileDisplayActivity.class); - - onView(withId(R.id.switch_account_button)).perform(click()); - - Screengrab.screenshot("04_accounts"); - - pressBack(); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void autoUploadScreenshot() { - ActivityScenario.launch(SyncedFoldersActivity.class); - - Screengrab.screenshot("05_autoUpload"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } - - @Test - public void davdroidScreenshot() { - ActivityScenario.launch(SettingsActivity.class); - - onData(PreferenceMatchers.withTitle(R.string.prefs_category_more)).perform(ViewActions.scrollTo()); - - shortSleep(); - - Screengrab.screenshot("06_davdroid"); - - Assert.assertTrue(true); // if we reach this, everything is ok - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/files/services/LegacyFileUploaderIT.kt b/app/src/androidTest/java/com/owncloud/android/files/services/LegacyFileUploaderIT.kt deleted file mode 100644 index e8cc664..0000000 --- a/app/src/androidTest/java/com/owncloud/android/files/services/LegacyFileUploaderIT.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.files.services - -class LegacyFileUploaderIT : FileUploaderIT() diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/ConflictsResolveActivityIT.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/ConflictsResolveActivityIT.java deleted file mode 100644 index 4ac55e6..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/ConflictsResolveActivityIT.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.content.Intent; - -import com.nextcloud.client.account.UserAccountManagerImpl; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.OCUpload; -import com.owncloud.android.ui.dialog.ConflictsResolveDialog; -import com.owncloud.android.utils.FileStorageUtils; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; - -import java.util.Objects; - -import androidx.fragment.app.DialogFragment; -import androidx.test.espresso.intent.rule.IntentsTestRule; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertEquals; - -public class ConflictsResolveActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = - new IntentsTestRule<>(ConflictsResolveActivity.class, true, false); - private boolean returnCode; - - @Test - @ScreenshotTest - public void screenshotTextFiles() { - OCFile newFile = new OCFile("/newFile.txt"); - newFile.setFileLength(56000); - newFile.setModificationTimestamp(1522019340); - newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); - - OCFile existingFile = new OCFile("/newFile.txt"); - existingFile.setFileLength(1024000); - existingFile.setModificationTimestamp(1582019340); - - FileDataStorageManager storageManager = new FileDataStorageManager(user, targetContext.getContentResolver()); - storageManager.saveNewFile(existingFile); - - Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); - intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); - - ConflictsResolveActivity sut = activityRule.launchActivity(intent); - - ConflictsResolveDialog dialog = ConflictsResolveDialog.newInstance(existingFile, - newFile, - UserAccountManagerImpl - .fromContext(targetContext) - .getUser() - ); - dialog.showDialog(sut); - - getInstrumentation().waitForIdleSync(); - - shortSleep(); - shortSleep(); - shortSleep(); - shortSleep(); - - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - } - -// @Test - // @ScreenshotTest // todo run without real server -// public void screenshotImages() throws IOException { -// FileDataStorageManager storageManager = new FileDataStorageManager(user, -// targetContext.getContentResolver()); -// -// OCFile newFile = new OCFile("/newFile.txt"); -// newFile.setFileLength(56000); -// newFile.setModificationTimestamp(1522019340); -// newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); -// -// File image = getFile("image.jpg"); -// -// assertTrue(new UploadFileRemoteOperation(image.getAbsolutePath(), -// "/image.jpg", -// "image/jpg", -// "10000000").execute(client).isSuccess()); -// -// assertTrue(new RefreshFolderOperation(storageManager.getFileByPath("/"), -// System.currentTimeMillis(), -// false, -// true, -// storageManager, -// user.toPlatformAccount(), -// targetContext -// ).execute(client).isSuccess()); -// -// OCFile existingFile = storageManager.getFileByPath("/image.jpg"); -// -// Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); -// intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); -// intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); -// -// ConflictsResolveActivity sut = activityRule.launchActivity(intent); -// -// ConflictsResolveDialog.OnConflictDecisionMadeListener listener = decision -> { -// -// }; -// -// ConflictsResolveDialog dialog = ConflictsResolveDialog.newInstance(existingFile, -// newFile, -// UserAccountManagerImpl -// .fromContext(targetContext) -// .getUser() -// ); -// dialog.showDialog(sut); -// dialog.listener = listener; -// -// getInstrumentation().waitForIdleSync(); -// shortSleep(); -// -// screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); -// } - - @Test - public void cancel() { - returnCode = false; - - OCUpload newUpload = new OCUpload(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt", - "/newFile.txt", - user.getAccountName()); - - OCFile existingFile = new OCFile("/newFile.txt"); - existingFile.setFileLength(1024000); - existingFile.setModificationTimestamp(1582019340); - - OCFile newFile = new OCFile("/newFile.txt"); - newFile.setFileLength(56000); - newFile.setModificationTimestamp(1522019340); - newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); - - FileDataStorageManager storageManager = new FileDataStorageManager(user, targetContext.getContentResolver()); - storageManager.saveNewFile(existingFile); - - Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); - intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.getUploadId()); - - ConflictsResolveActivity sut = activityRule.launchActivity(intent); - - sut.listener = decision -> { - assertEquals(decision, ConflictsResolveDialog.Decision.CANCEL); - returnCode = true; - }; - - getInstrumentation().waitForIdleSync(); - shortSleep(); - - onView(withText("Cancel")).perform(click()); - - assertTrue(returnCode); - } - - @Test - @ScreenshotTest - public void keepExisting() { - returnCode = false; - - OCUpload newUpload = new OCUpload(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt", - "/newFile.txt", - user.getAccountName()); - - OCFile existingFile = new OCFile("/newFile.txt"); - existingFile.setFileLength(1024000); - existingFile.setModificationTimestamp(1582019340); - - OCFile newFile = new OCFile("/newFile.txt"); - newFile.setFileLength(56000); - newFile.setModificationTimestamp(1522019340); - newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); - - FileDataStorageManager storageManager = new FileDataStorageManager(user, targetContext.getContentResolver()); - storageManager.saveNewFile(existingFile); - - Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); - intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.getUploadId()); - - ConflictsResolveActivity sut = activityRule.launchActivity(intent); - - sut.listener = decision -> { - assertEquals(decision, ConflictsResolveDialog.Decision.KEEP_SERVER); - returnCode = true; - }; - - getInstrumentation().waitForIdleSync(); - - onView(withId(R.id.existing_checkbox)).perform(click()); - - DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog"); - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - - onView(withText("OK")).perform(click()); - - assertTrue(returnCode); - } - - @Test - @ScreenshotTest - public void keepNew() { - returnCode = false; - - OCUpload newUpload = new OCUpload(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt", - "/newFile.txt", - user.getAccountName()); - - OCFile existingFile = new OCFile("/newFile.txt"); - existingFile.setFileLength(1024000); - existingFile.setModificationTimestamp(1582019340); - existingFile.setRemoteId("00000123abc"); - - OCFile newFile = new OCFile("/newFile.txt"); - newFile.setFileLength(56000); - newFile.setModificationTimestamp(1522019340); - newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); - - FileDataStorageManager storageManager = new FileDataStorageManager(user, targetContext.getContentResolver()); - storageManager.saveNewFile(existingFile); - - Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); - intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.getUploadId()); - - ConflictsResolveActivity sut = activityRule.launchActivity(intent); - - sut.listener = decision -> { - assertEquals(decision, ConflictsResolveDialog.Decision.KEEP_LOCAL); - returnCode = true; - }; - - getInstrumentation().waitForIdleSync(); - - onView(withId(R.id.new_checkbox)).perform(click()); - - DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog"); - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - - onView(withText("OK")).perform(click()); - - assertTrue(returnCode); - } - - @Test - @ScreenshotTest - public void keepBoth() { - returnCode = false; - - OCUpload newUpload = new OCUpload(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt", - "/newFile.txt", - user.getAccountName()); - - OCFile existingFile = new OCFile("/newFile.txt"); - existingFile.setFileLength(1024000); - existingFile.setModificationTimestamp(1582019340); - - OCFile newFile = new OCFile("/newFile.txt"); - newFile.setFileLength(56000); - newFile.setModificationTimestamp(1522019340); - newFile.setStoragePath(FileStorageUtils.getSavePath(user.getAccountName()) + "/nonEmpty.txt"); - - FileDataStorageManager storageManager = new FileDataStorageManager(user, targetContext.getContentResolver()); - storageManager.saveNewFile(existingFile); - - Intent intent = new Intent(targetContext, ConflictsResolveActivity.class); - intent.putExtra(ConflictsResolveActivity.EXTRA_FILE, newFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_EXISTING_FILE, existingFile); - intent.putExtra(ConflictsResolveActivity.EXTRA_CONFLICT_UPLOAD_ID, newUpload.getUploadId()); - - ConflictsResolveActivity sut = activityRule.launchActivity(intent); - - sut.listener = decision -> { - assertEquals(decision, ConflictsResolveDialog.Decision.KEEP_BOTH); - returnCode = true; - }; - - getInstrumentation().waitForIdleSync(); - - onView(withId(R.id.existing_checkbox)).perform(click()); - onView(withId(R.id.new_checkbox)).perform(click()); - - DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog"); - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - - onView(withText("OK")).perform(click()); - - assertTrue(returnCode); - } - - @After - public void after() { - getStorageManager().deleteAllFiles(); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java deleted file mode 100644 index d4473bc..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.net.Uri; -import android.os.Bundle; - -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.account.UserAccountManagerImpl; -import com.nextcloud.test.RetryTestRule; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.accounts.AccountUtils; - -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.anyOf; -import static org.junit.Assert.assertEquals; - -public class DrawerActivityIT extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(FileDisplayActivity.class, - true, - false); - - @Rule - public final RetryTestRule retryTestRule = new RetryTestRule(); - - private static Account account1; - private static User user1; - private static Account account2; - private static String account2Name; - private static String account2DisplayName; - - @BeforeClass - public static void beforeClass() { - Bundle arguments = androidx.test.platform.app.InstrumentationRegistry.getArguments(); - Uri baseUrl = Uri.parse(arguments.getString("TEST_SERVER_URL")); - - AccountManager platformAccountManager = AccountManager.get(targetContext); - UserAccountManager userAccountManager = UserAccountManagerImpl.fromContext(targetContext); - - for (Account account : platformAccountManager.getAccounts()) { - platformAccountManager.removeAccountExplicitly(account); - } - - String loginName = "user1"; - String password = "user1"; - - Account temp = new Account(loginName + "@" + baseUrl, MainApp.getAccountType(targetContext)); - platformAccountManager.addAccountExplicitly(temp, password, null); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, - Integer.toString(UserAccountManager.ACCOUNT_VERSION)); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_VERSION, "14.0.0.0"); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, baseUrl.toString()); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, loginName); // same as userId - - account1 = userAccountManager.getAccountByName(loginName + "@" + baseUrl); - user1 = userAccountManager.getUser(account1.name).orElseThrow(IllegalAccessError::new); - - loginName = "user2"; - password = "user2"; - - temp = new Account(loginName + "@" + baseUrl, MainApp.getAccountType(targetContext)); - platformAccountManager.addAccountExplicitly(temp, password, null); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, - Integer.toString(UserAccountManager.ACCOUNT_VERSION)); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_VERSION, "14.0.0.0"); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, baseUrl.toString()); - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, loginName); // same as userId - - account2 = userAccountManager.getAccountByName(loginName + "@" + baseUrl); - account2Name = loginName + "@" + baseUrl; - account2DisplayName = "User Two@" + baseUrl; - } - - @Test - public void switchAccountViaAccountList() { - FileDisplayActivity sut = activityRule.launchActivity(null); - - sut.setUser(user1); - - assertEquals(account1, sut.getUser().get().toPlatformAccount()); - - onView(withId(R.id.switch_account_button)).perform(click()); - - onView(anyOf(withText(account2Name), withText(account2DisplayName))).perform(click()); - - waitForIdleSync(); - - assertEquals(account2, sut.getUser().get().toPlatformAccount()); - - onView(withId(R.id.switch_account_button)).perform(click()); - onView(withText(account1.name)).perform(click()); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java deleted file mode 100644 index fa29777..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019 Kilian Périsset - * SPDX-FileCopyrightText: 2019 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.content.Intent; - -import com.owncloud.android.AbstractIT; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.rule.ActivityTestRule; - -@RunWith(AndroidJUnit4.class) -//@LargeTest -public class FolderPickerActivityIT extends AbstractIT { - @Rule - public ActivityTestRule activityRule = - new ActivityTestRule<>(FolderPickerActivity.class); - - @Test - public void getActivityFile() { - // Arrange - FolderPickerActivity targetActivity = activityRule.getActivity(); - OCFile origin = new OCFile("/test/file.test"); - origin.setRemotePath("/remotePath/test"); - - // Act - targetActivity.setFile(origin); - OCFile target = targetActivity.getFile(); - - // Assert - Assert.assertEquals(origin, target); - } - - @Test - public void getParentFolder_isNotRootFolder() { - // Arrange - FolderPickerActivity targetActivity = activityRule.getActivity(); - OCFile origin = new OCFile("/test/"); - origin.setFileId(1); - origin.setRemotePath("/test/"); - origin.setStoragePath("/test/"); - origin.setFolder(); - - // Act - targetActivity.setFile(origin); - OCFile target = targetActivity.getCurrentFolder(); - - // Assert - Assert.assertEquals(origin, target); - } - - @Test - public void getParentFolder_isRootFolder() { - // Arrange - FolderPickerActivity targetActivity = activityRule.getActivity(); - OCFile origin = new OCFile("/"); - origin.setFileId(1); - origin.setRemotePath("/"); - origin.setStoragePath("/"); - origin.setFolder(); - - // Act - targetActivity.setFile(origin); - OCFile target = targetActivity.getCurrentFolder(); - - // Assert - Assert.assertEquals(origin, target); - } - - @Test - public void nullFile() { - // Arrange - FolderPickerActivity targetActivity = activityRule.getActivity(); - OCFile rootFolder = targetActivity.getStorageManager().getFileByPath(OCFile.ROOT_PATH); - - // Act - targetActivity.setFile(null); - OCFile target = targetActivity.getCurrentFolder(); - - // Assert - Assert.assertEquals(rootFolder, target); - } - - @Test - public void getParentFolder() { - // Arrange - FolderPickerActivity targetActivity = activityRule.getActivity(); - OCFile origin = new OCFile("/test/file.test"); - origin.setRemotePath("/test/file.test"); - - OCFile target = new OCFile("/test/"); - - // Act - targetActivity.setFile(origin); - - // Assert - Assert.assertEquals(origin, target); - } - - @Test - @ScreenshotTest - public void open() { - FolderPickerActivity sut = activityRule.getActivity(); - OCFile origin = new OCFile("/test/file.txt"); - sut.setFile(origin); - - sut.runOnUiThread(() -> { - sut.findViewById(R.id.folder_picker_btn_copy).requestFocus(); - }); - waitForIdleSync(); - screenshot(sut); - } - - @Test - @ScreenshotTest - public void testMoveOrCopy() { - Intent intent = new Intent(); - FolderPickerActivity targetActivity = activityRule.launchActivity(intent); - - waitForIdleSync(); - screenshot(targetActivity); - } - - @Test - @ScreenshotTest - public void testChooseLocationAction() { - Intent intent = new Intent(); - intent.putExtra(FolderPickerActivity.EXTRA_ACTION, FolderPickerActivity.CHOOSE_LOCATION); - FolderPickerActivity targetActivity = activityRule.launchActivity(intent); - - waitForIdleSync(); - screenshot(targetActivity); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java deleted file mode 100644 index c06c7cc..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.app.Activity; - -import com.nextcloud.client.account.User; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.lib.common.Quota; -import com.owncloud.android.lib.common.UserInfo; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import java.util.ArrayList; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -public class ManageAccountsActivityIT extends AbstractIT { - @Rule - public IntentsTestRule activityRule = new IntentsTestRule<>(ManageAccountsActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void open() { - Activity sut = activityRule.launchActivity(null); - - shortSleep(); - - screenshot(sut); - } - - @Test - @ScreenshotTest - public void userInfoDetail() { - ManageAccountsActivity sut = activityRule.launchActivity(null); - - User user = sut.accountManager.getUser(); - - UserInfo userInfo = new UserInfo("test", - true, - "Test User", - "test@nextcloud.com", - "+49 123 456", - "Address 123, Berlin", - "https://www.nextcloud.com", - "https://twitter.com/Nextclouders", - new Quota(), - new ArrayList<>()); - - sut.showUser(user, userInfo); - - shortSleep(); - shortSleep(); - - screenshot(getCurrentActivity()); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/UserInfoActivityIT.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/UserInfoActivityIT.java deleted file mode 100644 index 46ff6b3..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/UserInfoActivityIT.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.content.Intent; - -import com.owncloud.android.AbstractIT; -import com.owncloud.android.lib.common.UserInfo; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -public class UserInfoActivityIT extends AbstractIT { - @Rule - public IntentsTestRule activityRule = new IntentsTestRule<>(UserInfoActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void fullUserInfoDetail() { - final Intent intent = new Intent(targetContext, UserInfoActivity.class); - intent.putExtra(UserInfoActivity.KEY_ACCOUNT, user); - UserInfo userInfo = new UserInfo("test", - true, - "Firstname Familyname", - "oss@rocks.com", - "+49 7613 672 255", - "Awesome Place Av.", - "https://www.nextcloud.com", - "nextclouders", - null, - null - ); - intent.putExtra(UserInfoActivity.KEY_USER_DATA, userInfo); - UserInfoActivity sut = activityRule.launchActivity(intent); - - shortSleep(); - shortSleep(); - - screenshot(sut); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java deleted file mode 100644 index c7e6472..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java +++ /dev/null @@ -1,630 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.Intent; -import android.net.http.SslCertificate; -import android.net.http.SslError; -import android.os.Looper; -import android.view.View; -import android.view.ViewGroup; -import android.webkit.SslErrorHandler; -import android.widget.TextView; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.gson.Gson; -import com.nextcloud.android.common.ui.color.ColorUtil; -import com.nextcloud.android.common.ui.theme.MaterialSchemes; -import com.nextcloud.android.common.ui.theme.MaterialSchemesImpl; -import com.nextcloud.android.lib.resources.profile.Action; -import com.nextcloud.android.lib.resources.profile.HoverCard; -import com.nextcloud.client.account.RegisteredUser; -import com.nextcloud.client.account.Server; -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.device.DeviceInfo; -import com.nextcloud.client.documentscan.AppScanOptionalFeature; -import com.nextcloud.ui.ChooseAccountDialogFragment; -import com.nextcloud.ui.fileactions.FileActionsBottomSheet; -import com.nextcloud.utils.EditorUtils; -import com.owncloud.android.AbstractIT; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.ArbitraryDataProvider; -import com.owncloud.android.datamodel.ArbitraryDataProviderImpl; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.Creator; -import com.owncloud.android.lib.common.DirectEditing; -import com.owncloud.android.lib.common.Editor; -import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.accounts.AccountTypeUtils; -import com.owncloud.android.lib.common.accounts.AccountUtils; -import com.owncloud.android.lib.resources.status.CapabilityBooleanType; -import com.owncloud.android.lib.resources.status.OCCapability; -import com.owncloud.android.lib.resources.status.OwnCloudVersion; -import com.owncloud.android.lib.resources.users.Status; -import com.owncloud.android.lib.resources.users.StatusType; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.fragment.OCFileListBottomSheetActions; -import com.owncloud.android.ui.fragment.OCFileListBottomSheetDialog; -import com.owncloud.android.ui.fragment.ProfileBottomSheetDialog; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.ScreenshotTest; -import com.owncloud.android.utils.theme.CapabilityUtils; -import com.owncloud.android.utils.theme.MaterialSchemesProvider; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mockito; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import androidx.activity.result.contract.ActivityResultContract; -import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; -import androidx.test.espresso.intent.rule.IntentsTestRule; -import kotlin.Unit; - -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - -public class DialogFragmentIT extends AbstractIT { - - private final String SERVER_URL = "https://nextcloud.localhost"; - - @Rule public IntentsTestRule activityRule = - new IntentsTestRule<>(FileDisplayActivity.class, true, false); - - private FileDisplayActivity getFileDisplayActivity() { - Intent intent = new Intent(targetContext, FileDisplayActivity.class); - return activityRule.launchActivity(intent); - } - - - @After - public void quitLooperIfNeeded() { - if (Looper.myLooper() != null) { - Looper.myLooper().quitSafely(); - } - } - - @Test - @ScreenshotTest - public void testRenameFileDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(new OCFile("/Test/"), - new OCFile("/")); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testLoadingDialog() { - LoadingDialog dialog = LoadingDialog.newInstance("Wait…"); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testConfirmationDialogWithOneAction() { - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, -1, -1); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testConfirmationDialogWithTwoAction() { - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, -1); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testConfirmationDialogWithThreeAction() { - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[]{}, R.string.filedetails_sync_file, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testConfirmationDialogWithThreeActionRTL() { - enableRTL(); - - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_list_empty_text_auto_upload, new String[] { }, -1, R.string.common_ok, R.string.common_cancel, R.string.common_confirm); - showDialog(dialog); - - resetLocale(); - } - - @Test - @ScreenshotTest - public void testRemoveFileDialog() { - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(new OCFile("/Test.md")); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testRemoveFilesDialog() { - ArrayList toDelete = new ArrayList<>(); - toDelete.add(new OCFile("/Test.md")); - toDelete.add(new OCFile("/Document.odt")); - - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(toDelete); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testRemoveFolderDialog() { - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(new OCFile("/Folder/")); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testRemoveFoldersDialog() { - ArrayList toDelete = new ArrayList<>(); - toDelete.add(new OCFile("/Folder/")); - toDelete.add(new OCFile("/Documents/")); - - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(toDelete); - showDialog(dialog); - } - - @Test - @ScreenshotTest - public void testNewFolderDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - CreateFolderDialogFragment sut = CreateFolderDialogFragment.newInstance(new OCFile("/")); - showDialog(sut); - } - - @Test - @ScreenshotTest - public void testEnforcedPasswordDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - SharePasswordDialogFragment sut = SharePasswordDialogFragment.newInstance(new OCFile("/"), true, false); - showDialog(sut); - } - - @Test - @ScreenshotTest - public void testOptionalPasswordDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - SharePasswordDialogFragment sut = SharePasswordDialogFragment.newInstance(new OCFile("/"), true, true); - showDialog(sut); - } - - @Test - @ScreenshotTest - public void testAccountChooserDialog() throws AccountUtils.AccountNotFoundException { - FileDisplayActivity activity = getFileDisplayActivity(); - UserAccountManager userAccountManager = activity.getUserAccountManager(); - AccountManager accountManager = AccountManager.get(targetContext); - for (Account account : accountManager.getAccountsByType(MainApp.getAccountType(targetContext))) { - accountManager.removeAccountExplicitly(account); - } - - Account newAccount = new Account("test@https://nextcloud.localhost", MainApp.getAccountType(targetContext)); - accountManager.addAccountExplicitly(newAccount, "password", null); - accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_OC_BASE_URL, SERVER_URL); - accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_USER_ID, "test"); - accountManager.setAuthToken(newAccount, AccountTypeUtils.getAuthTokenTypePass(newAccount.type), "password"); - User newUser = userAccountManager.getUser(newAccount.name).orElseThrow(RuntimeException::new); - userAccountManager.setCurrentOwnCloudAccount(newAccount.name); - - Account newAccount2 = new Account("user1@nextcloud.localhost", MainApp.getAccountType(targetContext)); - accountManager.addAccountExplicitly(newAccount2, "password", null); - accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_OC_BASE_URL, SERVER_URL); - accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_USER_ID, "user1"); - accountManager.setUserData(newAccount2, AccountUtils.Constants.KEY_OC_VERSION, "20.0.0"); - accountManager.setAuthToken(newAccount2, AccountTypeUtils.getAuthTokenTypePass(newAccount.type), "password"); - - FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(newUser, - targetContext.getContentResolver()); - - OCCapability capability = new OCCapability(); - capability.setUserStatus(CapabilityBooleanType.TRUE); - capability.setUserStatusSupportsEmoji(CapabilityBooleanType.TRUE); - fileDataStorageManager.saveCapabilities(capability); - - ChooseAccountDialogFragment sut = - ChooseAccountDialogFragment.newInstance(new RegisteredUser(newAccount, - new OwnCloudAccount(newAccount, targetContext), - new Server(URI.create(SERVER_URL), - OwnCloudVersion.nextcloud_20))); - showDialog(activity, sut); - - activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.DND, - "Busy fixing 🐛…", - "", - -1), - targetContext)); - waitForIdleSync(); - shortSleep(); - screenshot(sut, "dnd"); - - activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.ONLINE, - "", - "", - -1), - targetContext)); - waitForIdleSync(); - shortSleep(); - screenshot(sut, "online"); - - activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.ONLINE, - "Let's have some fun", - "🎉", - -1), - targetContext)); - waitForIdleSync(); - shortSleep(); - screenshot(sut, "fun"); - - activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.OFFLINE, "", "", -1), targetContext)); - waitForIdleSync(); - shortSleep(); - screenshot(sut, "offline"); - - activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.AWAY, "Vacation", "🌴", -1), targetContext)); - waitForIdleSync(); - shortSleep(); - screenshot(sut, "away"); - } - - @Test - @ScreenshotTest - public void testAccountChooserDialogWithStatusDisabled() throws AccountUtils.AccountNotFoundException { - AccountManager accountManager = AccountManager.get(targetContext); - for (Account account : accountManager.getAccounts()) { - accountManager.removeAccountExplicitly(account); - } - - Account newAccount = new Account("test@https://nextcloud.localhost", MainApp.getAccountType(targetContext)); - accountManager.addAccountExplicitly(newAccount, "password", null); - accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_OC_BASE_URL, SERVER_URL); - accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_USER_ID, "test"); - accountManager.setAuthToken(newAccount, AccountTypeUtils.getAuthTokenTypePass(newAccount.type), "password"); - - FileDisplayActivity fda = getFileDisplayActivity(); - UserAccountManager userAccountManager = fda.getUserAccountManager(); - User newUser = userAccountManager.getUser(newAccount.name).get(); - FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(newUser, - targetContext.getContentResolver()); - - OCCapability capability = new OCCapability(); - capability.setUserStatus(CapabilityBooleanType.FALSE); - - fileDataStorageManager.saveCapabilities(capability); - - ChooseAccountDialogFragment sut = - ChooseAccountDialogFragment.newInstance(new RegisteredUser(newAccount, - new OwnCloudAccount(newAccount, targetContext), - new Server(URI.create(SERVER_URL), - OwnCloudVersion.nextcloud_20))); - showDialog(fda, sut); - } - - @Test - @ScreenshotTest - public void testBottomSheet() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - OCFileListBottomSheetActions action = new OCFileListBottomSheetActions() { - - @Override - public void createFolder() { - - } - - @Override - public void uploadFromApp() { - - } - - @Override - public void uploadFiles() { - - } - - @Override - public void newDocument() { - - } - - @Override - public void newSpreadsheet() { - - } - - @Override - public void newPresentation() { - - } - - @Override - public void directCameraUpload() { - - } - - @Override - public void scanDocUpload() { - - } - - @Override - public void showTemplate(Creator creator, String headline) { - - } - - @Override - public void createRichWorkspace() { - - } - }; - - DeviceInfo info = new DeviceInfo(); - OCFile ocFile = new OCFile("/test.md"); - - Intent intent = new Intent(targetContext, FileDisplayActivity.class); - FileDisplayActivity fda = activityRule.launchActivity(intent); - - // add direct editing info - DirectEditing directEditing = new DirectEditing(); - directEditing.getCreators().put("1", new Creator("1", - "text", - "text file", - ".md", - "application/octet-stream", - false)); - - directEditing.getCreators().put("2", new Creator("2", - "md", - "markdown file", - ".md", - "application/octet-stream", - false)); - - directEditing.getEditors().put("text", - new Editor("1", - "Text", - new ArrayList<>(Collections.singletonList(MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN)), - new ArrayList<>(), - false)); - - String json = new Gson().toJson(directEditing); - - new ArbitraryDataProviderImpl(targetContext).storeOrUpdateKeyValue(user.getAccountName(), - ArbitraryDataProvider.DIRECT_EDITING, - json); - - // activate templates - OCCapability capability = fda.getCapabilities(); - capability.setRichDocuments(CapabilityBooleanType.TRUE); - capability.setRichDocumentsDirectEditing(CapabilityBooleanType.TRUE); - capability.setRichDocumentsTemplatesAvailable(CapabilityBooleanType.TRUE); - capability.setAccountName(user.getAccountName()); - - CapabilityUtils.updateCapability(capability); - - AppScanOptionalFeature appScanOptionalFeature = new AppScanOptionalFeature() { - @NonNull - @Override - public ActivityResultContract getScanContract() { - throw new UnsupportedOperationException("Document scan is not available"); - } - }; - - MaterialSchemesProvider materialSchemesProvider = new MaterialSchemesProvider() { - @NonNull - @Override - public MaterialSchemes getMaterialSchemesForUser(@NonNull User user) { - return null; - } - - @NonNull - @Override - public MaterialSchemes getMaterialSchemesForCapability(@NonNull OCCapability capability) { - return null; - } - - @NonNull - @Override - public MaterialSchemes getMaterialSchemesForCurrentUser() { - return new MaterialSchemesImpl(R.color.primary, false); - } - - @NonNull - @Override - public MaterialSchemes getDefaultMaterialSchemes() { - return null; - } - - @NonNull - @Override - public MaterialSchemes getMaterialSchemesForPrimaryBackground() { - return null; - } - }; - - ViewThemeUtils viewThemeUtils = new ViewThemeUtils(materialSchemesProvider.getMaterialSchemesForCurrentUser(), - new ColorUtil(targetContext)); - - EditorUtils editorUtils = new EditorUtils(new ArbitraryDataProviderImpl(targetContext)); - - - OCFileListBottomSheetDialog sut = new OCFileListBottomSheetDialog(fda, - action, - info, - user, - ocFile, - fda.themeUtils, - viewThemeUtils, - editorUtils, - appScanOptionalFeature); - - fda.runOnUiThread(sut::show); - - getInstrumentation().waitForIdleSync(); - shortSleep(); - - sut.getBehavior().setState(BottomSheetBehavior.STATE_EXPANDED); - - getInstrumentation().waitForIdleSync(); - shortSleep(); - - ViewGroup viewGroup = sut.getWindow().findViewById(android.R.id.content); - hideCursors(viewGroup); - - screenshot(Objects.requireNonNull(sut.getWindow()).getDecorView()); - - } - - @Test - @ScreenshotTest - public void testProfileBottomSheet() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - // Fixed values for HoverCard - List actions = new ArrayList<>(); - actions.add(new Action("profile", - "View profile", - "https://dev.nextcloud.com/core/img/actions/profile.svg", - "https://dev.nextcloud.com/index.php/u/christine")); - actions.add(new Action("core", - "christine.scott@nextcloud.com", - "https://dev.nextcloud.com/core/img/actions/mail.svg", - "mailto:christine.scott@nextcloud.com")); - - actions.add(new Action("spreed", - "Talk to Christine", - "https://dev.nextcloud.com/apps/spreed/img/app-dark.svg", - "https://dev.nextcloud.com/apps/spreed/?callUser=christine" - )); - - HoverCard hoverCard = new HoverCard("christine", "Christine Scott", actions); - - // show dialog - Intent intent = new Intent(targetContext, FileDisplayActivity.class); - FileDisplayActivity fda = activityRule.launchActivity(intent); - - ProfileBottomSheetDialog sut = new ProfileBottomSheetDialog(fda, - user, - hoverCard, - fda.viewThemeUtils); - - fda.runOnUiThread(sut::show); - - waitForIdleSync(); - - screenshot(sut.getWindow().getDecorView()); - } - - - @Test - @ScreenshotTest - public void testSslUntrustedCertDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - final SslCertificate certificate = new SslCertificate("foo", "bar", "2022/01/10", "2022/01/30"); - final SslError sslError = new SslError(SslError.SSL_UNTRUSTED, certificate); - - final SslErrorHandler handler = Mockito.mock(SslErrorHandler.class); - - SslUntrustedCertDialog sut = SslUntrustedCertDialog.newInstanceForEmptySslError(sslError, handler); - showDialog(sut); - } - - - @Test - @ScreenshotTest - public void testStoragePermissionDialog() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - StoragePermissionDialogFragment sut = StoragePermissionDialogFragment.Companion.newInstance(false); - showDialog(sut); - } - - @Test - @ScreenshotTest - public void testFileActionsBottomSheet() { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - OCFile ocFile = new OCFile("/test.md"); - final FileActionsBottomSheet sut = FileActionsBottomSheet.newInstance(ocFile, false); - showDialog(sut); - } - - private FileDisplayActivity showDialog(DialogFragment dialog) { - Intent intent = new Intent(targetContext, FileDisplayActivity.class); - - FileDisplayActivity sut = activityRule.getActivity(); - - if (sut == null) { - sut = activityRule.launchActivity(intent); - } - - return showDialog(sut, dialog); - } - - private FileDisplayActivity showDialog(FileDisplayActivity sut, DialogFragment dialog) { - dialog.show(sut.getSupportFragmentManager(), ""); - - getInstrumentation().waitForIdleSync(); - shortSleep(); - - ViewGroup viewGroup = dialog.requireDialog().getWindow().findViewById(android.R.id.content); - hideCursors(viewGroup); - - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - - return sut; - } - - private void hideCursors(ViewGroup viewGroup) { - for (int i = 0; i < viewGroup.getChildCount(); i++) { - View child = viewGroup.getChildAt(i); - - if (child instanceof ViewGroup) { - hideCursors((ViewGroup) child); - } - - if (child instanceof TextView) { - ((TextView) child).setCursorVisible(false); - } - } - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragmentTest.java b/app/src/androidTest/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragmentTest.java deleted file mode 100644 index c82db36..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragmentTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import com.owncloud.android.AbstractIT; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import java.util.Objects; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - -public class SyncFileNotEnoughSpaceDialogFragmentTest extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(FileDisplayActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void showNotEnoughSpaceDialogForFolder() { - FileDisplayActivity test = activityRule.launchActivity(null); - OCFile ocFile = new OCFile("/Document/"); - ocFile.setFileLength(5000000); - ocFile.setFolder(); - - SyncFileNotEnoughSpaceDialogFragment dialog = SyncFileNotEnoughSpaceDialogFragment.newInstance(ocFile, 1000); - dialog.show(test.getListOfFilesFragment().getFragmentManager(), "1"); - - getInstrumentation().waitForIdleSync(); - - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - } - - @Test - @ScreenshotTest - public void showNotEnoughSpaceDialogForFile() { - FileDisplayActivity test = activityRule.launchActivity(null); - OCFile ocFile = new OCFile("/Video.mp4"); - ocFile.setFileLength(1000000); - - SyncFileNotEnoughSpaceDialogFragment dialog = SyncFileNotEnoughSpaceDialogFragment.newInstance(ocFile, 2000); - dialog.show(test.getListOfFilesFragment().getFragmentManager(), "2"); - - getInstrumentation().waitForIdleSync(); - - screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView()); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewImageFragmentIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewImageFragmentIT.kt deleted file mode 100644 index d785f1c..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewImageFragmentIT.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview - -import androidx.test.espresso.intent.rule.IntentsTestRule -import com.nextcloud.test.TestActivity -import com.owncloud.android.AbstractIT -import org.junit.Rule - -class PreviewImageFragmentIT : AbstractIT() { - @get:Rule - val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false) - - // Disabled for now due to strange failing when using entire test suite - // Findings so far: - // PreviewImageFragmentIT runs fine when only running this - // running it in whole test suite fails - // manually tried to execute LoadBitmapTask, but this does not start "doInBackground", but only creates class - - // @Test - // @ScreenshotTest - // fun corruptImage() { - // val activity = testActivityRule.launchActivity(null) - // - // val ocFile = OCFile("/test.png") - // val sut = PreviewImageFragment.newInstance(ocFile, true, false) - // - // activity.addFragment(sut) - // - // while (!sut.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { - // shortSleep() - // } - // - // screenshot(activity) - // } - // - // @Test - // @ScreenshotTest - // fun validImage() { - // val activity = testActivityRule.launchActivity(null) - // - // val ocFile = OCFile("/test.png") - // ocFile.storagePath = getFile("imageFile.png").absolutePath - // - // val sut = PreviewImageFragment.newInstance(ocFile, true, false) - // - // activity.addFragment(sut) - // - // while (!sut.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { - // shortSleep() - // } - // - // screenshot(activity) - // } -} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java b/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java deleted file mode 100644 index 93acf38..0000000 --- a/app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import com.owncloud.android.AbstractIT; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.ScreenshotTest; - -import org.junit.Rule; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; - -import androidx.test.espresso.intent.rule.IntentsTestRule; - -public class PreviewTextFileFragmentTest extends AbstractIT { - @Rule public IntentsTestRule activityRule = new IntentsTestRule<>(FileDisplayActivity.class, - true, - false); - - @Test - @ScreenshotTest - public void displaySimpleTextFile() throws IOException { - FileDisplayActivity sut = activityRule.launchActivity(null); - - shortSleep(); - - File file = getDummyFile("nonEmpty.txt"); - OCFile test = new OCFile("/text.md"); - test.setMimeType(MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN); - test.setStoragePath(file.getAbsolutePath()); - sut.startTextPreview(test, false); - - shortSleep(); - - screenshot(sut); - } - - @Test - @ScreenshotTest - public void displayJavaSnippetFile() throws IOException { - FileDisplayActivity sut = activityRule.launchActivity(null); - - shortSleep(); - - File file = getFile("java.md"); - OCFile test = new OCFile("/java.md"); - test.setMimeType(MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN); - test.setStoragePath(file.getAbsolutePath()); - sut.startTextPreview(test, false); - - shortSleep(); - - screenshot(sut); - } -} diff --git a/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatus.kt b/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatus.kt deleted file mode 100644 index c917988..0000000 --- a/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatus.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2024 Your Name - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.nextcloud.client.assistant.task - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.nextcloud.client.assistant.extensions.statusData -import com.owncloud.android.lib.resources.assistant.model.Task - -@Composable -fun TaskStatus(task: Task, foregroundColor: Color) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - val (iconId, descriptionId) = task.statusData() - - Image( - painter = painterResource(id = iconId), - modifier = Modifier.size(16.dp), - colorFilter = ColorFilter.tint(foregroundColor), - contentDescription = "status icon" - ) - - Spacer(modifier = Modifier.width(6.dp)) - - Text(text = stringResource(id = descriptionId), color = foregroundColor) - - /* - Spacer(modifier = Modifier.weight(1f)) - - Text(text = task.completionDateRepresentation(), color = foregroundColor) - - Spacer(modifier = Modifier.width(6.dp)) - */ - } -} diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/DownloadNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/download/DownloadNotificationManager.kt index 00aedf2..9ccb36b 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/DownloadNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/DownloadNotificationManager.kt @@ -14,25 +14,23 @@ import com.nextcloud.client.jobs.notification.WorkerNotificationManager import com.nextcloud.utils.numberFormatter.NumberFormatter import com.owncloud.android.R import com.owncloud.android.operations.DownloadFileOperation +import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.theme.ViewThemeUtils import java.io.File import java.security.SecureRandom @Suppress("TooManyFunctions") class DownloadNotificationManager(id: Int, private val context: Context, viewThemeUtils: ViewThemeUtils) : - WorkerNotificationManager(id, context, viewThemeUtils, R.string.downloader_download_in_progress_ticker) { + WorkerNotificationManager( + id, + context, + viewThemeUtils, + tickerId = R.string.downloader_download_in_progress_ticker, + channelId = NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD + ) { private var lastPercent = -1 - init { - notificationBuilder.apply { - setSound(null) - setVibrate(null) - setOnlyAlertOnce(true) - setSilent(true) - } - } - @Suppress("MagicNumber") fun prepareForStart(operation: DownloadFileOperation) { currentOperationTitle = File(operation.savePath).name diff --git a/app/src/main/java/com/nextcloud/client/jobs/notification/WorkerNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/notification/WorkerNotificationManager.kt index 403b0bb..e427142 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/notification/WorkerNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/notification/WorkerNotificationManager.kt @@ -15,7 +15,6 @@ import android.os.Handler import android.os.Looper import androidx.core.app.NotificationCompat import com.owncloud.android.R -import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.theme.ViewThemeUtils open class WorkerNotificationManager( @@ -23,23 +22,24 @@ open class WorkerNotificationManager( private val context: Context, viewThemeUtils: ViewThemeUtils, private val tickerId: Int, - private val channelId: String = NotificationUtils.NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS + channelId: String ) { var currentOperationTitle: String? = null val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager var notificationBuilder: NotificationCompat.Builder = - NotificationUtils.newNotificationBuilder( - context, - channelId, - viewThemeUtils - ).apply { + NotificationCompat.Builder(context, channelId).apply { setTicker(context.getString(tickerId)) setSmallIcon(R.drawable.notification_icon) setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon)) setStyle(NotificationCompat.BigTextStyle()) priority = NotificationCompat.PRIORITY_LOW + setSound(null) + setVibrate(null) + setOnlyAlertOnce(true) + setSilent(true) + viewThemeUtils.androidx.themeNotificationCompatBuilder(context, this) } fun showNotification() { diff --git a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt index d96c639..fce69c3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt @@ -39,15 +39,6 @@ class OfflineOperationsNotificationManager(private val context: Context, viewThe private const val ONE_HUNDRED_PERCENT = 100 } - init { - notificationBuilder.apply { - setSound(null) - setVibrate(null) - setOnlyAlertOnce(true) - setSilent(true) - } - } - fun start() { notificationBuilder.run { setContentTitle(context.getString(R.string.offline_operations_worker_notification_start_text)) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/UploadNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/UploadNotificationManager.kt index 52eb709..4ba76bf 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/UploadNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/UploadNotificationManager.kt @@ -19,7 +19,13 @@ import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.theme.ViewThemeUtils class UploadNotificationManager(private val context: Context, viewThemeUtils: ViewThemeUtils, id: Int) : - WorkerNotificationManager(id, context, viewThemeUtils, R.string.foreground_service_upload) { + WorkerNotificationManager( + id, + context, + viewThemeUtils, + tickerId = R.string.foreground_service_upload, + channelId = NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD + ) { @Suppress("MagicNumber") fun prepareForStart( diff --git a/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt deleted file mode 100644 index dd12438..0000000 --- a/app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Nextcloud Android client application - * - * @author Tobias Kaminsky - * Copyright (C) 2020 Nextcloud GmbH - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.nextcloud.ui - -import android.annotation.SuppressLint -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.inputmethod.InputMethodManager -import android.widget.AdapterView -import android.widget.AdapterView.OnItemSelectedListener -import android.widget.ArrayAdapter -import android.widget.ImageView -import android.widget.TextView -import androidx.annotation.VisibleForTesting -import androidx.fragment.app.DialogFragment -import androidx.recyclerview.widget.LinearLayoutManager -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.nextcloud.client.account.User -import com.nextcloud.client.account.UserAccountManager -import com.nextcloud.client.core.AsyncRunner -import com.nextcloud.client.di.Injectable -import com.nextcloud.client.network.ClientFactory -import com.nextcloud.utils.extensions.getParcelableArgument -import com.owncloud.android.R -import com.owncloud.android.databinding.DialogSetStatusBinding -import com.owncloud.android.datamodel.ArbitraryDataProvider -import com.owncloud.android.lib.resources.users.ClearAt -import com.owncloud.android.lib.resources.users.PredefinedStatus -import com.owncloud.android.lib.resources.users.Status -import com.owncloud.android.lib.resources.users.StatusType -import com.owncloud.android.ui.activity.BaseActivity -import com.owncloud.android.ui.adapter.PredefinedStatusClickListener -import com.owncloud.android.ui.adapter.PredefinedStatusListAdapter -import com.owncloud.android.utils.DisplayUtils -import com.owncloud.android.utils.theme.ViewThemeUtils -import com.vanniktech.emoji.EmojiManager -import com.vanniktech.emoji.EmojiPopup -import com.vanniktech.emoji.google.GoogleEmojiProvider -import com.vanniktech.emoji.installDisableKeyboardInput -import com.vanniktech.emoji.installForceSingleEmoji -import java.util.Calendar -import java.util.Locale -import javax.inject.Inject - -private const val ARG_CURRENT_USER_PARAM = "currentUser" -private const val ARG_CURRENT_STATUS_PARAM = "currentStatus" - -private const val POS_DONT_CLEAR = 0 -private const val POS_HALF_AN_HOUR = 1 -private const val POS_AN_HOUR = 2 -private const val POS_FOUR_HOURS = 3 -private const val POS_TODAY = 4 -private const val POS_END_OF_WEEK = 5 - -private const val ONE_SECOND_IN_MILLIS = 1000 -private const val ONE_MINUTE_IN_SECONDS = 60 -private const val THIRTY_MINUTES = 30 -private const val FOUR_HOURS = 4 -private const val LAST_HOUR_OF_DAY = 23 -private const val LAST_MINUTE_OF_HOUR = 59 -private const val LAST_SECOND_OF_MINUTE = 59 - -private const val CLEAR_AT_TYPE_PERIOD = "period" -private const val CLEAR_AT_TYPE_END_OF = "end-of" - -class SetStatusDialogFragment : - DialogFragment(), - PredefinedStatusClickListener, - Injectable { - - private lateinit var binding: DialogSetStatusBinding - - private var currentUser: User? = null - private var currentStatus: Status? = null - private lateinit var accountManager: UserAccountManager - private lateinit var predefinedStatus: ArrayList - private lateinit var adapter: PredefinedStatusListAdapter - private var selectedPredefinedMessageId: String? = null - private var clearAt: Long? = -1 - private lateinit var popup: EmojiPopup - - @Inject - lateinit var arbitraryDataProvider: ArbitraryDataProvider - - @Inject - lateinit var asyncRunner: AsyncRunner - - @Inject - lateinit var clientFactory: ClientFactory - - @Inject - lateinit var viewThemeUtils: ViewThemeUtils - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - currentUser = it.getParcelableArgument(ARG_CURRENT_USER_PARAM, User::class.java) - currentStatus = it.getParcelableArgument(ARG_CURRENT_STATUS_PARAM, Status::class.java) - - val json = arbitraryDataProvider.getValue(currentUser, ArbitraryDataProvider.PREDEFINED_STATUS) - - if (json.isNotEmpty()) { - val myType = object : TypeToken>() {}.type - predefinedStatus = Gson().fromJson(json, myType) - } - } - - EmojiManager.install(GoogleEmojiProvider()) - } - - @SuppressLint("InflateParams") - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - binding = DialogSetStatusBinding.inflate(layoutInflater) - - val builder = MaterialAlertDialogBuilder(requireContext()).setView(binding.root) - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.statusView.context, builder) - - return builder.create() - } - - @SuppressLint("DefaultLocale") - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - accountManager = (activity as BaseActivity).userAccountManager - - currentStatus?.let { - updateCurrentStatusViews(it) - } - - adapter = PredefinedStatusListAdapter(this, requireContext()) - if (this::predefinedStatus.isInitialized) { - adapter.list = predefinedStatus - } - binding.predefinedStatusList.adapter = adapter - binding.predefinedStatusList.layoutManager = LinearLayoutManager(context) - - binding.onlineStatus.setOnClickListener { setStatus(StatusType.ONLINE) } - binding.dndStatus.setOnClickListener { setStatus(StatusType.DND) } - binding.awayStatus.setOnClickListener { setStatus(StatusType.AWAY) } - binding.invisibleStatus.setOnClickListener { setStatus(StatusType.INVISIBLE) } - - viewThemeUtils.files.themeStatusCardView(binding.onlineStatus) - viewThemeUtils.files.themeStatusCardView(binding.dndStatus) - viewThemeUtils.files.themeStatusCardView(binding.awayStatus) - viewThemeUtils.files.themeStatusCardView(binding.invisibleStatus) - - binding.clearStatus.setOnClickListener { clearStatus() } - binding.setStatus.setOnClickListener { setStatusMessage() } - binding.emoji.setOnClickListener { popup.show() } - - popup = EmojiPopup(view, binding.emoji, onEmojiClickListener = { _ -> - popup.dismiss() - binding.emoji.clearFocus() - val imm: InputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as - InputMethodManager - imm.hideSoftInputFromWindow(binding.emoji.windowToken, 0) - }) - binding.emoji.installForceSingleEmoji() - binding.emoji.installDisableKeyboardInput(popup) - - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item) - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - adapter.add(getString(R.string.dontClear)) - adapter.add(getString(R.string.thirtyMinutes)) - adapter.add(getString(R.string.oneHour)) - adapter.add(getString(R.string.fourHours)) - adapter.add(getString(R.string.today)) - adapter.add(getString(R.string.thisWeek)) - - binding.clearStatusAfterSpinner.apply { - this.adapter = adapter - onItemSelectedListener = object : OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { - setClearStatusAfterValue(position) - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - // nothing to do - } - } - } - - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.clearStatus) - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(binding.setStatus) - viewThemeUtils.material.colorTextInputLayout(binding.customStatusInputContainer) - - viewThemeUtils.platform.themeDialog(binding.root) - } - - private fun updateCurrentStatusViews(it: Status) { - binding.emoji.setText(it.icon) - binding.customStatusInput.text?.clear() - binding.customStatusInput.setText(it.message) - visualizeStatus(it.status) - - if (it.clearAt > 0) { - binding.clearStatusAfterSpinner.visibility = View.GONE - binding.remainingClearTime.apply { - binding.clearStatusMessageTextView.text = getString(R.string.clear_status_message) - visibility = View.VISIBLE - text = DisplayUtils.getRelativeTimestamp(context, it.clearAt * ONE_SECOND_IN_MILLIS, true) - .toString() - .replaceFirstChar { it.lowercase(Locale.getDefault()) } - setOnClickListener { - visibility = View.GONE - binding.clearStatusAfterSpinner.visibility = View.VISIBLE - binding.clearStatusMessageTextView.text = getString(R.string.clear_status_message_after) - } - } - } - } - - private fun setClearStatusAfterValue(item: Int) { - clearAt = when (item) { - POS_DONT_CLEAR -> null // don't clear - POS_HALF_AN_HOUR -> { - // 30 minutes - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + THIRTY_MINUTES * ONE_MINUTE_IN_SECONDS - } - POS_AN_HOUR -> { - // one hour - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS - } - POS_FOUR_HOURS -> { - // four hours - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + - FOUR_HOURS * ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS - } - POS_TODAY -> { - // today - val date = getLastSecondOfToday() - dateToSeconds(date) - } - POS_END_OF_WEEK -> { - // end of week - val date = getLastSecondOfToday() - while (date.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { - date.add(Calendar.DAY_OF_YEAR, 1) - } - dateToSeconds(date) - } - else -> clearAt - } - } - - private fun clearAtToUnixTime(clearAt: ClearAt?): Long = when { - clearAt?.type == CLEAR_AT_TYPE_PERIOD -> { - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + clearAt.time.toLong() - } - clearAt?.type == CLEAR_AT_TYPE_END_OF && clearAt.time == "day" -> { - val date = getLastSecondOfToday() - dateToSeconds(date) - } - else -> -1 - } - - private fun getLastSecondOfToday(): Calendar { - val date = Calendar.getInstance().apply { - set(Calendar.HOUR_OF_DAY, LAST_HOUR_OF_DAY) - set(Calendar.MINUTE, LAST_MINUTE_OF_HOUR) - set(Calendar.SECOND, LAST_SECOND_OF_MINUTE) - } - return date - } - - private fun dateToSeconds(date: Calendar) = date.timeInMillis / ONE_SECOND_IN_MILLIS - - private fun clearStatus() { - asyncRunner.postQuickTask( - ClearStatusTask(accountManager.currentOwnCloudAccount?.savedAccount, context), - { dismiss(it) } - ) - } - - private fun setStatus(statusType: StatusType) { - visualizeStatus(statusType) - - asyncRunner.postQuickTask( - SetStatusTask( - statusType, - accountManager.currentOwnCloudAccount?.savedAccount, - context - ), - { - if (!it) { - clearTopStatus() - } - }, - { clearTopStatus() } - ) - } - - private fun visualizeStatus(statusType: StatusType) { - clearTopStatus() - val views: Triple = when (statusType) { - StatusType.ONLINE -> Triple(binding.onlineStatus, binding.onlineHeadline, binding.onlineIcon) - StatusType.AWAY -> Triple(binding.awayStatus, binding.awayHeadline, binding.awayIcon) - StatusType.DND -> Triple(binding.dndStatus, binding.dndHeadline, binding.dndIcon) - StatusType.INVISIBLE -> Triple(binding.invisibleStatus, binding.invisibleHeadline, binding.invisibleIcon) - else -> { - Log.d(TAG, "unknown status") - return - } - } - views.first.isChecked = true - viewThemeUtils.platform.colorOnSecondaryContainerTextViewElement(views.second) - } - - private fun clearTopStatus() { - context?.let { - binding.onlineHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) - binding.awayHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) - binding.dndHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) - binding.invisibleHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) - - binding.onlineIcon.imageTintList = null - binding.awayIcon.imageTintList = null - binding.dndIcon.imageTintList = null - binding.invisibleIcon.imageTintList = null - - binding.onlineStatus.isChecked = false - binding.awayStatus.isChecked = false - binding.dndStatus.isChecked = false - binding.invisibleStatus.isChecked = false - } - } - - private fun setStatusMessage() { - if (selectedPredefinedMessageId != null) { - asyncRunner.postQuickTask( - SetPredefinedCustomStatusTask( - selectedPredefinedMessageId!!, - clearAt, - accountManager.currentOwnCloudAccount?.savedAccount, - context - ), - { dismiss(it) } - ) - } else { - asyncRunner.postQuickTask( - SetUserDefinedCustomStatusTask( - binding.customStatusInput.text.toString(), - binding.emoji.text.toString(), - clearAt, - accountManager.currentOwnCloudAccount?.savedAccount, - context - ), - { dismiss(it) } - ) - } - } - - private fun dismiss(boolean: Boolean) { - if (boolean) { - dismiss() - } - } - - /** - * Fragment creator - */ - companion object { - private val TAG = SetStatusDialogFragment::class.simpleName - - @JvmStatic - fun newInstance(user: User, status: Status?): SetStatusDialogFragment { - val args = Bundle() - args.putParcelable(ARG_CURRENT_USER_PARAM, user) - args.putParcelable(ARG_CURRENT_STATUS_PARAM, status) - val dialogFragment = SetStatusDialogFragment() - dialogFragment.arguments = args - return dialogFragment - } - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - return binding.root - } - - override fun onClick(predefinedStatus: PredefinedStatus) { - selectedPredefinedMessageId = predefinedStatus.id - clearAt = clearAtToUnixTime(predefinedStatus.clearAt) - binding.emoji.setText(predefinedStatus.icon) - binding.customStatusInput.text?.clear() - binding.customStatusInput.text?.append(predefinedStatus.message) - - binding.remainingClearTime.visibility = View.GONE - binding.clearStatusAfterSpinner.visibility = View.VISIBLE - binding.clearStatusMessageTextView.text = getString(R.string.clear_status_message_after) - - val clearAt = predefinedStatus.clearAt - if (clearAt == null) { - binding.clearStatusAfterSpinner.setSelection(0) - } else { - when (clearAt.type) { - CLEAR_AT_TYPE_PERIOD -> updateClearAtViewsForPeriod(clearAt) - CLEAR_AT_TYPE_END_OF -> updateClearAtViewsForEndOf(clearAt) - } - } - setClearStatusAfterValue(binding.clearStatusAfterSpinner.selectedItemPosition) - } - - private fun updateClearAtViewsForPeriod(clearAt: ClearAt) { - when (clearAt.time) { - "1800" -> binding.clearStatusAfterSpinner.setSelection(POS_HALF_AN_HOUR) - "3600" -> binding.clearStatusAfterSpinner.setSelection(POS_AN_HOUR) - "14400" -> binding.clearStatusAfterSpinner.setSelection(POS_FOUR_HOURS) - else -> binding.clearStatusAfterSpinner.setSelection(POS_DONT_CLEAR) - } - } - - private fun updateClearAtViewsForEndOf(clearAt: ClearAt) { - when (clearAt.time) { - "day" -> binding.clearStatusAfterSpinner.setSelection(POS_TODAY) - "week" -> binding.clearStatusAfterSpinner.setSelection(POS_END_OF_WEEK) - else -> binding.clearStatusAfterSpinner.setSelection(POS_DONT_CLEAR) - } - } - - @VisibleForTesting - fun setPredefinedStatus(predefinedStatus: ArrayList) { - adapter.list = predefinedStatus - binding.predefinedStatusList.adapter?.notifyDataSetChanged() - } -} diff --git a/app/src/main/java/com/owncloud/android/MainApp.java b/app/src/main/java/com/owncloud/android/MainApp.java index 7f01a42..9358a3c 100644 --- a/app/src/main/java/com/owncloud/android/MainApp.java +++ b/app/src/main/java/com/owncloud/android/MainApp.java @@ -679,7 +679,7 @@ public class MainApp extends Application implements HasAndroidInjector, NetworkC createChannel(notificationManager, NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD, R.string.notification_channel_upload_name_short, - R.string.notification_channel_upload_description, context); + R.string.notification_channel_upload_description, context, NotificationManager.IMPORTANCE_LOW); createChannel(notificationManager, NotificationUtils.NOTIFICATION_CHANNEL_MEDIA, R.string.notification_channel_media_name, @@ -697,7 +697,7 @@ public class MainApp extends Application implements HasAndroidInjector, NetworkC createChannel(notificationManager, NotificationUtils.NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS, R.string.notification_channel_background_operations_name, R.string - .notification_channel_background_operations_description, context, NotificationManager.IMPORTANCE_DEFAULT); + .notification_channel_background_operations_description, context, NotificationManager.IMPORTANCE_LOW); createChannel(notificationManager, NotificationUtils.NOTIFICATION_CHANNEL_GENERAL, R.string .notification_channel_general_name, R.string.notification_channel_general_description, diff --git a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index 70ea982..7a1648e 100644 --- a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -30,6 +30,7 @@ import android.os.Handler; import android.os.IBinder; import android.preference.PreferenceManager; import android.text.TextUtils; +import android.util.Pair; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; @@ -49,6 +50,8 @@ import com.blikoon.qrcodescanner.QrCodeActivity; import com.google.android.material.button.MaterialButton; import com.google.android.material.snackbar.Snackbar; import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import com.nextcloud.android.common.ui.color.ColorUtil; import com.nextcloud.android.common.ui.theme.utils.ColorRole; @@ -113,6 +116,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -231,11 +235,13 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity @Inject ClientFactory clientFactory; private AuthObject authObject = null; + private String fallbackToken; private boolean onlyAdd = false; private final Gson gson = new Gson(); private ViewThemeUtils viewThemeUtils; + private final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); @VisibleForTesting public AccountSetupBinding getAccountSetupBinding() { @@ -418,28 +424,59 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity * Example: "..." */ private void anonymouslyPostLoginRequest(String url) { + if (TextUtils.isEmpty(url)) { + DisplayUtils.showSnackMessage(this, R.string.authenticator_activity_empty_base_url); + return; + } baseUrl = url; - Thread thread = new Thread(() -> { + singleThreadExecutor.execute(() -> { String response = getResponseOfAnonymouslyPostLoginRequest(); - - try { - authObject = gson.fromJson(response, AuthObject.class); - runOnUiThread(() -> { - String loginUrl = getResources().getString(R.string.webview_login_url); - if (authObject != null && !TextUtils.isEmpty(authObject.getLogin())) { - loginUrl = authObject.getLogin(); - } - initLoginInfoView(); - launchDefaultWebBrowser(loginUrl); - }); - } catch (Throwable t) { - Log_OC.d(TAG, "Error caught at anonymouslyPostLoginRequest: " + t); - DisplayUtils.showSnackMessage(this, R.string.authenticator_activity_login_error); + if (TextUtils.isEmpty(response)) { + DisplayUtils.showSnackMessage(AuthenticatorActivity.this, R.string.authenticator_activity_empty_response_message); + return; } - }); - thread.start(); + String loginUrl = extractLoginUrl(response); + runOnUiThread(() -> { + initLoginInfoView(); + launchDefaultWebBrowser(loginUrl); + }); + }); + } + + private String extractLoginUrl(String response) { + try { + authObject = gson.fromJson(response, AuthObject.class); + if (authObject != null && !TextUtils.isEmpty(authObject.getLogin())) { + return authObject.getLogin(); + } else { + Log_OC.e(TAG, "AuthObject parsing failed or login empty, trying JSONObject fallback"); + } + } catch (Exception e) { + Log_OC.e(TAG, "Error parsing AuthObject: " + e.getMessage(), e); + } + + try { + String fallbackUrl = getLoginFromJsonObject(response); + if (!TextUtils.isEmpty(fallbackUrl)) { + return fallbackUrl; + } else { + Log_OC.e(TAG, "Fallback JSONObject parsing failed or login empty"); + } + } catch (Exception e) { + Log_OC.e(TAG, "Error parsing fallback JSONObject: " + e.getMessage(), e); + } + + Log_OC.e(TAG, "Both AuthObject and fallback parsing failed, returning default login URL"); + DisplayUtils.showSnackMessage(this, R.string.authenticator_activity_login_error); + return getResources().getString(R.string.webview_login_url); + } + + private String getLoginFromJsonObject(String response) { + JsonObject jsonObject = JsonParser.parseString(response).getAsJsonObject(); + fallbackToken = jsonObject.getAsJsonObject("poll").get("token").getAsString(); + return jsonObject.get("login").getAsString(); } private String getResponseOfAnonymouslyPostLoginRequest() { @@ -450,30 +487,57 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity } private void launchDefaultWebBrowser(String url) { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); + if (url == null || url.isBlank()) { + DisplayUtils.showSnackMessage(this, R.string.invalid_url); + return; + } + + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PackageManager packageManager = getPackageManager(); + + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent); + } else { + DisplayUtils.showSnackMessage(this, R.string.authenticator_activity_no_web_browser_found); + } + } catch (Exception e) { + Log_OC.e(TAG, "Exception launchDefaultWebBrowser: " + e); + DisplayUtils.showSnackMessage(this, R.string.authenticator_activity_login_error); + } + } + + private Pair extractPollUrlAndToken() { + if (authObject != null) { + final var poll = authObject.getPoll(); + String pollUrl = poll.getEndpoint(); + String token = poll.getToken(); + + if (TextUtils.isEmpty(pollUrl)) { + Log_OC.e(TAG, "auth object poll url is empty."); + } + if (TextUtils.isEmpty(token)) { + Log_OC.e(TAG, "auth object token is empty."); + } + + if (!TextUtils.isEmpty(pollUrl) && !TextUtils.isEmpty(token)) { + return new Pair<>(pollUrl, token); + } + } + + return new Pair<>(baseUrl + "/poll", fallbackToken); } private void performLoginFlowV2() { - final String pollUrl = authObject.getPoll().getEndpoint(); - if (TextUtils.isEmpty(pollUrl)) { - Log_OC.e(TAG, "pollUrl is empty."); - return; - } - - final String token = authObject.getPoll().getToken(); - if (TextUtils.isEmpty(authObject.getPoll().getToken())) { - Log_OC.e(TAG, "token is empty."); - return; - } + final var pollUrlAndToken = extractPollUrlAndToken(); RequestBody requestBody = new FormBody.Builder() - .add("token", token) + .add("token", pollUrlAndToken.second) .build(); PlainClient client = clientFactory.createPlainClient(); - PostMethod post = new PostMethod(pollUrl, false, requestBody); + PostMethod post = new PostMethod(pollUrlAndToken.first, false, requestBody); int status = post.execute(client); String response = post.getResponseBodyAsString(); @@ -889,7 +953,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity } Log_OC.d(TAG, "AuthenticatorActivity onDestroy called"); - + singleThreadExecutor.shutdown(); super.onDestroy(); } diff --git a/app/src/main/java/com/owncloud/android/authentication/LoginUrlInfo.java b/app/src/main/java/com/owncloud/android/authentication/LoginUrlInfo.java deleted file mode 100644 index 026b556..0000000 --- a/app/src/main/java/com/owncloud/android/authentication/LoginUrlInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016 Andy Scherzinger - * SPDX-FileCopyrightText: 2016 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.authentication; - -/** - * Data object holding the login url fields. - */ -public class LoginUrlInfo { - String serverAddress; - String username; - String password; -} diff --git a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java index 0411b75..11455a2 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -680,7 +680,7 @@ public class OCFile implements Parcelable, Comparable, ServerFileInterfa * @return true if the user is allowed to either delete or leave the share; false otherwise. */ public boolean canDeleteOrLeaveShare() { - return !encrypted && hasPermission(PERMISSION_CAN_DELETE_OR_LEAVE_SHARE); + return hasPermission(PERMISSION_CAN_DELETE_OR_LEAVE_SHARE); } public boolean canRename() { diff --git a/app/src/main/java/com/owncloud/android/datamodel/QuickPermissionModel.kt b/app/src/main/java/com/owncloud/android/datamodel/QuickPermissionModel.kt deleted file mode 100644 index 8116311..0000000 --- a/app/src/main/java/com/owncloud/android/datamodel/QuickPermissionModel.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Nextcloud Android client application - * - * @author TSI-mc - * Copyright (C) 2021 TSI-mc - * Copyright (C) 2021 Nextcloud GmbH - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.owncloud.android.datamodel - -data class QuickPermissionModel(val permissionName: String, val isSelected: Boolean) diff --git a/app/src/main/java/com/owncloud/android/media/MediaControlView.java b/app/src/main/java/com/owncloud/android/media/MediaControlView.java deleted file mode 100644 index 898b220..0000000 --- a/app/src/main/java/com/owncloud/android/media/MediaControlView.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas - * SPDX-FileCopyrightText: 2018-2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2013 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.media; - -import android.content.Context; -import android.media.MediaPlayer; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.LinearLayout; -import android.widget.MediaController.MediaPlayerControl; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; - -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.databinding.MediaControlBinding; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.util.Formatter; -import java.util.Locale; - -import javax.inject.Inject; - -/** - * View containing controls for a {@link MediaPlayer}. - *

- * Holds buttons "play / pause", "rewind", "fast forward" and a progress slider. - *

- * It synchronizes itself with the state of the {@link MediaPlayer}. - */ -public class MediaControlView extends LinearLayout implements OnClickListener, OnSeekBarChangeListener { - private static final String TAG = MediaControlView.class.getSimpleName(); - private static final int SHOW_PROGRESS = 1; - - private MediaPlayerControl playerControl; - private final MediaControlBinding binding; - private boolean isDragging; - - @Inject - ViewThemeUtils viewThemeUtils; - - public MediaControlView(Context context, AttributeSet attrs) { - super(context, attrs); - - MainApp.getAppComponent().inject(this); - - LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - binding = MediaControlBinding.inflate(inflate, this, true); - initControllerView(); - - setFocusable(true); - setFocusableInTouchMode(true); - setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); - requestFocus(); - } - - @Override - public void onFinishInflate() { - super.onFinishInflate(); - } - - public void setMediaPlayer(MediaPlayerControl player) { - playerControl = player; - handler.sendEmptyMessage(SHOW_PROGRESS); - handler.postDelayed(() -> { - updatePausePlay(); - setProgress(); - }, 100); - } - - public void stopMediaPlayerMessages() { - handler.removeMessages(SHOW_PROGRESS); - } - - private void initControllerView() { - binding.playBtn.requestFocus(); - binding.playBtn.setOnClickListener(this); - - binding.forwardBtn.setOnClickListener(this); - - binding.rewindBtn.setOnClickListener(this); - - viewThemeUtils.platform.themeHorizontalSeekBar(binding.progressBar); - binding.progressBar.setOnSeekBarChangeListener(this); - binding.progressBar.setMax(1000); - } - - /** - * Disable pause or seek buttons if the stream cannot be paused or seeked. - * This requires the control interface to be a MediaPlayerControlExt - */ - private void disableUnsupportedButtons() { - try { - if (binding != null) { - if (!playerControl.canPause()) { - binding.playBtn.setEnabled(false); - } - if (!playerControl.canSeekBackward()) { - binding.rewindBtn.setEnabled(false); - } - if (!playerControl.canSeekForward()) { - binding.forwardBtn.setEnabled(false); - } - } - - } catch (IncompatibleClassChangeError ex) { - // We were given an old version of the interface, that doesn't have - // the canPause/canSeekXYZ methods. This is OK, it just means we - // assume the media can be paused and seeked, and so we don't disable - // the buttons. - Log_OC.i(TAG, "Old media interface detected"); - } - } - - private final Handler handler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(Message msg) { - if (msg.what == SHOW_PROGRESS) { - updatePausePlay(); - int pos = setProgress(); - if (!isDragging) { - sendMessageDelayed(obtainMessage(SHOW_PROGRESS), 1000 - (pos % 1000)); - } - } - } - }; - - private String formatTime(int timeMs) { - int totalSeconds = timeMs / 1000; - - int seconds = totalSeconds % 60; - int minutes = (totalSeconds / 60) % 60; - int hours = totalSeconds / 3600; - - final StringBuilder mFormatBuilder = new StringBuilder(); - final Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); - if (hours > 0) { - return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString(); - } else { - return mFormatter.format("%02d:%02d", minutes, seconds).toString(); - } - } - - private int setProgress() { - if (playerControl == null || isDragging) { - return 0; - } - int position = playerControl.getCurrentPosition(); - int duration = playerControl.getDuration(); - if (binding != null) { - if (duration > 0) { - // use long to avoid overflow - long pos = 1000L * position / duration; - binding.progressBar.setProgress((int) pos); - } - int percent = playerControl.getBufferPercentage(); - binding.progressBar.setSecondaryProgress(percent * 10); - - String endTime = duration > 0 ? formatTime(duration) : "--:--"; - binding.totalTimeText.setText(endTime); - binding.currentTimeText.setText(formatTime(position)); - } - - return position; - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - int keyCode = event.getKeyCode(); - final boolean uniqueDown = event.getRepeatCount() == 0 - && event.getAction() == KeyEvent.ACTION_DOWN; - if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK - || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE - || keyCode == KeyEvent.KEYCODE_SPACE) { - if (uniqueDown) { - doPauseResume(); - //show(sDefaultTimeout); - if (binding != null) { - binding.playBtn.requestFocus(); - } - } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) { - if (uniqueDown && !playerControl.isPlaying()) { - playerControl.start(); - updatePausePlay(); - } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP - || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) { - if (uniqueDown && playerControl.isPlaying()) { - playerControl.pause(); - updatePausePlay(); - } - return true; - } - - return super.dispatchKeyEvent(event); - } - - public void updatePausePlay() { - if (binding == null) { - return; - } - - if (playerControl.isPlaying()) { - binding.playBtn.setImageResource(android.R.drawable.ic_media_pause); - } else { - binding.playBtn.setImageResource(android.R.drawable.ic_media_play); - } - - final boolean canSeekFfd = playerControl.canSeekForward(); - if (canSeekFfd) { - binding.forwardBtn.setVisibility(View.VISIBLE); - } else { - binding.forwardBtn.setVisibility(View.INVISIBLE); - } - - final boolean canSeekBwd = playerControl.canSeekBackward(); - if (canSeekBwd) { - binding.rewindBtn.setVisibility(View.VISIBLE); - } else { - binding.rewindBtn.setVisibility(View.INVISIBLE); - } - } - - private void doPauseResume() { - if (playerControl.isPlaying()) { - playerControl.pause(); - } else { - playerControl.start(); - } - updatePausePlay(); - } - - @Override - public void setEnabled(boolean enabled) { - if(binding!=null){ - binding.playBtn.setEnabled(enabled); - binding.forwardBtn.setEnabled(enabled); - binding.rewindBtn.setEnabled(enabled); - binding.progressBar.setEnabled(enabled); - } - - disableUnsupportedButtons(); - super.setEnabled(enabled); - } - - @Override - public void onClick(View v) { - int pos; - boolean playing = playerControl.isPlaying(); - int id = v.getId(); - - if (id == R.id.playBtn) { - doPauseResume(); - } else if (id == R.id.rewindBtn) { - pos = playerControl.getCurrentPosition(); - pos -= 5000; - playerControl.seekTo(pos); - if (!playing) { - playerControl.pause(); // necessary in some 2.3.x devices - } - setProgress(); - } else if (id == R.id.forwardBtn) { - pos = playerControl.getCurrentPosition(); - pos += 15000; - playerControl.seekTo(pos); - if (!playing) { - playerControl.pause(); // necessary in some 2.3.x devices - } - setProgress(); - } - } - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (!fromUser) { - // We're not interested in programmatically generated changes to - // the progress bar's position. - return; - } - - long duration = playerControl.getDuration(); - long newPosition = (duration * progress) / 1000L; - playerControl.seekTo((int) newPosition); - binding.currentTimeText.setText(formatTime((int) newPosition)); - } - - /** - * Called in devices with touchpad when the user starts to adjust the position of the seekbar's thumb. - * - * Will be followed by several onProgressChanged notifications. - */ - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - isDragging = true; // monitors the duration of dragging - handler.removeMessages(SHOW_PROGRESS); // grants no more updates with media player progress while dragging - } - - /** - * Called in devices with touchpad when the user finishes the adjusting of the seekbar. - */ - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - isDragging = false; - setProgress(); - updatePausePlay(); - handler.sendEmptyMessage(SHOW_PROGRESS); // grants future updates with media player progress - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - event.setClassName(MediaControlView.class.getName()); - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setClassName(MediaControlView.class.getName()); - } -} diff --git a/app/src/main/java/com/owncloud/android/operations/GetSharesForFileOperation.java b/app/src/main/java/com/owncloud/android/operations/GetSharesForFileOperation.java deleted file mode 100644 index 2e9e18e..0000000 --- a/app/src/main/java/com/owncloud/android/operations/GetSharesForFileOperation.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2021 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2014-2015 María Asensio Valverde - * SPDX-FileCopyrightText: 2015 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.operations; - -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.shares.GetSharesForFileRemoteOperation; -import com.owncloud.android.lib.resources.shares.OCShare; -import com.owncloud.android.operations.common.SyncOperation; - -import java.util.ArrayList; - -/** - * Provide a list shares for a specific file. - */ -public class GetSharesForFileOperation extends SyncOperation { - - private static final String TAG = GetSharesForFileOperation.class.getSimpleName(); - - private final String path; - private final boolean reshares; - private final boolean subfiles; - - /** - * Constructor - * - * @param path Path to file or folder - * @param reshares If set to false (default), only shares from the current user are returned If set to true, all - * shares from the given file are returned - * @param subfiles If set to false (default), lists only the folder being shared If set to true, all shared files - * within the folder are returned. - */ - public GetSharesForFileOperation(String path, - boolean reshares, - boolean subfiles, - FileDataStorageManager storageManager) { - super(storageManager); - - this.path = path; - this.reshares = reshares; - this.subfiles = subfiles; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - GetSharesForFileRemoteOperation operation = new GetSharesForFileRemoteOperation(path, - reshares, - subfiles); - RemoteOperationResult result = operation.execute(client); - - if (result.isSuccess()) { - - // Update DB with the response - Log_OC.d(TAG, "File = " + path + " Share list size " + result.getData().size()); - ArrayList shares = new ArrayList(); - for (Object obj : result.getData()) { - shares.add((OCShare) obj); - } - - getStorageManager().saveSharesDB(shares); - - } else if (result.getCode() == RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) { - // no share on the file - remove local shares - getStorageManager().removeSharesForFile(path); - - } - - return result; - } - -} diff --git a/app/src/main/java/com/owncloud/android/operations/RemoveFileOperation.java b/app/src/main/java/com/owncloud/android/operations/RemoveFileOperation.java deleted file mode 100644 index ab3239b..0000000 --- a/app/src/main/java/com/owncloud/android/operations/RemoveFileOperation.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 María Asensio Valverde - * SPDX-FileCopyrightText: 2012 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.operations; - -import android.content.Context; - -import com.nextcloud.client.account.User; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; -import com.owncloud.android.lib.resources.files.RemoveFileRemoteOperation; -import com.owncloud.android.operations.common.SyncOperation; -import com.owncloud.android.utils.MimeTypeUtil; - -/** - * Remote operation performing the removal of a remote file or folder in the ownCloud server. - */ -public class RemoveFileOperation extends SyncOperation { - - private final OCFile fileToRemove; - private final boolean onlyLocalCopy; - private final User user; - private final boolean inBackground; - private final Context context; - - /** - * Constructor - * - * @param fileToRemove OCFile instance describing the remote file or folder to remove from the server - * @param onlyLocalCopy When 'true', and a local copy of the file exists, only this is removed. - */ - public RemoveFileOperation(OCFile fileToRemove, - boolean onlyLocalCopy, - User user, - boolean inBackground, - Context context, - FileDataStorageManager storageManager) { - super(storageManager); - - this.fileToRemove = fileToRemove; - this.onlyLocalCopy = onlyLocalCopy; - this.user = user; - this.inBackground = inBackground; - this.context = context; - } - - /** - * Getter for the file to remove (or removed, if the operation was successfully performed). - * - * @return File to remove or already removed. - */ - public OCFile getFile() { - return fileToRemove; - } - - public boolean isInBackground() { - return inBackground; - } - - /** - * Performs the remove operation - * - * @param client Client object to communicate with the remote ownCloud server. - */ - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result = null; - RemoteOperation operation; - - if (MimeTypeUtil.isImage(fileToRemove.getMimeType())) { - // store resized image - ThumbnailsCacheManager.generateResizedImage(fileToRemove); - } - - boolean localRemovalFailed = false; - if (!onlyLocalCopy) { - if (fileToRemove.isEncrypted()) { - OCFile parent = getStorageManager().getFileByPath(fileToRemove.getParentRemotePath()); - operation = new RemoveRemoteEncryptedFileOperation(fileToRemove.getRemotePath(), - user, - context, - fileToRemove.getEncryptedFileName(), - parent, - fileToRemove.isFolder()); - } else { - operation = new RemoveFileRemoteOperation(fileToRemove.getRemotePath()); - } - result = operation.execute(client); - if (result.isSuccess() || result.getCode() == ResultCode.FILE_NOT_FOUND) { - localRemovalFailed = !(getStorageManager().removeFile(fileToRemove, true, true)); - } - } else { - localRemovalFailed = !(getStorageManager().removeFile(fileToRemove, false, true)); - if (!localRemovalFailed) { - result = new RemoteOperationResult(ResultCode.OK); - } - } - - if (localRemovalFailed) { - result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_REMOVED); - } - - return result; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java b/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java deleted file mode 100644 index 5485b55..0000000 --- a/app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Nextcloud Android client application - * - * @author Andy Scherzinger - * @author Stefan Niedermann - * Copyright (C) 2021 Andy Scherzinger - * Copyright (C) 2021 Stefan Niedermann - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.owncloud.android.ui; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.RelativeLayout; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.BitmapImageViewTarget; -import com.nextcloud.client.account.User; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.shares.ShareeUser; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.util.List; - -import androidx.annotation.NonNull; -import androidx.annotation.Px; -import androidx.core.content.ContextCompat; -import androidx.core.content.res.ResourcesCompat; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.core.graphics.drawable.RoundedBitmapDrawable; -import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; - -public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.AvatarGenerationListener { - private static final String TAG = AvatarGroupLayout.class.getSimpleName(); - - private final static int MAX_AVATAR_COUNT = 3; - - private final Drawable borderDrawable; - @Px private final int avatarSize; - @Px private final int avatarBorderSize; - @Px private final int overlapPx; - - public AvatarGroupLayout(Context context) { - this(context, null); - } - - public AvatarGroupLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public AvatarGroupLayout(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public AvatarGroupLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - avatarBorderSize = DisplayUtils.convertDpToPixel(2, context); - avatarSize = DisplayUtils.convertDpToPixel(40, context); - overlapPx = DisplayUtils.convertDpToPixel(24, context); - borderDrawable = ContextCompat.getDrawable(context, R.drawable.round_bgnd); - assert borderDrawable != null; - DrawableCompat.setTint(borderDrawable, ContextCompat.getColor(context, R.color.bg_default)); - } - - public void setAvatars(@NonNull User user, - @NonNull List sharees, - final ViewThemeUtils viewThemeUtils) { - @NonNull Context context = getContext(); - removeAllViews(); - RelativeLayout.LayoutParams avatarLayoutParams; - int avatarCount; - int shareeSize = Math.min(sharees.size(), MAX_AVATAR_COUNT); - - Resources resources = context.getResources(); - float avatarRadius = resources.getDimension(R.dimen.list_item_avatar_icon_radius); - ShareeUser sharee; - - for (avatarCount = 0; avatarCount < shareeSize; avatarCount++) { - avatarLayoutParams = new RelativeLayout.LayoutParams(avatarSize, avatarSize); - avatarLayoutParams.setMargins(0, 0, avatarCount * overlapPx, 0); - avatarLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - - final ImageView avatar = new ImageView(context); - avatar.setLayoutParams(avatarLayoutParams); - avatar.setPadding(avatarBorderSize, avatarBorderSize, avatarBorderSize, avatarBorderSize); - - avatar.setBackground(borderDrawable); - addView(avatar); - avatar.requestLayout(); - - if (avatarCount == 0 && sharees.size() > MAX_AVATAR_COUNT) { - avatar.setImageResource(R.drawable.ic_people); - viewThemeUtils.platform.tintTextDrawable(context, avatar.getDrawable()); - } else { - sharee = sharees.get(avatarCount); - switch (sharee.getShareType()) { - case GROUP: - case EMAIL: - case ROOM: - case CIRCLE: - viewThemeUtils.files.createAvatar(sharee.getShareType(), avatar, context); - break; - case FEDERATED: - showFederatedShareAvatar(context, - sharee.getUserId(), - avatarRadius, - resources, - avatar, - viewThemeUtils); - break; - default: - avatar.setTag(sharee); - DisplayUtils.setAvatar(user, - sharee.getUserId(), - sharee.getDisplayName(), - this, - avatarRadius, - resources, - avatar, - context); - break; - } - } - } - - // Recalculate container size based on avatar count - int size = overlapPx * (avatarCount - 1) + avatarSize; - ViewGroup.LayoutParams rememberParam = getLayoutParams(); - rememberParam.width = size; - setLayoutParams(rememberParam); - } - - private void showFederatedShareAvatar(Context context, - String user, - float avatarRadius, - Resources resources, - ImageView avatar, - ViewThemeUtils viewThemeUtils) { - // maybe federated share - String[] split = user.split("@"); - String userId = split[0]; - String server = split[1]; - - String url = "https://" + server + "/index.php/avatar/" + userId + "/" + - resources.getInteger(R.integer.file_avatar_px); - - Drawable placeholder; - try { - placeholder = TextDrawable.createAvatarByUserId(userId, avatarRadius); - } catch (Exception e) { - Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e); - placeholder = viewThemeUtils.platform.colorDrawable(ResourcesCompat.getDrawable(resources, - R.drawable.account_circle_white, - null), - ContextCompat.getColor(context, R.color.black)); - } - - avatar.setTag(null); - Glide.with(context).load(url) - .asBitmap() - .placeholder(placeholder) - .error(placeholder) - .into(new BitmapImageViewTarget(avatar) { - @Override - protected void setResource(Bitmap resource) { - RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory.create(resources, - resource); - circularBitmapDrawable.setCircular(true); - avatar.setImageDrawable(circularBitmapDrawable); - } - }); - } - - @Override - public void avatarGenerated(Drawable avatarDrawable, Object callContext) { - ((ImageView) callContext).setImageDrawable(avatarDrawable); - } - - @Override - public boolean shouldCallGeneratedCallback(String tag, Object callContext) { - return ((ImageView) callContext).getTag().equals(tag); - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt index 05b49d6..fc5f579 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt @@ -150,6 +150,8 @@ class ConflictsResolveActivity : } private fun dismissConflictResolveNotification(file: OCFile?) { + file ?: return + val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager val tag = NotificationUtils.createUploadNotificationTag(file) notificationManager.cancel(tag, FileUploadWorker.NOTIFICATION_ERROR_ID) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index c77a2e6..132957c 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -16,6 +16,7 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.net.Uri; +import android.os.Environment; import android.os.Handler; import android.view.View; import android.webkit.JavascriptInterface; @@ -283,7 +284,7 @@ public abstract class EditorWebView extends ExternalSiteWebView { } } - protected void downloadFile(Uri url) { + protected void downloadFile(Uri url, String fileName) { DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); if (downloadmanager == null) { @@ -295,6 +296,10 @@ public abstract class EditorWebView extends ExternalSiteWebView { request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + // change the name file and your current activity. + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); + + downloadmanager.enqueue(request); } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java deleted file mode 100644 index 3fc80bd..0000000 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ /dev/null @@ -1,2504 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 TSI-mc - * SPDX-FileCopyrightText: 2023 Archontis E. Kostis - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2018-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2018-2020 Andy Scherzinger - * SPDX-FileCopyrightText: 2016 ownCloud Inc. - * SPDX-FileCopyrightText: 2012-2013 David A. Velasco - * SPDX-FileCopyrightText: 2011 Bartosz Przybylski - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.accounts.Account; -import android.accounts.AuthenticatorException; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.ServiceConnection; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.content.res.Resources.NotFoundException; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.os.Parcelable; -import android.text.TextUtils; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewTreeObserver; -import android.view.WindowManager; - -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.snackbar.Snackbar; -import com.nextcloud.appReview.InAppReviewHelper; -import com.nextcloud.client.account.User; -import com.nextcloud.client.appinfo.AppInfo; -import com.nextcloud.client.core.AsyncRunner; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.editimage.EditImageActivity; -import com.nextcloud.client.files.DeepLinkHandler; -import com.nextcloud.client.jobs.download.FileDownloadHelper; -import com.nextcloud.client.jobs.download.FileDownloadWorker; -import com.nextcloud.client.jobs.upload.FileUploadHelper; -import com.nextcloud.client.jobs.upload.FileUploadWorker; -import com.nextcloud.client.media.PlayerServiceConnection; -import com.nextcloud.client.network.ClientFactory; -import com.nextcloud.client.network.ConnectivityService; -import com.nextcloud.client.preferences.AppPreferences; -import com.nextcloud.client.utils.IntentUtil; -import com.nextcloud.model.WorkerState; -import com.nextcloud.model.WorkerStateLiveData; -import com.nextcloud.utils.extensions.ActivityExtensionsKt; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.nextcloud.utils.extensions.IntentExtensionsKt; -import com.nextcloud.utils.view.FastScrollUtils; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.databinding.FilesBinding; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.VirtualFolderType; -import com.owncloud.android.files.services.NameCollisionPolicy; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation; -import com.owncloud.android.lib.resources.files.SearchRemoteOperation; -import com.owncloud.android.operations.CopyFileOperation; -import com.owncloud.android.operations.CreateFolderOperation; -import com.owncloud.android.operations.DownloadType; -import com.owncloud.android.operations.MoveFileOperation; -import com.owncloud.android.operations.RefreshFolderOperation; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.operations.RenameFileOperation; -import com.owncloud.android.operations.SynchronizeFileOperation; -import com.owncloud.android.operations.UploadFileOperation; -import com.owncloud.android.syncadapter.FileSyncAdapter; -import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask; -import com.owncloud.android.ui.asynctasks.FetchRemoteFileTask; -import com.owncloud.android.ui.asynctasks.GetRemoteFileTask; -import com.owncloud.android.ui.dialog.SendShareDialog; -import com.owncloud.android.ui.dialog.SortingOrderDialogFragment; -import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment; -import com.owncloud.android.ui.events.SearchEvent; -import com.owncloud.android.ui.events.SyncEventFinished; -import com.owncloud.android.ui.events.TokenPushEvent; -import com.owncloud.android.ui.fragment.FileDetailFragment; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.ui.fragment.GalleryFragment; -import com.owncloud.android.ui.fragment.GroupfolderListFragment; -import com.owncloud.android.ui.fragment.OCFileListFragment; -import com.owncloud.android.ui.fragment.SearchType; -import com.owncloud.android.ui.fragment.SharedListFragment; -import com.owncloud.android.ui.fragment.TaskRetainerFragment; -import com.owncloud.android.ui.fragment.UnifiedSearchFragment; -import com.owncloud.android.ui.helpers.FileOperationsHelper; -import com.owncloud.android.ui.helpers.UriUploader; -import com.owncloud.android.ui.preview.PreviewImageActivity; -import com.owncloud.android.ui.preview.PreviewImageFragment; -import com.owncloud.android.ui.preview.PreviewMediaActivity; -import com.owncloud.android.ui.preview.PreviewMediaFragment; -import com.owncloud.android.ui.preview.PreviewTextFileFragment; -import com.owncloud.android.ui.preview.PreviewTextFragment; -import com.owncloud.android.ui.preview.PreviewTextStringFragment; -import com.owncloud.android.ui.preview.pdf.PreviewPdfFragment; -import com.owncloud.android.utils.DataHolderUtil; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.ErrorMessageAdapter; -import com.owncloud.android.utils.FileSortOrder; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.PermissionUtil; -import com.owncloud.android.utils.PushUtils; -import com.owncloud.android.utils.StringUtils; -import com.owncloud.android.utils.theme.CapabilityUtils; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.SearchView; -import androidx.core.view.MenuItemCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import kotlin.Unit; - -import static com.owncloud.android.datamodel.OCFile.PATH_SEPARATOR; -import static com.owncloud.android.utils.PermissionUtil.PERMISSION_CHOICE_DIALOG_TAG; - -/** - * Displays, what files the user has available in his Nextcloud. This is the main view. - */ -public class FileDisplayActivity extends FileActivity - implements FileFragment.ContainerActivity, - OnEnforceableRefreshListener, SortingOrderDialogFragment.OnSortingOrderListener, - SendShareDialog.SendShareDialogDownloader, Injectable { - - public static final String RESTART = "RESTART"; - public static final String ALL_FILES = "ALL_FILES"; - public static final String LIST_GROUPFOLDERS = "LIST_GROUPFOLDERS"; - public static final int SINGLE_USER_SIZE = 1; - public static final String OPEN_FILE = "NC_OPEN_FILE"; - - private FilesBinding binding; - - private SyncBroadcastReceiver mSyncBroadcastReceiver; - private UploadFinishReceiver mUploadFinishReceiver; - private DownloadFinishReceiver mDownloadFinishReceiver; - private RemoteOperationResult mLastSslUntrustedServerResult; - @Inject LocalBroadcastManager localBroadcastManager; - - public static final String TAG_PUBLIC_LINK = "PUBLIC_LINK"; - public static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; - public static final String KEY_FILE_ID = "KEY_FILE_ID"; - public static final String KEY_FILE_PATH = "KEY_FILE_PATH"; - public static final String KEY_ACCOUNT = "KEY_ACCOUNT"; - public static final String KEY_IS_SORT_GROUP_VISIBLE = "KEY_IS_SORT_GROUP_VISIBLE"; - - private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; - private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"; - private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND"; - - public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS"; - - public static final String DRAWER_MENU_ID = "DRAWER_MENU_ID"; - - public static final int REQUEST_CODE__SELECT_CONTENT_FROM_APPS = REQUEST_CODE__LAST_SHARED + 1; - public static final int REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM = REQUEST_CODE__LAST_SHARED + 2; - public static final int REQUEST_CODE__MOVE_OR_COPY_FILES = REQUEST_CODE__LAST_SHARED + 3; - public static final int REQUEST_CODE__UPLOAD_FROM_CAMERA = REQUEST_CODE__LAST_SHARED + 5; - - protected static final long DELAY_TO_REQUEST_REFRESH_OPERATION_LATER = DELAY_TO_REQUEST_OPERATIONS_LATER + 350; - - private static final String TAG = FileDisplayActivity.class.getSimpleName(); - - public static final String TAG_LIST_OF_FILES = "LIST_OF_FILES"; - - public static final String TEXT_PREVIEW = "TEXT_PREVIEW"; - - private OCFile mWaitingToPreview; - - private boolean mSyncInProgress; - - private OCFile mWaitingToSend; - - private Collection mDrawerMenuItemstoShowHideList; - - public static final String KEY_IS_SEARCH_OPEN = "IS_SEARCH_OPEN"; - public static final String KEY_SEARCH_QUERY = "SEARCH_QUERY"; - - public static final String REFRESH_FOLDER_EVENT_RECEIVER = "REFRESH_FOLDER_EVENT"; - - private String searchQuery = ""; - private boolean searchOpen; - - private SearchView searchView; - private PlayerServiceConnection mPlayerConnection; - private Optional lastDisplayedUser = Optional.empty(); - private int menuItemId = -1; - - @Inject AppPreferences preferences; - - @Inject AppInfo appInfo; - - @Inject ConnectivityService connectivityService; - - @Inject InAppReviewHelper inAppReviewHelper; - - @Inject FastScrollUtils fastScrollUtils; - @Inject AsyncRunner asyncRunner; - - public static Intent openFileIntent(Context context, User user, OCFile file) { - final Intent intent = new Intent(context, PreviewImageActivity.class); - intent.putExtra(FileActivity.EXTRA_FILE, file); - intent.putExtra(FileActivity.EXTRA_USER, user); - return intent; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - Log_OC.v(TAG, "onCreate() start"); - // Set the default theme to replace the launch screen theme. - setTheme(R.style.Theme_ownCloud_Toolbar_Drawer); - - super.onCreate(savedInstanceState); - loadSavedInstanceState(savedInstanceState); - - /// USER INTERFACE - initLayout(); - initUI(); - initTaskRetainerFragment(); - - // Restoring after UI has been inflated. - if (savedInstanceState != null) { - showSortListGroup(savedInstanceState.getBoolean(KEY_IS_SORT_GROUP_VISIBLE)); - } - - if (Intent.ACTION_VIEW.equals(getIntent().getAction())) { - handleOpenFileViaIntent(getIntent()); - } - - mPlayerConnection = new PlayerServiceConnection(this); - - checkStoragePath(); - - initSyncBroadcastReceiver(); - observeWorkerState(); - registerRefreshFolderEventReceiver(); - } - - @SuppressWarnings("unchecked") - private void loadSavedInstanceState(Bundle savedInstanceState) { - if (savedInstanceState != null) { - mWaitingToPreview = BundleExtensionsKt.getParcelableArgument(savedInstanceState, KEY_WAITING_TO_PREVIEW, OCFile.class); - mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); - mWaitingToSend = BundleExtensionsKt.getParcelableArgument(savedInstanceState, KEY_WAITING_TO_SEND, OCFile.class); - searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); - searchOpen = savedInstanceState.getBoolean(FileDisplayActivity.KEY_IS_SEARCH_OPEN, false); - } else { - mWaitingToPreview = null; - mSyncInProgress = false; - mWaitingToSend = null; - } - } - - private void initLayout() { - // Inflate and set the layout view - binding = FilesBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - } - - private void initUI() { - setupHomeSearchToolbarWithSortAndListButtons(); - mMenuButton.setOnClickListener(v -> openDrawer()); - mSwitchAccountButton.setOnClickListener(v -> showManageAccountsDialog()); - fastScrollUtils.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout); - } - - private void initTaskRetainerFragment() { - // Init Fragment without UI to retain AsyncTask across configuration changes - FragmentManager fm = getSupportFragmentManager(); - TaskRetainerFragment taskRetainerFragment = (TaskRetainerFragment) fm.findFragmentByTag(TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT); - if (taskRetainerFragment == null) { - taskRetainerFragment = new TaskRetainerFragment(); - fm.beginTransaction().add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit(); - } // else, Fragment already created and retained across configuration change - } - - private void checkStoragePath() { - String newStorage = Environment.getExternalStorageDirectory().getAbsolutePath(); - String storagePath = preferences.getStoragePath(newStorage); - if (!preferences.isStoragePathValid() && !new File(storagePath).exists()) { - // falling back to default - preferences.setStoragePath(newStorage); - preferences.setStoragePathValid(); - MainApp.setStoragePath(newStorage); - - try { - AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog).setTitle(R.string.wrong_storage_path).setMessage(R.string.wrong_storage_path_desc).setPositiveButton(R.string.dialog_close, (dialog, which) -> dialog.dismiss()).setIcon(R.drawable.ic_settings).create(); - - alertDialog.show(); - viewThemeUtils.platform.colorTextButtons(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)); - } catch (WindowManager.BadTokenException e) { - Log_OC.e(TAG, "Error showing wrong storage info, so skipping it: " + e.getMessage()); - } - } - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - StoragePermissionDialogFragment fragment = (StoragePermissionDialogFragment) getSupportFragmentManager().findFragmentByTag(PERMISSION_CHOICE_DIALOG_TAG); - if (fragment != null) { - Dialog dialog = fragment.getDialog(); - - if (dialog != null && dialog.isShowing()) { - dialog.dismiss(); - getSupportFragmentManager().beginTransaction().remove(fragment).commitNowAllowingStateLoss(); - PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils); - } - } - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - // handle notification permission on API level >= 33 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - // request notification permission first and then prompt for storage permissions - // storage permissions handled in onRequestPermissionsResult - PermissionUtil.requestNotificationPermission(this); - } else { - PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils); - } - - if (IntentExtensionsKt.getParcelableArgument(getIntent(), OCFileListFragment.SEARCH_EVENT, SearchEvent.class) != null) { - switchToSearchFragment(savedInstanceState); - - int menuId = getIntent().getIntExtra(DRAWER_MENU_ID, -1); - if (menuId != -1) { - setupDrawer(menuId); - } - } else { - createMinFragments(savedInstanceState); - syncAndUpdateFolder(true); - } - - if (OPEN_FILE.equals(getIntent().getAction())) { - getSupportFragmentManager().executePendingTransactions(); - onOpenFileIntent(getIntent()); - } else if (RESTART.equals(getIntent().getAction())) { - // most likely switched to different account - DisplayUtils.showSnackMessage(this, String.format(getString(R.string.logged_in_as), accountManager.getUser().getAccountName())); - } - - upgradeNotificationForInstantUpload(); - checkOutdatedServer(); - } - - private Activity getActivity() { - return this; - } - - /** - * For Android 7+. Opens a pop up info for the new instant upload and disabled the old instant upload. - */ - private void upgradeNotificationForInstantUpload() { - // check for Android 6+ if legacy instant upload is activated --> disable + show info - if (preferences.instantPictureUploadEnabled() || preferences.instantVideoUploadEnabled()) { - preferences.removeLegacyPreferences(); - // show info pop-up - new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog).setTitle(R.string.drawer_synced_folders).setMessage(R.string.synced_folders_new_info).setPositiveButton(R.string.drawer_open, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - // show instant upload - Intent syncedFoldersIntent = new Intent(getApplicationContext(), SyncedFoldersActivity.class); - dialog.dismiss(); - startActivity(syncedFoldersIntent); - } - }).setNegativeButton(R.string.drawer_close, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }).setIcon(R.drawable.nav_synced_folders).show(); - } - } - - private void checkOutdatedServer() { - Optional user = getUser(); - // show outdated warning - if (user.isPresent() && CapabilityUtils.checkOutdatedWarning(getResources(), user.get().getServer().getVersion(), getCapabilities().getExtendedSupport().isTrue())) { - DisplayUtils.showServerOutdatedSnackbar(this, Snackbar.LENGTH_LONG); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - switch (requestCode) { - case PermissionUtil.PERMISSIONS_POST_NOTIFICATIONS: - // handle notification permission on API level >= 33 - // dialogue was dismissed -> prompt for storage permissions - PermissionUtil.requestExternalStoragePermission(this, viewThemeUtils); - break; - case PermissionUtil.PERMISSIONS_EXTERNAL_STORAGE: - // If request is cancelled, result arrays are empty. - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // permission was granted - EventBus.getDefault().post(new TokenPushEvent()); - syncAndUpdateFolder(true); - // toggle on is save since this is the only scenario this code gets accessed - } - break; - case PermissionUtil.PERMISSIONS_CAMERA: - // If request is cancelled, result arrays are empty. - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // permission was granted - getFileOperationsHelper().uploadFromCamera(this, FileDisplayActivity.REQUEST_CODE__UPLOAD_FROM_CAMERA); - } - break; - default: - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - } - } - - private void switchToSearchFragment(Bundle savedInstanceState) { - if (savedInstanceState == null) { - OCFileListFragment listOfFiles = new OCFileListFragment(); - Bundle args = new Bundle(); - - args.putParcelable(OCFileListFragment.SEARCH_EVENT, - IntentExtensionsKt.getParcelableArgument(getIntent(), - OCFileListFragment.SEARCH_EVENT, - SearchEvent.class)); - args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); - - listOfFiles.setArguments(args); - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES); - transaction.commit(); - } else { - getSupportFragmentManager().findFragmentByTag(TAG_LIST_OF_FILES); - } - } - - private void createMinFragments(Bundle savedInstanceState) { - if (savedInstanceState == null) { - OCFileListFragment listOfFiles = new OCFileListFragment(); - Bundle args = new Bundle(); - args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); - listOfFiles.setArguments(args); - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES); - transaction.commit(); - } else { - getSupportFragmentManager().findFragmentByTag(TAG_LIST_OF_FILES); - } - } - - private void initFragments() { - /// First fragment - OCFileListFragment listOfFiles = getListOfFilesFragment(); - if (listOfFiles != null && TextUtils.isEmpty(searchQuery)) { - listOfFiles.listDirectory(getCurrentDir(), getFile(), MainApp.isOnlyOnDevice(), false); - } else { - Log_OC.e(TAG, "Still have a chance to lose the initialization of list fragment >("); - } - - /// reset views - resetTitleBarAndScrolling(); - } - - // Is called with the flag FLAG_ACTIVITY_SINGLE_TOP and set the new file and intent - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - setIntent(intent); - - if (ACTION_DETAILS.equalsIgnoreCase(intent.getAction())) { - OCFile file = IntentExtensionsKt.getParcelableArgument(intent, EXTRA_FILE, OCFile.class); - setFile(file); - setIntent(intent); - showDetails(file); - } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { - handleOpenFileViaIntent(intent); - } else if (OPEN_FILE.equals(intent.getAction())) { - onOpenFileIntent(intent); - } else if (RESTART.equals(intent.getAction())) { - finish(); - startActivity(intent); - } else // Verify the action and get the query - if (Intent.ACTION_SEARCH.equals(intent.getAction())) { - setIntent(intent); - - SearchEvent searchEvent = IntentExtensionsKt.getParcelableArgument(intent, OCFileListFragment.SEARCH_EVENT, SearchEvent.class); - if (searchEvent != null) { - if (SearchRemoteOperation.SearchType.PHOTO_SEARCH == searchEvent.getSearchType()) { - Log_OC.d(this, "Switch to photo search fragment"); - - GalleryFragment photoFragment = new GalleryFragment(); - Bundle bundle = new Bundle(); - bundle.putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent); - photoFragment.setArguments(bundle); - setLeftFragment(photoFragment); - } else if (searchEvent.getSearchType() == SearchRemoteOperation.SearchType.SHARED_FILTER) { - Log_OC.d(this, "Switch to shared fragment"); - SharedListFragment sharedListFragment = new SharedListFragment(); - Bundle bundle = new Bundle(); - bundle.putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent); - sharedListFragment.setArguments(bundle); - setLeftFragment(sharedListFragment); - } else { - Log_OC.d(this, "Switch to oc file search fragment"); - - OCFileListFragment photoFragment = new OCFileListFragment(); - Bundle bundle = new Bundle(); - bundle.putParcelable(OCFileListFragment.SEARCH_EVENT, searchEvent); - photoFragment.setArguments(bundle); - setLeftFragment(photoFragment); - } - } - } else if (ALL_FILES.equals(intent.getAction())) { - Log_OC.d(this, "Switch to oc file fragment"); - - setLeftFragment(new OCFileListFragment()); - getSupportFragmentManager().executePendingTransactions(); - browseToRoot(); - } else if (LIST_GROUPFOLDERS.equals(intent.getAction())) { - Log_OC.d(this, "Switch to list groupfolders fragment"); - - setLeftFragment(new GroupfolderListFragment()); - getSupportFragmentManager().executePendingTransactions(); - } - } - - private void onOpenFileIntent(Intent intent) { - String extra = intent.getStringExtra(EXTRA_FILE); - OCFile file = getStorageManager().getFileByDecryptedRemotePath(extra); - if (file != null) { - OCFileListFragment fileFragment; - final Fragment leftFragment = getLeftFragment(); - if (leftFragment instanceof OCFileListFragment) { - fileFragment = (OCFileListFragment) leftFragment; - } else { - fileFragment = new OCFileListFragment(); - setLeftFragment(fileFragment); - } - fileFragment.onItemClicked(file); - } - } - - /** - * Replaces the first fragment managed by the activity with the received as a parameter. - * - * @param fragment New Fragment to set. - */ - private void setLeftFragment(Fragment fragment) { - setLeftFragment(fragment, true); - } - - private void setLeftFragment(Fragment fragment, boolean showSortListGroup) { - if (searchView != null) { - searchView.post(() -> searchView.setQuery(searchQuery, true)); - } - setDrawerIndicatorEnabled(false); - - //clear the subtitle while navigating to any other screen from Media screen - clearToolbarSubtitle(); - - showSortListGroup(showSortListGroup); - - FragmentManager fragmentManager = getSupportFragmentManager(); - if (!isFinishing() && !fragmentManager.isDestroyed()) { - FragmentTransaction transaction = fragmentManager.beginTransaction(); - transaction.addToBackStack(null); - transaction.replace(R.id.left_fragment_container, fragment, TAG_LIST_OF_FILES); - transaction.commit(); - } - } - - private OCFileListFragment getOCFileListFragmentFromFile() { - final Fragment leftFragment = getLeftFragment(); - OCFileListFragment listOfFiles; - - if (leftFragment instanceof OCFileListFragment) { - listOfFiles = (OCFileListFragment) leftFragment; - } else { - listOfFiles = new OCFileListFragment(); - Bundle args = new Bundle(); - args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); - listOfFiles.setArguments(args); - - FragmentManager fm = getSupportFragmentManager(); - boolean isExecutingTransactions = !fm.isStateSaved() && !fm.executePendingTransactions(); - - if (isExecutingTransactions) { - setLeftFragment(listOfFiles); - fm.executePendingTransactions(); - } else { - new Handler(Looper.getMainLooper()).post(() -> { - setLeftFragment(listOfFiles); - fm.executePendingTransactions(); - }); - } - } - - return listOfFiles; - } - - - public void showFileActions(OCFile file) { - dismissLoadingDialog(); - OCFileListFragment listOfFiles = getOCFileListFragmentFromFile(); - browseUp(listOfFiles); - listOfFiles.onOverflowIconClicked(file, null); - } - - public @androidx.annotation.Nullable Fragment getLeftFragment() { - return getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES); - } - - public @androidx.annotation.Nullable - @Deprecated OCFileListFragment getListOfFilesFragment() { - Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES); - if (listOfFiles instanceof OCFileListFragment) { - return (OCFileListFragment) listOfFiles; - } - Log_OC.e(TAG, "Access to unexisting list of files fragment!!"); - return null; - } - - protected void resetTitleBarAndScrolling() { - updateActionBarTitleAndHomeButton(null); - resetScrolling(true); - } - - public void updateListOfFilesFragment(boolean fromSearch) { - OCFileListFragment fileListFragment = getListOfFilesFragment(); - if (fileListFragment != null) { - fileListFragment.listDirectory(MainApp.isOnlyOnDevice(), fromSearch); - } - } - - public void resetSearchView() { - OCFileListFragment fileListFragment = getListOfFilesFragment(); - - if (fileListFragment != null) { - fileListFragment.setSearchFragment(false); - } - } - - protected void refreshDetailsFragmentIfVisible(String downloadEvent, String downloadedRemotePath, boolean success) { - Fragment leftFragment = getLeftFragment(); - if (leftFragment instanceof FileDetailFragment) { - boolean waitedPreview = mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath); - FileDetailFragment detailsFragment = (FileDetailFragment) leftFragment; - OCFile fileInFragment = detailsFragment.getFile(); - if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) { - // the user browsed to other file ; forget the automatic preview - mWaitingToPreview = null; - - } else if (downloadEvent.equals(FileDownloadWorker.Companion.getDownloadAddedMessage())) { - // grant that the details fragment updates the progress bar - detailsFragment.listenForTransferProgress(); - detailsFragment.updateFileDetails(true, false); - - } else if (downloadEvent.equals(FileDownloadWorker.Companion.getDownloadFinishMessage())) { - // update the details panel - boolean detailsFragmentChanged = false; - if (waitedPreview) { - if (success) { - // update the file from database, for the local storage path - mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); - - if (PreviewMediaActivity.Companion.canBePreviewed(mWaitingToPreview)) { - startMediaPreview(mWaitingToPreview, 0, true, true, true, true); - detailsFragmentChanged = true; - } else if (MimeTypeUtil.isVCard(mWaitingToPreview.getMimeType())) { - startContactListFragment(mWaitingToPreview); - detailsFragmentChanged = true; - } else if (PreviewTextFileFragment.canBePreviewed(mWaitingToPreview)) { - startTextPreview(mWaitingToPreview, true); - detailsFragmentChanged = true; - } else if (MimeTypeUtil.isPDF(mWaitingToPreview)) { - startPdfPreview(mWaitingToPreview); - detailsFragmentChanged = true; - } else { - getFileOperationsHelper().openFile(mWaitingToPreview); - } - } - mWaitingToPreview = null; - } - if (!detailsFragmentChanged) { - detailsFragment.updateFileDetails(false, success); - } - } - } - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - boolean drawerOpen = isDrawerOpen(); - - for (MenuItem menuItem : mDrawerMenuItemstoShowHideList) { - menuItem.setVisible(!drawerOpen); - } - - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.activity_file_display, menu); - - menu.findItem(R.id.action_select_all).setVisible(false); - MenuItem searchMenuItem = menu.findItem(R.id.action_search); - searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); - searchMenuItem.setVisible(false); - mSearchText.setOnClickListener(v -> { - showSearchView(); - searchView.setIconified(false); - }); - - viewThemeUtils.androidx.themeToolbarSearchView(searchView); - - // populate list of menu items to show/hide when drawer is opened/closed - mDrawerMenuItemstoShowHideList = new ArrayList<>(1); - mDrawerMenuItemstoShowHideList.add(searchMenuItem); - - //focus the SearchView - if (!TextUtils.isEmpty(searchQuery)) { - searchView.post(() -> { - searchView.setIconified(false); - searchView.setQuery(searchQuery, true); - searchView.clearFocus(); - }); - } - - final View mSearchEditFrame = searchView.findViewById(androidx.appcompat.R.id.search_edit_frame); - - searchView.setOnCloseListener(() -> { - if (TextUtils.isEmpty(searchView.getQuery().toString())) { - searchView.onActionViewCollapsed(); - setDrawerIndicatorEnabled(isDrawerIndicatorAvailable()); // order matters - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - mDrawerToggle.syncState(); - - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - ocFileListFragment.setSearchFragment(false); - ocFileListFragment.refreshDirectory(); - } - } else { - searchView.post(() -> searchView.setQuery("", true)); - } - return true; - }); - - ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver(); - vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - int oldVisibility = -1; - - @Override - public void onGlobalLayout() { - - int currentVisibility = mSearchEditFrame.getVisibility(); - - if (currentVisibility != oldVisibility) { - if (currentVisibility == View.VISIBLE) { - setDrawerIndicatorEnabled(false); - } - - oldVisibility = currentVisibility; - } - - } - }); - - return super.onCreateOptionsMenu(menu); - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean retval = true; - - int itemId = item.getItemId(); - - if (itemId == android.R.id.home) { - if (!isDrawerOpen() && !isSearchOpen() && isRoot(getCurrentDir()) && getLeftFragment() instanceof OCFileListFragment) { - openDrawer(); - } else { - onBackPressed(); - } - } else if (itemId == R.id.action_select_all) { - OCFileListFragment fragment = getListOfFilesFragment(); - - if (fragment != null) { - fragment.selectAllFiles(true); - } - } else { - retval = super.onOptionsItemSelected(item); - } - - return retval; - } - - /** - * Called, when the user selected something for uploading - */ - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_CODE__SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { - - requestUploadOfContentFromApps(data, resultCode); - - } else if (requestCode == REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE || resultCode == UploadFilesActivity.RESULT_OK_AND_DO_NOTHING || resultCode == UploadFilesActivity.RESULT_OK_AND_DELETE)) { - - requestUploadOfFilesFromFileSystem(data, resultCode); - - } else if (requestCode == REQUEST_CODE__UPLOAD_FROM_CAMERA && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_DELETE)) { - - new CheckAvailableSpaceTask(new CheckAvailableSpaceTask.CheckAvailableSpaceListener() { - @Override - public void onCheckAvailableSpaceStart() { - Log_OC.d(this, "onCheckAvailableSpaceStart"); - } - - @Override - public void onCheckAvailableSpaceFinish(boolean hasEnoughSpaceAvailable, String... filesToUpload) { - Log_OC.d(this, "onCheckAvailableSpaceFinish"); - - if (hasEnoughSpaceAvailable) { - File file = new File(filesToUpload[0]); - File renamedFile = new File(file.getParent() + PATH_SEPARATOR + FileOperationsHelper.getCapturedImageName()); - - if (!file.renameTo(renamedFile)) { - DisplayUtils.showSnackMessage(getActivity(), "Fail to upload taken image!"); - return; - } - - requestUploadOfFilesFromFileSystem(renamedFile.getParentFile().getAbsolutePath(), new String[]{renamedFile.getAbsolutePath()}, FileUploadWorker.LOCAL_BEHAVIOUR_DELETE); - } - } - }, new String[]{FileOperationsHelper.createImageFile(getActivity()).getAbsolutePath()}).execute(); - } else if (requestCode == REQUEST_CODE__MOVE_OR_COPY_FILES && resultCode == RESULT_OK) { - exitSelectionMode(); - } else if (requestCode == PermissionUtil.REQUEST_CODE_MANAGE_ALL_FILES) { - syncAndUpdateFolder(true); - } else { - super.onActivityResult(requestCode, resultCode, data); - } - } - - private void exitSelectionMode() { - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - ocFileListFragment.exitSelectionMode(); - } - } - - private void requestUploadOfFilesFromFileSystem(Intent data, int resultCode) { - String[] filePaths = data.getStringArrayExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES); - String basePath = data.getStringExtra(UploadFilesActivity.LOCAL_BASE_PATH); - requestUploadOfFilesFromFileSystem(basePath, filePaths, resultCode); - } - - private String[] getRemotePaths(String directory, String[] filePaths, String localBasePath) { - String[] remotePaths = new String[filePaths.length]; - for (int j = 0; j < remotePaths.length; j++) { - String relativePath = StringUtils.removePrefix(filePaths[j], localBasePath); - remotePaths[j] = directory + relativePath; - } - - return remotePaths; - } - - private void requestUploadOfFilesFromFileSystem(String localBasePath, String[] filePaths, int resultCode) { - if (localBasePath != null && filePaths != null) { - if (!localBasePath.endsWith("/")) { - localBasePath = localBasePath + "/"; - } - - String remotePathBase = getCurrentDir().getRemotePath(); - String[] decryptedRemotePaths = getRemotePaths(remotePathBase, filePaths, localBasePath); - - int behaviour = switch (resultCode) { - case UploadFilesActivity.RESULT_OK_AND_MOVE -> FileUploadWorker.LOCAL_BEHAVIOUR_MOVE; - case UploadFilesActivity.RESULT_OK_AND_DELETE -> FileUploadWorker.LOCAL_BEHAVIOUR_DELETE; - default -> FileUploadWorker.LOCAL_BEHAVIOUR_FORGET; - }; - - FileUploadHelper.Companion.instance().uploadNewFiles(getUser().orElseThrow(RuntimeException::new), - filePaths, - decryptedRemotePaths, - behaviour, - true, - UploadFileOperation.CREATED_BY_USER, - false, - false, - NameCollisionPolicy.ASK_USER); - - } else { - Log_OC.d(TAG, "User clicked on 'Update' with no selection"); - DisplayUtils.showSnackMessage(this, R.string.filedisplay_no_file_selected); - } - } - - private void requestUploadOfContentFromApps(Intent contentIntent, int resultCode) { - - ArrayList streamsToUpload = new ArrayList<>(); - - if (contentIntent.getClipData() != null && contentIntent.getClipData().getItemCount() > 0) { - - for (int i = 0; i < contentIntent.getClipData().getItemCount(); i++) { - streamsToUpload.add(contentIntent.getClipData().getItemAt(i).getUri()); - } - - } else { - streamsToUpload.add(contentIntent.getData()); - } - - int behaviour = (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE) ? FileUploadWorker.LOCAL_BEHAVIOUR_MOVE : FileUploadWorker.LOCAL_BEHAVIOUR_COPY; - - OCFile currentDir = getCurrentDir(); - String remotePath = (currentDir != null) ? currentDir.getRemotePath() : OCFile.ROOT_PATH; - - UriUploader uploader = new UriUploader(this, streamsToUpload, remotePath, getUser().orElseThrow(RuntimeException::new), behaviour, false, // Not show waiting dialog while file is being copied from private storage - null // Not needed copy temp task listener - ); - - uploader.uploadUris(); - - } - - private boolean isSearchOpen() { - if (searchView == null) { - return false; - } else { - View mSearchEditFrame = searchView.findViewById(androidx.appcompat.R.id.search_edit_frame); - return mSearchEditFrame != null && mSearchEditFrame.getVisibility() == View.VISIBLE; - } - } - - private Boolean isRootDirectory() { - OCFile currentDir = getCurrentDir(); - return (currentDir == null || currentDir.getParentId() == FileDataStorageManager.ROOT_PARENT_ID); - } - - /* - * BackPressed priority/hierarchy: - * 1. close search view if opened - * 2. close drawer if opened - * 3. if it is OCFileListFragment and it's in Root -> (finish Activity) or it's not Root -> (browse up) - * 4. otherwise pop up the fragment and sortGroup view visibility and call super.onBackPressed() - */ - @SuppressFBWarnings("ITC_INHERITANCE_TYPE_CHECKING") - @Override - public void onBackPressed() { - final boolean isDrawerOpen = isDrawerOpen(); - final boolean isSearchOpen = isSearchOpen(); - - final Fragment leftFragment = getLeftFragment(); - - if (isSearchOpen) { - resetSearchAction(); - } else if (isDrawerOpen) { - super.onBackPressed(); - } else if (leftFragment instanceof OCFileListFragment listOfFiles) { - - // all closed - OCFile currentDir = getCurrentDir(); - if (isRoot(currentDir)) { - finish(); - return; - } - browseUp(listOfFiles); - } else { - popBack(); - } - } - - private void browseUp(OCFileListFragment listOfFiles) { - listOfFiles.onBrowseUp(); - setFile(listOfFiles.getCurrentFile()); - listOfFiles.setFabVisible(true); - listOfFiles.registerFabListener(); - resetTitleBarAndScrolling(); - setDrawerAllFiles(); - } - - private void resetSearchAction() { - Fragment leftFragment = getLeftFragment(); - if (isSearchOpen() && searchView != null) { - searchView.setQuery("", true); - searchView.onActionViewCollapsed(); - searchView.clearFocus(); - - if (isRoot(getCurrentDir()) && leftFragment instanceof OCFileListFragment listOfFiles) { - - // Remove the list to the original state - ArrayList listOfHiddenFiles = listOfFiles.getAdapter().listOfHiddenFiles; - listOfFiles.performSearch("", listOfHiddenFiles, true); - - hideSearchView(getCurrentDir()); - setDrawerIndicatorEnabled(isDrawerIndicatorAvailable()); - } - if (leftFragment instanceof UnifiedSearchFragment) { - showSortListGroup(false); - super.onBackPressed(); - } - } - } - - /** - * Use this method when want to pop the fragment on back press. It resets Scrolling (See - * {@link #resetScrolling(boolean) with true} and pop the visibility for sortListGroup (See - * {@link #showSortListGroup(boolean) with false}. At last call to super.onBackPressed() - */ - private void popBack() { - binding.fabMain.setImageResource(R.drawable.ic_plus); - resetScrolling(true); - showSortListGroup(false); - super.onBackPressed(); - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { - // responsibility of restore is preferred in onCreate() before than in - // onRestoreInstanceState when there are Fragments involved - Log_OC.v(TAG, "onSaveInstanceState() start"); - super.onSaveInstanceState(outState); - outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview); - outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress); - // outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, - // mRefreshSharesInProgress); - outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend); - if (searchView != null) { - outState.putBoolean(KEY_IS_SEARCH_OPEN, !searchView.isIconified()); - } - outState.putString(KEY_SEARCH_QUERY, searchQuery); - outState.putBoolean(KEY_IS_SORT_GROUP_VISIBLE, sortListGroupVisibility()); - Log_OC.v(TAG, "onSaveInstanceState() end"); - } - - @Override - protected void onResume() { - Log_OC.v(TAG, "onResume() start"); - super.onResume(); - // Instead of onPostCreate, starting the loading in onResume for children fragments - Fragment leftFragment = getLeftFragment(); - - // Listen for sync messages - if (!(leftFragment instanceof OCFileListFragment) || !((OCFileListFragment) leftFragment).isSearchFragment()) { - initSyncBroadcastReceiver(); - } - - if (!(leftFragment instanceof OCFileListFragment)) { - if (leftFragment instanceof FileFragment) { - super.updateActionBarTitleAndHomeButton(((FileFragment) leftFragment).getFile()); - } - return; - } - - OCFileListFragment ocFileListFragment = (OCFileListFragment) leftFragment; - - ocFileListFragment.setLoading(mSyncInProgress); - syncAndUpdateFolder(false, true); - - OCFile startFile = null; - if (getIntent() != null) { - OCFile fileArgs = IntentExtensionsKt.getParcelableArgument(getIntent(), EXTRA_FILE, OCFile.class); - if (fileArgs != null) { - startFile = fileArgs; - setFile(startFile); - } - } - - // refresh list of files - if (searchView != null && !TextUtils.isEmpty(searchQuery)) { - searchView.setQuery(searchQuery, false); - } else if (!ocFileListFragment.isSearchFragment() && startFile == null) { - updateListOfFilesFragment(false); - ocFileListFragment.registerFabListener(); - } else { - ocFileListFragment.listDirectory(startFile, false, false); - updateActionBarTitleAndHomeButton(startFile); - } - - // Listen for upload messages - IntentFilter uploadIntentFilter = new IntentFilter(FileUploadWorker.Companion.getUploadFinishMessage()); - mUploadFinishReceiver = new UploadFinishReceiver(); - localBroadcastManager.registerReceiver(mUploadFinishReceiver, uploadIntentFilter); - - // Listen for download messages - IntentFilter downloadIntentFilter = new IntentFilter(FileDownloadWorker.Companion.getDownloadAddedMessage()); - downloadIntentFilter.addAction(FileDownloadWorker.Companion.getDownloadFinishMessage()); - mDownloadFinishReceiver = new DownloadFinishReceiver(); - localBroadcastManager.registerReceiver(mDownloadFinishReceiver, downloadIntentFilter); - - // setup drawer - menuItemId = getIntent().getIntExtra(FileDisplayActivity.DRAWER_MENU_ID, -1); - - if (menuItemId == -1) { - setDrawerAllFiles(); - } else { - if (menuItemId == R.id.nav_all_files || menuItemId == R.id.nav_personal_files) { - setupHomeSearchToolbarWithSortAndListButtons(); - } else { - setupToolbar(); - } - setDrawerMenuItemChecked(menuItemId); - } - - if (ocFileListFragment instanceof GalleryFragment) { - updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_gallery)); - } - //show in-app review dialog to user - inAppReviewHelper.showInAppReview(this); - - Log_OC.v(TAG, "onResume() end"); - } - - private void setDrawerAllFiles() { - if (MainApp.isOnlyPersonFiles()) { - setDrawerMenuItemChecked(R.id.nav_personal_files); - setupHomeSearchToolbarWithSortAndListButtons(); - } else if (MainApp.isOnlyOnDevice()) { - setDrawerMenuItemChecked(R.id.nav_on_device); - setupToolbar(); - } else { - int lastMenuItem = getCheckedMenuItem(); - if (lastMenuItem == Menu.NONE) { - lastMenuItem = R.id.nav_all_files; - } - - setDrawerMenuItemChecked(lastMenuItem); - setupHomeSearchToolbarWithSortAndListButtons(); - } - } - - public void initSyncBroadcastReceiver() { - if (mSyncBroadcastReceiver == null) { - IntentFilter syncIntentFilter = new IntentFilter(FileSyncAdapter.EVENT_FULL_SYNC_START); - syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_END); - syncIntentFilter.addAction(FileSyncAdapter.EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED); - syncIntentFilter.addAction(RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED); - syncIntentFilter.addAction(RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED); - mSyncBroadcastReceiver = new SyncBroadcastReceiver(); - localBroadcastManager.registerReceiver(mSyncBroadcastReceiver, syncIntentFilter); - } - } - - @Override - protected void onPause() { - Log_OC.v(TAG, "onPause() start"); - if (mSyncBroadcastReceiver != null) { - localBroadcastManager.unregisterReceiver(mSyncBroadcastReceiver); - mSyncBroadcastReceiver = null; - } - if (mUploadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(mUploadFinishReceiver); - mUploadFinishReceiver = null; - } - if (mDownloadFinishReceiver != null) { - localBroadcastManager.unregisterReceiver(mDownloadFinishReceiver); - mDownloadFinishReceiver = null; - } - - super.onPause(); - Log_OC.v(TAG, "onPause() end"); - } - - @Override - public void onSortingOrderChosen(FileSortOrder selection) { - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - ocFileListFragment.sortFiles(selection); - } - } - - @Override - public void downloadFile(OCFile file, String packageName, String activityName) { - startDownloadForSending(file, OCFileListFragment.DOWNLOAD_SEND, packageName, activityName); - } - - private class SyncBroadcastReceiver extends BroadcastReceiver { - - /** - * {@link BroadcastReceiver} to enable syncing feedback in UI - */ - @SuppressLint("VisibleForTests") - @Override - public void onReceive(Context context, Intent intent) { - try { - String event = intent.getAction(); - Log_OC.d(TAG, "Received broadcast " + event); - String accountName = intent.getStringExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME); - - String synchFolderRemotePath = intent.getStringExtra(FileSyncAdapter.EXTRA_FOLDER_PATH); - RemoteOperationResult synchResult = (RemoteOperationResult) DataHolderUtil.getInstance().retrieve(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT)); - boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name) && getStorageManager() != null; - - if (sameAccount) { - - if (FileSyncAdapter.EVENT_FULL_SYNC_START.equals(event)) { - mSyncInProgress = true; - - } else { - OCFile currentFile = (getFile() == null) ? null : getStorageManager().getFileByPath(getFile().getRemotePath()); - OCFile currentDir = (getCurrentDir() == null) ? null : getStorageManager().getFileByPath(getCurrentDir().getRemotePath()); - - if (currentDir == null) { - // current folder was removed from the server - DisplayUtils.showSnackMessage(getActivity(), R.string.sync_current_folder_was_removed, synchFolderRemotePath); - - browseToRoot(); - - } else { - if (currentFile == null && !getFile().isFolder()) { - // currently selected file was removed in the server, and now we - // know it - resetTitleBarAndScrolling(); - currentFile = currentDir; - } - - if (currentDir.getRemotePath().equals(synchFolderRemotePath)) { - OCFileListFragment fileListFragment = getListOfFilesFragment(); - if (fileListFragment != null) { - fileListFragment.listDirectory(currentDir, MainApp.isOnlyOnDevice(), false); - } - } - setFile(currentFile); - } - - mSyncInProgress = !FileSyncAdapter.EVENT_FULL_SYNC_END.equals(event) && !RefreshFolderOperation.EVENT_SINGLE_FOLDER_SHARES_SYNCED.equals(event); - - if (RefreshFolderOperation.EVENT_SINGLE_FOLDER_CONTENTS_SYNCED.equals(event) && synchResult != null) { - - if (synchResult.isSuccess()) { - hideInfoBox(); - } else { - // TODO refactor and make common - if (checkForRemoteOperationError(synchResult)) { - requestCredentialsUpdate(context); - } else { - switch (synchResult.getCode()) { - case SSL_RECOVERABLE_PEER_UNVERIFIED: - showUntrustedCertDialog(synchResult); - break; - - case MAINTENANCE_MODE: - showInfoBox(R.string.maintenance_mode); - break; - - case NO_NETWORK_CONNECTION: - showInfoBox(R.string.offline_mode); - break; - - case HOST_NOT_AVAILABLE: - showInfoBox(R.string.host_not_available); - break; - - default: - // nothing to do - break; - } - } - } - } - DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT)); - - Log_OC.d(TAG, "Setting progress visibility to " + mSyncInProgress); - - - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - ocFileListFragment.setLoading(mSyncInProgress); - if (!mSyncInProgress && !ocFileListFragment.isLoading()) { - // update scrolling when load finishes - if (ocFileListFragment.isEmpty()) { - lockScrolling(); - } else { - resetScrolling(false); - } - } - } - setBackgroundText(); - } - } - - if (synchResult != null && synchResult.getCode() == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED) { - mLastSslUntrustedServerResult = synchResult; - } - } catch (RuntimeException e) { - // avoid app crashes after changing the serial id of RemoteOperationResult - // in owncloud library with broadcast notifications pending to process - - try { - DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT)); - } catch (RuntimeException re) { - // we did not send this intent, so ignoring - Log_OC.i(TAG, "Ignoring error deleting data"); - } - } - } - } - - private boolean checkForRemoteOperationError(RemoteOperationResult syncResult) { - return ResultCode.UNAUTHORIZED == syncResult.getCode() || (syncResult.isException() && syncResult.getException() instanceof AuthenticatorException); - } - - /** - * Show a text message on screen view for notifying user if content is loading or folder is empty - */ - private void setBackgroundText() { - final OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - if (mSyncInProgress || getFile().getFileLength() > 0 && getStorageManager().getFolderContent(getFile(), false).isEmpty()) { - ocFileListFragment.setEmptyListLoadingMessage(); - } else { - if (MainApp.isOnlyOnDevice()) { - ocFileListFragment.setMessageForEmptyList(R.string.file_list_empty_headline, R.string.file_list_empty_on_device, R.drawable.ic_list_empty_folder, true); - } else { - ocFileListFragment.setEmptyListMessage(SearchType.NO_SEARCH); - } - } - } else { - Log_OC.e(TAG, "OCFileListFragment is null"); - } - } - - /** - * Once the file upload has finished -> update view - */ - private class UploadFinishReceiver extends BroadcastReceiver { - /** - * Once the file upload has finished -> update view - *

- * {@link BroadcastReceiver} to enable upload feedback in UI - */ - @Override - public void onReceive(Context context, Intent intent) { - String uploadedRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_REMOTE_PATH); - String accountName = intent.getStringExtra(FileUploadWorker.ACCOUNT_NAME); - Account account = getAccount(); - boolean sameAccount = accountName != null && account != null && accountName.equals(account.name); - OCFile currentDir = getCurrentDir(); - boolean isDescendant = currentDir != null && uploadedRemotePath != null && uploadedRemotePath.startsWith(currentDir.getRemotePath()); - - if (sameAccount && isDescendant) { - String linkedToRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH); - if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) { - updateListOfFilesFragment(false); - } - } - - boolean uploadWasFine = intent.getBooleanExtra(FileUploadWorker.EXTRA_UPLOAD_RESULT, false); - boolean renamedInUpload = getFile().getRemotePath().equals(intent.getStringExtra(FileUploadWorker.EXTRA_OLD_REMOTE_PATH)); - - boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) || renamedInUpload; - Fragment details = getLeftFragment(); - - if (sameAccount && sameFile && details instanceof FileDetailFragment) { - if (uploadWasFine) { - setFile(getStorageManager().getFileByPath(uploadedRemotePath)); - } else { - //TODO remove upload progress bar after upload failed. - Log_OC.d(TAG, "Remove upload progress bar after upload failed"); - } - if (renamedInUpload) { - String newName = new File(uploadedRemotePath).getName(); - DisplayUtils.showSnackMessage(getActivity(), R.string.filedetails_renamed_in_upload_msg, newName); - } - if (uploadWasFine || getFile().fileExists()) { - ((FileDetailFragment) details).updateFileDetails(false, true); - } else { - onBackPressed(); - } - - // Force the preview if the file is an image or text file - if (uploadWasFine) { - OCFile ocFile = getFile(); - if (PreviewImageFragment.canBePreviewed(ocFile)) { - startImagePreview(getFile(), true); - } else if (PreviewTextFileFragment.canBePreviewed(ocFile)) { - startTextPreview(ocFile, true); - } - // TODO what about other kind of previews? - } - } - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null) { - ocFileListFragment.setLoading(false); - } - } - - // TODO refactor this receiver, and maybe DownloadFinishReceiver; this method is duplicated :S - private boolean isAscendant(String linkedToRemotePath) { - OCFile currentDir = getCurrentDir(); - return currentDir != null && currentDir.getRemotePath().startsWith(linkedToRemotePath); - } - } - - - /** - * Class waiting for broadcast events from the {@link FileDownloadWorker} service. - *

- * Updates the UI when a download is started or finished, provided that it is relevant for the current folder. - */ - private class DownloadFinishReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - boolean sameAccount = isSameAccount(intent); - String downloadedRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_REMOTE_PATH); - String downloadBehaviour = intent.getStringExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR); - boolean isDescendant = isDescendant(downloadedRemotePath); - - if (sameAccount && isDescendant) { - String linkedToRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_LINKED_TO_PATH); - if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) { - updateListOfFilesFragment(false); - } - refreshDetailsFragmentIfVisible(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, false)); - } - - if (mWaitingToSend != null) { - // update file after downloading - mWaitingToSend = getStorageManager().getFileByRemoteId(mWaitingToSend.getRemoteId()); - if (mWaitingToSend != null && mWaitingToSend.isDown() && OCFileListFragment.DOWNLOAD_SEND.equals(downloadBehaviour)) { - String packageName = intent.getStringExtra(SendShareDialog.PACKAGE_NAME); - String activityName = intent.getStringExtra(SendShareDialog.ACTIVITY_NAME); - - sendDownloadedFile(packageName, activityName); - } - } - - if (mWaitingToPreview != null) { - mWaitingToPreview = getStorageManager().getFileByRemoteId(mWaitingToPreview.getRemoteId()); - if (mWaitingToPreview != null && mWaitingToPreview.isDown() && EditImageActivity.OPEN_IMAGE_EDITOR.equals(downloadBehaviour)) { - startImageEditor(mWaitingToPreview); - } - } - } - - private boolean isDescendant(String downloadedRemotePath) { - OCFile currentDir = getCurrentDir(); - return currentDir != null && downloadedRemotePath != null && downloadedRemotePath.startsWith(currentDir.getRemotePath()); - } - - private boolean isAscendant(String linkedToRemotePath) { - OCFile currentDir = getCurrentDir(); - return currentDir != null && currentDir.getRemotePath().startsWith(linkedToRemotePath); - } - - private boolean isSameAccount(Intent intent) { - String accountName = intent.getStringExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME); - return accountName != null && getAccount() != null && accountName.equals(getAccount().name); - } - } - - - public void browseToRoot() { - OCFileListFragment listOfFiles = getListOfFilesFragment(); - if (listOfFiles != null) { // should never be null, indeed - OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root, MainApp.isOnlyOnDevice(), false); - setFile(listOfFiles.getCurrentFile()); - startSyncFolderOperation(root, false); - } - binding.fabMain.setImageResource(R.drawable.ic_plus); - resetTitleBarAndScrolling(); - } - - - @Override - public void onBrowsedDownTo(OCFile directory) { - setFile(directory); - resetTitleBarAndScrolling(); - // Sync Folder - startSyncFolderOperation(directory, false); - } - - /** - * Shows the information of the {@link OCFile} received as a parameter. - * - * @param file {@link OCFile} whose details will be shown - */ - @Override - public void showDetails(OCFile file) { - showDetails(file, 0); - } - - /** - * Shows the information of the {@link OCFile} received as a parameter. - * - * @param file {@link OCFile} whose details will be shown - * @param activeTab the active tab in the details view - */ - public void showDetails(OCFile file, int activeTab) { - User currentUser = getUser().orElseThrow(RuntimeException::new); - - resetScrolling(true); - - Fragment detailFragment = FileDetailFragment.newInstance(file, currentUser, activeTab); - setLeftFragment(detailFragment, false); - configureToolbarForPreview(file); - } - - /** - * Prevents content scrolling and toolbar collapse - */ - @VisibleForTesting - public void lockScrolling() { - binding.appbar.appbar.setExpanded(true, false); - final AppBarLayout.LayoutParams appbarParams = (AppBarLayout.LayoutParams) binding.appbar.toolbarFrame.getLayoutParams(); - appbarParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL); - binding.appbar.toolbarFrame.setLayoutParams(appbarParams); - } - - /** - * Resets content scrolling and toolbar collapse - */ - @VisibleForTesting - public void resetScrolling(boolean expandAppBar) { - AppBarLayout.LayoutParams appbarParams = (AppBarLayout.LayoutParams) binding.appbar.toolbarFrame.getLayoutParams(); - appbarParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS); - binding.appbar.toolbarFrame.setLayoutParams(appbarParams); - if (expandAppBar) { - binding.appbar.appbar.setExpanded(true, false); - } - } - - @Override - public void updateActionBarTitleAndHomeButton(OCFile chosenFile) { - if (chosenFile == null) { - chosenFile = getFile(); // if no file is passed, current file decides - } - super.updateActionBarTitleAndHomeButton(chosenFile); - } - - @Override - public boolean isDrawerIndicatorAvailable() { - return isRoot(getCurrentDir()); - } - - private void observeWorkerState() { - WorkerStateLiveData.Companion.instance().observe(this, state -> { - if (state instanceof WorkerState.Download) { - Log_OC.d(TAG, "Download worker started"); - handleDownloadWorkerState(); - } else if (state instanceof WorkerState.Idle) { - fileDownloadProgressListener = null; - } - }); - } - - private void handleDownloadWorkerState() { - if (mWaitingToPreview != null && getStorageManager() != null) { - mWaitingToPreview = getStorageManager().getFileById(mWaitingToPreview.getFileId()); - if (mWaitingToPreview != null && !mWaitingToPreview.isDown()) { - requestForDownload(); - } - } - } - - @Override - protected ServiceConnection newTransferenceServiceConnection() { - return new ListServiceConnection(); - } - - /** - * Defines callbacks for service binding, passed to bindService() - * TODO: Check if this can be removed since download and uploads uses work manager now. - */ - private class ListServiceConnection implements ServiceConnection { - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - } - - @Override - public void onServiceDisconnected(ComponentName component) { - if (component.equals(new ComponentName(FileDisplayActivity.this, FileDownloadWorker.class))) { - Log_OC.d(TAG, "Download service disconnected"); - fileDownloadProgressListener = null; - } - } - } - - /** - * Updates the view associated to the activity after the finish of some operation over files in the current - * account. - * - * @param operation Removal operation performed. - * @param result Result of the removal. - */ - @Override - public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - super.onRemoteOperationFinish(operation, result); - - if (operation instanceof RemoveFileOperation) { - onRemoveFileOperationFinish((RemoveFileOperation) operation, result); - } else if (operation instanceof RenameFileOperation) { - onRenameFileOperationFinish((RenameFileOperation) operation, result); - } else if (operation instanceof SynchronizeFileOperation) { - onSynchronizeFileOperationFinish((SynchronizeFileOperation) operation, result); - } else if (operation instanceof CreateFolderOperation) { - onCreateFolderOperationFinish((CreateFolderOperation) operation, result); - } else if (operation instanceof MoveFileOperation) { - onMoveFileOperationFinish((MoveFileOperation) operation, result); - } else if (operation instanceof CopyFileOperation) { - onCopyFileOperationFinish((CopyFileOperation) operation, result); - } else if (operation instanceof RestoreFileVersionRemoteOperation) { - onRestoreFileVersionOperationFinish(result); - } - } - - private void refreshShowDetails() { - Fragment details = getLeftFragment(); - if (details instanceof FileFragment) { - OCFile file = ((FileFragment) details).getFile(); - if (file != null) { - file = getStorageManager().getFileByPath(file.getRemotePath()); - if (details instanceof PreviewTextFragment) { - // Refresh OCFile of the fragment - ((PreviewTextFileFragment) details).updateFile(file); - } else { - showDetails(file); - } - } - supportInvalidateOptionsMenu(); - } - } - - /** - * Updates the view associated to the activity after the finish of an operation trying to remove a file. - * - * @param operation Removal operation performed. - * @param result Result of the removal. - */ - private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) { - - if (!operation.isInBackground()) { - DisplayUtils.showSnackMessage(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())); - } - - if (result.isSuccess()) { - OCFile removedFile = operation.getFile(); - tryStopPlaying(removedFile); - Fragment leftFragment = getLeftFragment(); - - // check if file is still available, if so do nothing - boolean fileAvailable = getStorageManager().fileExists(removedFile.getFileId()); - if (leftFragment instanceof FileFragment && !fileAvailable && removedFile.equals(((FileFragment) leftFragment).getFile())) { - setFile(getStorageManager().getFileById(removedFile.getParentId())); - resetTitleBarAndScrolling(); - } - OCFile parentFile = getStorageManager().getFileById(removedFile.getParentId()); - if (parentFile != null && parentFile.equals(getCurrentDir())) { - updateListOfFilesFragment(false); - } else if (getLeftFragment() instanceof GalleryFragment galleryFragment) { - galleryFragment.onRefresh(); - } - supportInvalidateOptionsMenu(); - } else { - if (result.isSslRecoverableException()) { - mLastSslUntrustedServerResult = result; - showUntrustedCertDialog(mLastSslUntrustedServerResult); - } - } - } - - private void onRestoreFileVersionOperationFinish(RemoteOperationResult result) { - if (result.isSuccess()) { - OCFile file = getFile(); - - // delete old local copy - if (file.isDown()) { - List list = new ArrayList<>(); - list.add(file); - getFileOperationsHelper().removeFiles(list, true, true); - - // download new version, only if file was previously download - getFileOperationsHelper().syncFile(file); - } - - OCFile parent = getStorageManager().getFileById(file.getParentId()); - startSyncFolderOperation(parent, true, true); - - Fragment leftFragment = getLeftFragment(); - if (leftFragment instanceof FileDetailFragment) { - FileDetailFragment fileDetailFragment = (FileDetailFragment) leftFragment; - fileDetailFragment.getFileDetailActivitiesFragment().reload(); - } - - DisplayUtils.showSnackMessage(this, R.string.file_version_restored_successfully); - } else { - DisplayUtils.showSnackMessage(this, R.string.file_version_restored_error); - } - } - - private void tryStopPlaying(OCFile file) { - // placeholder for stop-on-delete future code - if (mPlayerConnection != null && MimeTypeUtil.isAudio(file) && mPlayerConnection.isPlaying()) { - mPlayerConnection.stop(file); - } - } - - /** - * Updates the view associated to the activity after the finish of an operation trying to move a file. - * - * @param operation Move operation performed. - * @param result Result of the move operation. - */ - private void onMoveFileOperationFinish(MoveFileOperation operation, RemoteOperationResult result) { - if (result.isSuccess()) { - syncAndUpdateFolder(true); - } else { - try { - DisplayUtils.showSnackMessage(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())); - - } catch (NotFoundException e) { - Log_OC.e(TAG, "Error while trying to show fail message ", e); - } - } - } - - /** - * Updates the view associated to the activity after the finish of an operation trying to copy a file. - * - * @param operation Copy operation performed. - * @param result Result of the copy operation. - */ - private void onCopyFileOperationFinish(CopyFileOperation operation, RemoteOperationResult result) { - if (result.isSuccess()) { - updateListOfFilesFragment(false); - } else { - try { - DisplayUtils.showSnackMessage(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())); - - } catch (NotFoundException e) { - Log_OC.e(TAG, "Error while trying to show fail message ", e); - } - } - } - - /** - * Updates the view associated to the activity after the finish of an operation trying to rename a file. - * - * @param operation Renaming operation performed. - * @param result Result of the renaming. - */ - private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) { - Optional optionalUser = getUser(); - OCFile renamedFile = operation.getFile(); - if (result.isSuccess() && optionalUser.isPresent()) { - final User currentUser = optionalUser.get(); - Fragment leftFragment = getLeftFragment(); - if (leftFragment instanceof FileFragment) { - final FileFragment fileFragment = (FileFragment) leftFragment; - if (fileFragment instanceof FileDetailFragment && renamedFile.equals(fileFragment.getFile())) { - ((FileDetailFragment) fileFragment).updateFileDetails(renamedFile, currentUser); - showDetails(renamedFile); - - } else if (fileFragment instanceof PreviewMediaFragment && renamedFile.equals(fileFragment.getFile())) { - ((PreviewMediaFragment) fileFragment).updateFile(renamedFile); - if (PreviewMediaFragment.canBePreviewed(renamedFile)) { - long position = ((PreviewMediaFragment) fileFragment).getPosition(); - startMediaPreview(renamedFile, position, true, true, true, false); - } else { - getFileOperationsHelper().openFile(renamedFile); - } - } else if (fileFragment instanceof PreviewTextFragment && renamedFile.equals(fileFragment.getFile())) { - ((PreviewTextFileFragment) fileFragment).updateFile(renamedFile); - if (PreviewTextFileFragment.canBePreviewed(renamedFile)) { - startTextPreview(renamedFile, true); - } else { - getFileOperationsHelper().openFile(renamedFile); - } - } - } - - OCFile file = getStorageManager().getFileById(renamedFile.getParentId()); - if (file != null && file.equals(getCurrentDir())) { - updateListOfFilesFragment(false); - } - - } else { - DisplayUtils.showSnackMessage(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())); - - if (result.isSslRecoverableException()) { - mLastSslUntrustedServerResult = result; - showUntrustedCertDialog(mLastSslUntrustedServerResult); - } - } - } - - - private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) { - if (result.isSuccess() && operation.transferWasRequested()) { - OCFile syncedFile = operation.getLocalFile(); - onTransferStateChanged(syncedFile, true, true); - supportInvalidateOptionsMenu(); - refreshShowDetails(); - } - } - - /** - * Updates the view associated to the activity after the finish of an operation trying create a new folder - * - * @param operation Creation operation performed. - * @param result Result of the creation. - */ - private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) { - if (result.isSuccess()) { - OCFileListFragment fileListFragment = getListOfFilesFragment(); - if (fileListFragment != null) { - fileListFragment.onItemClicked(getStorageManager().getFileByDecryptedRemotePath(operation.getRemotePath())); - } - } else { - try { - if (ResultCode.FOLDER_ALREADY_EXISTS == result.getCode()) { - DisplayUtils.showSnackMessage(this, R.string.folder_already_exists); - } else { - DisplayUtils.showSnackMessage(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources())); - } - } catch (NotFoundException e) { - Log_OC.e(TAG, "Error while trying to show fail message ", e); - } - } - } - - - /** - * {@inheritDoc} - */ - @Override - public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { - updateListOfFilesFragment(false); - Fragment leftFragment = getLeftFragment(); - Optional optionalUser = getUser(); - if (leftFragment instanceof FileDetailFragment && file.equals(((FileDetailFragment) leftFragment).getFile()) && optionalUser.isPresent()) { - final User currentUser = optionalUser.get(); - if (downloading || uploading) { - ((FileDetailFragment) leftFragment).updateFileDetails(file, currentUser); - } else { - if (!file.fileExists()) { - resetTitleBarAndScrolling(); - } else { - ((FileDetailFragment) leftFragment).updateFileDetails(false, true); - } - } - } - - } - - - private void requestForDownload() { - User user = getUser().orElseThrow(RuntimeException::new); - FileDownloadHelper.Companion.instance().downloadFileIfNotStartedBefore(user, mWaitingToPreview); - } - - @Override - public void onSavedCertificate() { - startSyncFolderOperation(getCurrentDir(), false); - } - - /** - * Starts an operation to refresh the requested folder. - *

- * The operation is run in a new background thread created on the fly. - *

- * The refresh updates is a "light sync": properties of regular files in folder are updated (including associated - * shares), but not their contents. Only the contents of files marked to be kept-in-sync are synchronized too. - * - * @param folder Folder to refresh. - * @param ignoreETag If 'true', the data from the server will be fetched and sync'ed even if the eTag didn't - * change. - */ - public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) { - startSyncFolderOperation(folder, ignoreETag, false); - } - - /** - * Starts an operation to refresh the requested folder. - *

- * The operation is run in a new background thread created on the fly. - *

- * The refresh updates is a "light sync": properties of regular files in folder are updated (including associated - * shares), but not their contents. Only the contents of files marked to be kept-in-sync are synchronized too. - * - * @param folder Folder to refresh. - * @param ignoreETag If 'true', the data from the server will be fetched and sync'ed even if the eTag didn't - * change. - * @param ignoreFocus reloads file list even without focus, e.g. on tablet mode, focus can still be in detail view - */ - public void startSyncFolderOperation(final OCFile folder, final boolean ignoreETag, boolean ignoreFocus) { - - // the execution is slightly delayed to allow the activity get the window focus if it's being started - // or if the method is called from a dialog that is being dismissed - if (TextUtils.isEmpty(searchQuery) && getUser().isPresent()) { - getHandler().postDelayed(() -> { - Optional user = getUser(); - - if (!ignoreFocus && !hasWindowFocus() || !user.isPresent()) { - // do not refresh if the user rotates the device while another window has focus - // or if the current user is no longer valid - return; - } - - long currentSyncTime = System.currentTimeMillis(); - mSyncInProgress = true; - - // perform folder synchronization - RemoteOperation refreshFolderOperation = new RefreshFolderOperation(folder, currentSyncTime, false, ignoreETag, getStorageManager(), user.get(), getApplicationContext()); - refreshFolderOperation.execute(getAccount(), MainApp.getAppContext(), FileDisplayActivity.this, null, null); - - OCFileListFragment fragment = getListOfFilesFragment(); - - if (fragment != null && !(fragment instanceof GalleryFragment)) { - fragment.setLoading(true); - } - - setBackgroundText(); - }, DELAY_TO_REQUEST_REFRESH_OPERATION_LATER); - } - } - - private void requestForDownload(OCFile file, String downloadBehaviour, String packageName, String activityName) { - final User currentUser = getUser().orElseThrow(RuntimeException::new); - if (!FileDownloadHelper.Companion.instance().isDownloading(currentUser, file)) { - FileDownloadHelper.Companion.instance().downloadFile(currentUser, file, downloadBehaviour, DownloadType.DOWNLOAD, activityName, packageName, null); - } - } - - private void sendDownloadedFile(String packageName, String activityName) { - if (mWaitingToSend != null) { - - Intent sendIntent = IntentUtil.createSendIntent(this, mWaitingToSend); - sendIntent.setComponent(new ComponentName(packageName, activityName)); - - // Show dialog - String sendTitle = getString(R.string.activity_chooser_send_file_title); - startActivity(Intent.createChooser(sendIntent, sendTitle)); - } else { - Log_OC.e(TAG, "Trying to send a NULL OCFile"); - } - - mWaitingToSend = null; - } - - /** - * Requests the download of the received {@link OCFile} , updates the UI to monitor the download progress and - * prepares the activity to send the file when the download finishes. - * - * @param file {@link OCFile} to download and preview. - * @param packageName - * @param activityName - */ - public void startDownloadForSending(OCFile file, String downloadBehaviour, String packageName, String activityName) { - mWaitingToSend = file; - requestForDownload(mWaitingToSend, downloadBehaviour, packageName, activityName); - } - - public void startImagePreview(OCFile file, boolean showPreview) { - Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); - showDetailsIntent.putExtra(EXTRA_FILE, file); - showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo); - showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new)); - if (showPreview) { - startActivity(showDetailsIntent); - } else { - FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager(), connectivityService, editorUtils); - fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent); - } - } - - public void startImagePreview(OCFile file, VirtualFolderType type, boolean showPreview) { - Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); - showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_FILE, file); - showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo); - showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new)); - showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type); - - if (showPreview) { - startActivity(showDetailsIntent); - } else { - FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, - getUserAccountManager(), - connectivityService, - editorUtils); - fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent); - } - } - - /** - * Stars the preview of an already down media {@link OCFile}. - * - * @param file Media {@link OCFile} to preview. - * @param startPlaybackPosition Media position where the playback will be started, in milliseconds. - * @param autoplay When 'true', the playback will start without user interactions. - */ - public void startMediaPreview(OCFile file, long startPlaybackPosition, boolean autoplay, boolean showPreview, boolean streamMedia, boolean showInActivity) { - Optional user = getUser(); - if (!user.isPresent()) { - return; // not reachable under normal conditions - } - if (showPreview && file.isDown() && !file.isDownloading() || streamMedia) { - if (showInActivity) { - startMediaActivity(file, startPlaybackPosition, autoplay, user); - } else { - configureToolbarForPreview(file); - Fragment mediaFragment = PreviewMediaFragment.newInstance(file, user.get(), startPlaybackPosition, autoplay, false); - setLeftFragment(mediaFragment, false); - } - } else { - Intent previewIntent = new Intent(); - previewIntent.putExtra(EXTRA_FILE, file); - previewIntent.putExtra(PreviewMediaFragment.EXTRA_START_POSITION, startPlaybackPosition); - previewIntent.putExtra(PreviewMediaFragment.EXTRA_AUTOPLAY, autoplay); - FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager(), connectivityService, editorUtils); - fileOperationsHelper.startSyncForFileAndIntent(file, previewIntent); - } - } - - private void startMediaActivity(OCFile file, long startPlaybackPosition, boolean autoplay, Optional user) { - Intent previewMediaIntent = new Intent(this, PreviewMediaActivity.class); - previewMediaIntent.putExtra(PreviewMediaActivity.EXTRA_FILE, file); - previewMediaIntent.putExtra(PreviewMediaActivity.EXTRA_USER, user.get()); - previewMediaIntent.putExtra(PreviewMediaActivity.EXTRA_START_POSITION, startPlaybackPosition); - previewMediaIntent.putExtra(PreviewMediaActivity.EXTRA_AUTOPLAY, autoplay); - startActivity(previewMediaIntent); - } - - public void configureToolbarForPreview(OCFile file) { - lockScrolling(); - super.updateActionBarTitleAndHomeButton(file); - } - - /** - * Starts the preview of a text file {@link OCFile}. - * - * @param file Text {@link OCFile} to preview. - */ - public void startTextPreview(OCFile file, boolean showPreview) { - Optional optUser = getUser(); - if (!optUser.isPresent()) { - // remnants of old unsafe system; do not crash, silently stop - return; - } - User user = optUser.get(); - if (showPreview) { - PreviewTextFileFragment fragment = PreviewTextFileFragment.create(user, file, searchOpen, searchQuery); - setLeftFragment(fragment, false); - configureToolbarForPreview(file); - } else { - Intent previewIntent = new Intent(); - previewIntent.putExtra(EXTRA_FILE, file); - previewIntent.putExtra(TEXT_PREVIEW, true); - FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager(), connectivityService, editorUtils); - fileOperationsHelper.startSyncForFileAndIntent(file, previewIntent); - } - } - - /** - * Starts rich workspace preview for a folder. - * - * @param folder {@link OCFile} to preview its rich workspace. - */ - public void startRichWorkspacePreview(OCFile folder) { - Bundle args = new Bundle(); - args.putParcelable(EXTRA_FILE, folder); - configureToolbarForPreview(folder); - Fragment textPreviewFragment = Fragment.instantiate(getApplicationContext(), PreviewTextStringFragment.class.getName(), args); - setLeftFragment(textPreviewFragment, false); - } - - public void startContactListFragment(OCFile file) { - final User user = getUser().orElseThrow(RuntimeException::new); - ContactsPreferenceActivity.startActivityWithContactsFile(this, user, file); - } - - public void startPdfPreview(OCFile file) { - if (getFileOperationsHelper().canOpenFile(file)) { - // prefer third party PDF apps - getFileOperationsHelper().openFile(file); - } else { - final Fragment pdfFragment = PreviewPdfFragment.newInstance(file); - - setLeftFragment(pdfFragment, false); - configureToolbarForPreview(file); - setMainFabVisible(false); - } - } - - - /** - * Requests the download of the received {@link OCFile} , updates the UI to monitor the download progress and - * prepares the activity to preview or open the file when the download finishes. - * - * @param file {@link OCFile} to download and preview. - * @param parentFolder {@link OCFile} containing above file - */ - public void startDownloadForPreview(OCFile file, OCFile parentFolder) { - final User currentUser = getUser().orElseThrow(RuntimeException::new); - Fragment detailFragment = FileDetailFragment.newInstance(file, parentFolder, currentUser); - setLeftFragment(detailFragment, false); - configureToolbarForPreview(file); - mWaitingToPreview = file; - requestForDownload(); - setFile(file); - } - - - /** - * Opens EditImageActivity with given file loaded. If file is not available locally, it will be synced before - * opening the image editor. - * - * @param file {@link OCFile} (image) to be loaded into image editor - */ - public void startImageEditor(OCFile file) { - if (file.isDown()) { - Intent editImageIntent = new Intent(this, EditImageActivity.class); - editImageIntent.putExtra(EditImageActivity.EXTRA_FILE, file); - startActivity(editImageIntent); - } else { - mWaitingToPreview = file; - requestForDownload(file, EditImageActivity.OPEN_IMAGE_EDITOR, getPackageName(), this.getClass().getSimpleName()); - updateActionBarTitleAndHomeButton(file); - setFile(file); - } - } - - - /** - * Request stopping the upload/download operation in progress over the given {@link OCFile} file. - * - * @param file {@link OCFile} file which operation are wanted to be cancel - */ - public void cancelTransference(OCFile file) { - getFileOperationsHelper().cancelTransference(file); - if (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(file.getRemotePath())) { - mWaitingToPreview = null; - } - if (mWaitingToSend != null && mWaitingToSend.getRemotePath().equals(file.getRemotePath())) { - mWaitingToSend = null; - } - onTransferStateChanged(file, false, false); - } - - /** - * Request stopping all upload/download operations in progress over the given {@link OCFile} files. - * - * @param files collection of {@link OCFile} files which operations are wanted to be cancel - */ - public void cancelTransference(Collection files) { - for (OCFile file : files) { - cancelTransference(file); - } - } - - @Override - public void onRefresh(boolean ignoreETag) { - syncAndUpdateFolder(ignoreETag); - } - - @Override - public void onRefresh() { - syncAndUpdateFolder(true); - } - - private void syncAndUpdateFolder(boolean ignoreETag) { - syncAndUpdateFolder(ignoreETag, false); - } - - private void syncAndUpdateFolder(boolean ignoreETag, boolean ignoreFocus) { - OCFileListFragment listOfFiles = getListOfFilesFragment(); - if (listOfFiles != null && !listOfFiles.isSearchFragment()) { - OCFile folder = listOfFiles.getCurrentFile(); - if (folder != null) { - startSyncFolderOperation(folder, ignoreETag, ignoreFocus); - } - } - } - - @Override - public void showFiles(boolean onDeviceOnly, boolean personalFiles) { - super.showFiles(onDeviceOnly, personalFiles); - if (onDeviceOnly) { - updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_on_device)); - } - OCFileListFragment ocFileListFragment = getListOfFilesFragment(); - if (ocFileListFragment != null && !(ocFileListFragment instanceof GalleryFragment) && !(ocFileListFragment instanceof SharedListFragment)) { - ocFileListFragment.refreshDirectory(); - } else { - setLeftFragment(new OCFileListFragment()); - } - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onMessageEvent(final SearchEvent event) { - if (SearchRemoteOperation.SearchType.PHOTO_SEARCH == event.getSearchType()) { - Log_OC.d(this, "Switch to photo search fragment"); - setLeftFragment(new GalleryFragment()); - } else if (event.getSearchType() == SearchRemoteOperation.SearchType.SHARED_FILTER) { - Log_OC.d(this, "Switch to Shared fragment"); - setLeftFragment(new SharedListFragment()); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onMessageEvent(SyncEventFinished event) { - Bundle bundle = event.getIntent().getExtras(); - if (event.getIntent().getBooleanExtra(TEXT_PREVIEW, false)) { - startTextPreview((OCFile) bundle.get(EXTRA_FILE), true); - } else if (bundle.containsKey(PreviewMediaFragment.EXTRA_START_POSITION)) { - startMediaPreview((OCFile) bundle.get(EXTRA_FILE), (long) bundle.get(PreviewMediaFragment.EXTRA_START_POSITION), (boolean) bundle.get(PreviewMediaFragment.EXTRA_AUTOPLAY), true, true, true); - } else if (bundle.containsKey(PreviewImageActivity.EXTRA_VIRTUAL_TYPE)) { - startImagePreview((OCFile) bundle.get(EXTRA_FILE), (VirtualFolderType) bundle.get(PreviewImageActivity.EXTRA_VIRTUAL_TYPE), true); - } else { - startImagePreview((OCFile) bundle.get(EXTRA_FILE), true); - } - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onMessageEvent(TokenPushEvent event) { - if (!preferences.isKeysReInitEnabled()) { - PushUtils.reinitKeys(getUserAccountManager()); - } else { - PushUtils.pushRegistrationToServer(getUserAccountManager(), preferences.getPushToken()); - } - } - - @Override - public void onStart() { - super.onStart(); - final Optional optionalUser = getUser(); - final FileDataStorageManager storageManager = getStorageManager(); - if (optionalUser.isPresent() && storageManager != null) { - /// Check whether the 'main' OCFile handled by the Activity is contained in the - // current Account - OCFile file = getFile(); - // get parent from path - String parentPath = ""; - if (file != null) { - if (file.isDown() && file.getLastSyncDateForProperties() == 0) { - // upload in progress - right now, files are not inserted in the local - // cache until the upload is successful get parent from path - parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName())); - if (storageManager.getFileByPath(parentPath) == null) { - file = null; // not able to know the directory where the file is uploading - } - } else { - file = storageManager.getFileByPath(file.getRemotePath()); - // currentDir = null if not in the current Account - } - } - if (file == null) { - // fall back to root folder - file = storageManager.getFileByPath(OCFile.ROOT_PATH); // never returns null - } - setFile(file); - - User user = optionalUser.get(); - setupDrawer(); - - mSwitchAccountButton.setTag(user.getAccountName()); - DisplayUtils.setAvatar(user, this, getResources().getDimension(R.dimen.nav_drawer_menu_avatar_radius), getResources(), mSwitchAccountButton, this); - final boolean userChanged = !user.nameEquals(lastDisplayedUser.orElse(null)); - if (userChanged) { - Log_OC.d(TAG, "Initializing Fragments in onAccountChanged.."); - initFragments(); - if (file.isFolder() && TextUtils.isEmpty(searchQuery)) { - startSyncFolderOperation(file, false); - } - } else { - updateActionBarTitleAndHomeButton(file.isFolder() ? null : file); - } - } - lastDisplayedUser = optionalUser; - - EventBus.getDefault().post(new TokenPushEvent()); - checkForNewDevVersionNecessary(getApplicationContext()); - } - - private void registerRefreshFolderEventReceiver() { - IntentFilter filter = new IntentFilter(REFRESH_FOLDER_EVENT_RECEIVER); - LocalBroadcastManager.getInstance(this).registerReceiver(refreshFolderEventReceiver, filter); - } - - private final BroadcastReceiver refreshFolderEventReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - syncAndUpdateFolder(true); - } - }; - - @Override - protected void onDestroy() { - LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshFolderEventReceiver); - super.onDestroy(); - } - - @Override - protected void onRestart() { - super.onRestart(); - - checkForNewDevVersionNecessary(getApplicationContext()); - } - - public void setSearchQuery(String query) { - searchQuery = query; - } - - private void handleOpenFileViaIntent(Intent intent) { - showLoadingDialog(getString(R.string.retrieving_file)); - - String userName = intent.getStringExtra(KEY_ACCOUNT); - String fileId = intent.getStringExtra(KEY_FILE_ID); - String filePath = intent.getStringExtra(KEY_FILE_PATH); - - if (userName == null && fileId == null && intent.getData() != null) { - openDeepLink(intent.getData()); - } else { - Optional optionalUser = userName == null ? getUser() : getUserAccountManager().getUser(userName); - if (optionalUser.isPresent()) { - if (!TextUtils.isEmpty(fileId)) { - openFile(optionalUser.get(), fileId); - } else if (!TextUtils.isEmpty(filePath)) { - openFileByPath(optionalUser.get(), filePath); - } else { - dismissLoadingDialog(); - accountClicked(optionalUser.get().hashCode()); - } - } else { - dismissLoadingDialog(); - DisplayUtils.showSnackMessage(this, getString(R.string.associated_account_not_found)); - } - } - } - - private void openDeepLink(Uri uri) { - DeepLinkHandler linkHandler = new DeepLinkHandler(getUserAccountManager()); - DeepLinkHandler.Match match = linkHandler.parseDeepLink(uri); - if (match == null) { - dismissLoadingDialog(); - DisplayUtils.showSnackMessage(this, getString(R.string.invalid_url)); - } else if (match.getUsers().isEmpty()) { - dismissLoadingDialog(); - DisplayUtils.showSnackMessage(this, getString(R.string.associated_account_not_found)); - } else if (match.getUsers().size() == SINGLE_USER_SIZE) { - openFile(match.getUsers().get(0), match.getFileId()); - } else { - selectUserAndOpenFile(match.getUsers(), match.getFileId()); - } - } - - private void selectUserAndOpenFile(List users, String fileId) { - final CharSequence[] userNames = new CharSequence[users.size()]; - for (int i = 0; i < userNames.length; i++) { - userNames[i] = users.get(i).getAccountName(); - } - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.common_choose_account).setItems(userNames, (dialog, which) -> { - User user = users.get(which); - openFile(user, fileId); - showLoadingDialog(getString(R.string.retrieving_file)); - }); - final AlertDialog dialog = builder.create(); - dismissLoadingDialog(); - dialog.show(); - } - - private void openFile(User user, String fileId) { - setUser(user); - - if (fileId == null) { - onFileRequestError(null); - return; - } - - FileDataStorageManager storageManager = getStorageManager(); - - if (storageManager == null) { - storageManager = new FileDataStorageManager(user, getContentResolver()); - } - - FetchRemoteFileTask fetchRemoteFileTask = new FetchRemoteFileTask(user, fileId, storageManager, this); - fetchRemoteFileTask.execute(); - } - - private void openFileByPath(User user, String filepath) { - setUser(user); - - if (filepath == null) { - onFileRequestError(null); - return; - } - - FileDataStorageManager storageManager = getStorageManager(); - - if (storageManager == null) { - storageManager = new FileDataStorageManager(user, getContentResolver()); - } - - OwnCloudClient client; - try { - client = clientFactory.create(user); - } catch (ClientFactory.CreationException e) { - onFileRequestError(null); - return; - } - - GetRemoteFileTask getRemoteFileTask = new GetRemoteFileTask(this, filepath, client, storageManager, user); - asyncRunner.postQuickTask(getRemoteFileTask, this::onFileRequestResult, this::onFileRequestError); - } - - private Unit onFileRequestError(Throwable throwable) { - dismissLoadingDialog(); - DisplayUtils.showSnackMessage(this, getString(R.string.error_retrieving_file)); - Log_OC.e(TAG, "Requesting file from remote failed!", throwable); - return null; - } - - - private Unit onFileRequestResult(GetRemoteFileTask.Result result) { - dismissLoadingDialog(); - - setFile(result.getFile()); - - OCFileListFragment fileFragment = new OCFileListFragment(); - setLeftFragment(fileFragment); - - getSupportFragmentManager().executePendingTransactions(); - - fileFragment.onItemClicked(result.getFile()); - - return null; - } - - public void performUnifiedSearch(String query, ArrayList listOfHiddenFiles) { - UnifiedSearchFragment unifiedSearchFragment = UnifiedSearchFragment.Companion.newInstance(query, listOfHiddenFiles); - setLeftFragment(unifiedSearchFragment, false); - } - - public void setMainFabVisible(final boolean visible) { - final int visibility = visible ? View.VISIBLE : View.GONE; - binding.fabMain.setVisibility(visibility); - } - - public void showFile(OCFile selectedFile, String message) { - dismissLoadingDialog(); - - OCFileListFragment listOfFiles = getOCFileListFragmentFromFile(); - - if (TextUtils.isEmpty(message)) { - OCFile temp = getFile(); - setFile(getCurrentDir()); - listOfFiles.listDirectory(getCurrentDir(), temp, MainApp.isOnlyOnDevice(), false); - updateActionBarTitleAndHomeButton(null); - } else { - DisplayUtils.showSnackMessage(listOfFiles.getView(), message); - } - - if (selectedFile != null) { - listOfFiles.onItemClicked(selectedFile); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java deleted file mode 100644 index 03492fa..0000000 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-FileCopyrightText: 2020 Chris Narkiewicz - * SPDX-FileCopyrightText: 2020 Chawki Chouib - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2016-2018 Andy Scherzinger - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.activity; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AccountManagerCallback; -import android.accounts.AccountManagerFuture; -import android.accounts.OperationCanceledException; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.Bundle; -import android.os.Handler; -import android.view.MenuItem; -import android.view.View; - -import com.google.common.collect.Sets; -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.jobs.BackgroundJobManager; -import com.nextcloud.client.jobs.download.FileDownloadHelper; -import com.nextcloud.client.onboarding.FirstRunActivity; -import com.nextcloud.model.WorkerState; -import com.nextcloud.model.WorkerStateLiveData; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.authentication.AuthenticatorActivity; -import com.owncloud.android.datamodel.ArbitraryDataProvider; -import com.owncloud.android.datamodel.ArbitraryDataProviderImpl; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.UserInfo; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.operations.DownloadFileOperation; -import com.owncloud.android.services.OperationsService; -import com.owncloud.android.ui.adapter.UserListAdapter; -import com.owncloud.android.ui.adapter.UserListItem; -import com.owncloud.android.ui.dialog.AccountRemovalDialog; -import com.owncloud.android.ui.events.AccountRemovedEvent; -import com.owncloud.android.ui.helpers.FileOperationsHelper; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import javax.inject.Inject; - -import androidx.annotation.VisibleForTesting; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.PopupMenu; -import androidx.fragment.app.FragmentManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import static com.owncloud.android.ui.activity.UserInfoActivity.KEY_USER_DATA; -import static com.owncloud.android.ui.adapter.UserListAdapter.KEY_DISPLAY_NAME; -import static com.owncloud.android.ui.adapter.UserListAdapter.KEY_USER_INFO_REQUEST_CODE; - -/** - * An Activity that allows the user to manage accounts. - */ -public class ManageAccountsActivity extends FileActivity implements UserListAdapter.Listener, - AccountManagerCallback, - ComponentsGetter, - UserListAdapter.ClickListener { - private static final String TAG = ManageAccountsActivity.class.getSimpleName(); - - public static final String KEY_ACCOUNT_LIST_CHANGED = "ACCOUNT_LIST_CHANGED"; - public static final String KEY_CURRENT_ACCOUNT_CHANGED = "CURRENT_ACCOUNT_CHANGED"; - public static final String PENDING_FOR_REMOVAL = UserAccountManager.PENDING_FOR_REMOVAL; - - private static final int KEY_DELETE_CODE = 101; - private static final int SINGLE_ACCOUNT = 1; - private static final int MIN_MULTI_ACCOUNT_SIZE = 2; - - private RecyclerView recyclerView; - private final Handler handler = new Handler(); - private String accountName; - private UserListAdapter userListAdapter; - private Set originalUsers; - private String originalCurrentUser; - - private ArbitraryDataProvider arbitraryDataProvider; - private boolean multipleAccountsSupported; - - private String workerAccountName; - private DownloadFileOperation workerCurrentDownload; - - @Inject BackgroundJobManager backgroundJobManager; - @Inject UserAccountManager accountManager; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.accounts_layout); - - recyclerView = findViewById(R.id.account_list); - - setupToolbar(); - - // set the back button from action bar - ActionBar actionBar = getSupportActionBar(); - - // check if is not null - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(true); - viewThemeUtils.files.themeActionBar(this, actionBar, R.string.prefs_manage_accounts); - } - - List users = accountManager.getAllUsers(); - originalUsers = toAccountNames(users); - - Optional currentUser = getUser(); - if (currentUser.isPresent()) { - originalCurrentUser = currentUser.get().getAccountName(); - } - - arbitraryDataProvider = new ArbitraryDataProviderImpl(this); - - multipleAccountsSupported = getResources().getBoolean(R.bool.multiaccount_support); - - userListAdapter = new UserListAdapter(this, - accountManager, - getUserListItems(), - this, - multipleAccountsSupported, - true, - true, - viewThemeUtils); - - recyclerView.setAdapter(userListAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); - observeWorkerState(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == KEY_DELETE_CODE && data != null) { - Bundle bundle = data.getExtras(); - if (bundle != null && bundle.containsKey(UserInfoActivity.KEY_ACCOUNT)) { - final Account account = BundleExtensionsKt.getParcelableArgument(bundle, UserInfoActivity.KEY_ACCOUNT, Account.class); - if (account != null) { - User user = accountManager.getUser(account.name).orElseThrow(RuntimeException::new); - accountName = account.name; - performAccountRemoval(user); - } - } - } - } - - @Override - public void onBackPressed() { - Intent resultIntent = new Intent(); - if (accountManager.getAllUsers().size() > 0) { - resultIntent.putExtra(KEY_ACCOUNT_LIST_CHANGED, hasAccountListChanged()); - resultIntent.putExtra(KEY_CURRENT_ACCOUNT_CHANGED, hasCurrentAccountChanged()); - setResult(RESULT_OK, resultIntent); - - super.onBackPressed(); - } else { - final Intent intent = new Intent(this, AuthenticatorActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - finish(); - } - } - - /** - * checks the set of actual accounts against the set of original accounts when the activity has been started. - * - * @return true if account list has changed, false if not - */ - private boolean hasAccountListChanged() { - List users = accountManager.getAllUsers(); - List newList = new ArrayList<>(); - for (User user : users) { - boolean pendingForRemoval = arbitraryDataProvider.getBooleanValue(user, PENDING_FOR_REMOVAL); - - if (!pendingForRemoval) { - newList.add(user); - } - } - Set actualAccounts = toAccountNames(newList); - return !originalUsers.equals(actualAccounts); - } - - private static Set toAccountNames(Collection users) { - Set accountNames = Sets.newHashSetWithExpectedSize(users.size()); - for (User user : users) { - accountNames.add(user.getAccountName()); - } - return accountNames; - } - - /** - * checks actual current account against current accounts when the activity has been started. - * - * @return true if account list has changed, false if not - */ - private boolean hasCurrentAccountChanged() { - User user = getUserAccountManager().getUser(); - if (user.isAnonymous()) { - return true; - } else { - return !user.getAccountName().equals(originalCurrentUser); - } - } - - private List getUserListItems() { - List users = accountManager.getAllUsers(); - List userListItems = new ArrayList<>(users.size()); - for (User user : users) { - boolean pendingForRemoval = arbitraryDataProvider.getBooleanValue(user, PENDING_FOR_REMOVAL); - userListItems.add(new UserListItem(user, !pendingForRemoval)); - } - - if (getResources().getBoolean(R.bool.multiaccount_support)) { - userListItems.add(new UserListItem()); - } - - return userListItems; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - boolean retval = true; - - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - } else { - retval = super.onOptionsItemSelected(item); - } - - return retval; - } - - @Override - public void showFirstRunActivity() { - Intent firstRunIntent = new Intent(getApplicationContext(), FirstRunActivity.class); - firstRunIntent.putExtra(FirstRunActivity.EXTRA_ALLOW_CLOSE, true); - startActivity(firstRunIntent); - } - - @Override - public void startAccountCreation() { - AccountManager am = AccountManager.get(getApplicationContext()); - am.addAccount(MainApp.getAccountType(this), - null, - null, - null, - this, - future -> { - if (future != null) { - try { - Bundle result = future.getResult(); - String name = result.getString(AccountManager.KEY_ACCOUNT_NAME); - accountManager.setCurrentOwnCloudAccount(name); - userListAdapter = new UserListAdapter( - this, - accountManager, - getUserListItems(), - this, - multipleAccountsSupported, - false, - true, - viewThemeUtils); - recyclerView.setAdapter(userListAdapter); - runOnUiThread(() -> userListAdapter.notifyDataSetChanged()); - } catch (OperationCanceledException e) { - Log_OC.d(TAG, "Account creation canceled"); - } catch (Exception e) { - Log_OC.e(TAG, "Account creation finished in exception: ", e); - } - } - }, handler); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onAccountRemovedEvent(AccountRemovedEvent event) { - List userListItemArray = getUserListItems(); - userListAdapter.clear(); - userListAdapter.addAll(userListItemArray); - userListAdapter.notifyDataSetChanged(); - } - - @Override - public void run(AccountManagerFuture future) { - if (future.isDone()) { - // after remove account - Optional user = accountManager.getUser(accountName); - if (!user.isPresent()) { - fileUploadHelper.cancel(accountName); - FileDownloadHelper.Companion.instance().cancelAllDownloadsForAccount(workerAccountName, workerCurrentDownload); - } - - User currentUser = getUserAccountManager().getUser(); - if (currentUser.isAnonymous()) { - String accountName = ""; - List users = accountManager.getAllUsers(); - if (users.size() > 0) { - accountName = users.get(0).getAccountName(); - } - accountManager.setCurrentOwnCloudAccount(accountName); - } - - List userListItemArray = getUserListItems(); - if (userListItemArray.size() > SINGLE_ACCOUNT) { - userListAdapter = new UserListAdapter(this, - accountManager, - userListItemArray, - this, - multipleAccountsSupported, - false, - true, - viewThemeUtils); - recyclerView.setAdapter(userListAdapter); - } else { - onBackPressed(); - } - } - } - - public Handler getHandler() { - return handler; - } - - @Override - public OperationsService.OperationsServiceBinder getOperationsServiceBinder() { - return null; - } - - @Override - public FileDataStorageManager getStorageManager() { - return super.getStorageManager(); - } - - @Override - public FileOperationsHelper getFileOperationsHelper() { - return null; - } - - private void performAccountRemoval(User user) { - // disable account in recycler view - for (int i = 0; i < userListAdapter.getItemCount(); i++) { - UserListItem item = userListAdapter.getItem(i); - - if (item != null && item.getUser().getAccountName().equalsIgnoreCase(user.getAccountName())) { - item.setEnabled(false); - break; - } - - userListAdapter.notifyDataSetChanged(); - } - - // store pending account removal - ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProviderImpl(this); - arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), PENDING_FOR_REMOVAL, String.valueOf(true)); - - FileDownloadHelper.Companion.instance().cancelAllDownloadsForAccount(workerAccountName, workerCurrentDownload); - fileUploadHelper.cancel(user.getAccountName()); - backgroundJobManager.startAccountRemovalJob(user.getAccountName(), false); - - // immediately select a new account - List users = accountManager.getAllUsers(); - - String newAccountName = ""; - for (User u : users) { - if (!u.getAccountName().equalsIgnoreCase(u.getAccountName())) { - newAccountName = u.getAccountName(); - break; - } - } - - if (newAccountName.isEmpty()) { - Log_OC.d(TAG, "new account set to null"); - accountManager.resetOwnCloudAccount(); - } else { - Log_OC.d(TAG, "new account set to: " + newAccountName); - accountManager.setCurrentOwnCloudAccount(newAccountName); - } - - // only one to be (deleted) account remaining - if (users.size() < MIN_MULTI_ACCOUNT_SIZE) { - Intent resultIntent = new Intent(); - resultIntent.putExtra(KEY_ACCOUNT_LIST_CHANGED, true); - resultIntent.putExtra(KEY_CURRENT_ACCOUNT_CHANGED, true); - setResult(RESULT_OK, resultIntent); - - super.onBackPressed(); - } - } - - public static void openAccountRemovalDialog(User user, FragmentManager fragmentManager) { - AccountRemovalDialog dialog = AccountRemovalDialog.newInstance(user); - dialog.show(fragmentManager, "dialog"); - } - - private void openAccount(User user) { - final Intent intent = new Intent(this, UserInfoActivity.class); - intent.putExtra(UserInfoActivity.KEY_ACCOUNT, user); - OwnCloudAccount oca = user.toOwnCloudAccount(); - intent.putExtra(KEY_DISPLAY_NAME, oca.getDisplayName()); - startActivityForResult(intent, KEY_USER_INFO_REQUEST_CODE); - } - - @VisibleForTesting - public void showUser(User user, UserInfo userInfo) { - final Intent intent = new Intent(this, UserInfoActivity.class); - OwnCloudAccount oca = user.toOwnCloudAccount(); - intent.putExtra(UserInfoActivity.KEY_ACCOUNT, user); - intent.putExtra(KEY_DISPLAY_NAME, oca.getDisplayName()); - intent.putExtra(KEY_USER_DATA, userInfo); - startActivityForResult(intent, KEY_USER_INFO_REQUEST_CODE); - } - - @Override - public void onOptionItemClicked(User user, View view) { - if (view.getId() == R.id.account_menu) { - PopupMenu popup = new PopupMenu(this, view); - popup.getMenuInflater().inflate(R.menu.item_account, popup.getMenu()); - - if (accountManager.getUser().equals(user)) { - popup.getMenu().findItem(R.id.action_open_account).setVisible(false); - } - popup.setOnMenuItemClickListener(item -> { - int itemId = item.getItemId(); - - if (itemId == R.id.action_open_account) { - accountClicked(user.hashCode()); - } else if (itemId == R.id.action_delete_account) { - openAccountRemovalDialog(user, getSupportFragmentManager()); - } else { - openAccount(user); - } - - return true; - }); - popup.show(); - } else { - openAccount(user); - } - } - - private void observeWorkerState() { - WorkerStateLiveData.Companion.instance().observe(this, state -> { - if (state instanceof WorkerState.Download) { - Log_OC.d(TAG, "Download worker started"); - workerAccountName = ((WorkerState.Download) state).getUser().getAccountName(); - workerCurrentDownload = ((WorkerState.Download) state).getCurrentDownload(); - } - }); - } - - @Override - public void onAccountClicked(User user) { - openAccount(user); - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/RichDocumentsEditorWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/RichDocumentsEditorWebView.kt index ad905d7..6d979f0 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/RichDocumentsEditorWebView.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/RichDocumentsEditorWebView.kt @@ -170,7 +170,7 @@ class RichDocumentsEditorWebView : EditorWebView() { when (downloadJson.getString(TYPE)) { PRINT -> printFile(url) SLIDESHOW -> showSlideShow(url) - else -> downloadFile(url) + else -> downloadFile(url, fileName) } } catch (e: JSONException) { Log_OC.e(this, "Failed to parse download json message: $e") diff --git a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt index 4ec7aab..3a60eec 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt @@ -61,7 +61,7 @@ class TextEditorWebView : EditorWebView() { WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON) } - webView.setDownloadListener { url, _, _, _, _ -> downloadFile(url.toUri()) } + webView.setDownloadListener { url, _, _, _, _ -> downloadFile(url.toUri(), fileName) } loadUrl(intent.getStringExtra(EXTRA_URL)) } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/GroupfolderListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/GroupfolderListAdapter.kt deleted file mode 100644 index 14daab4..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/GroupfolderListAdapter.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Tobias Kaminsky - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter - -import android.content.Context -import android.graphics.drawable.LayerDrawable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import com.nextcloud.android.lib.resources.groupfolders.Groupfolder -import com.owncloud.android.R -import com.owncloud.android.databinding.ListItemBinding -import com.owncloud.android.ui.interfaces.GroupfolderListInterface -import com.owncloud.android.utils.MimeTypeUtil -import com.owncloud.android.utils.theme.ViewThemeUtils -import java.io.File - -class GroupfolderListAdapter( - val context: Context, - val viewThemeUtils: ViewThemeUtils, - private val groupfolderListInterface: GroupfolderListInterface -) : - RecyclerView.Adapter() { - lateinit var list: List - - fun setData(result: Map) { - list = result.values.sortedBy { it.mountPoint } - } - - private fun getFolderIcon(): LayerDrawable? { - val overlayDrawableId = R.drawable.ic_folder_overlay_account_group - return MimeTypeUtil.getFileIcon(false, overlayDrawableId, context, viewThemeUtils) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return OCFileListItemViewHolder( - ListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) - ) - } - - override fun getItemCount(): Int { - return list.size - } - - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val groupfolder = list[position] - val listHolder = holder as OCFileListItemViewHolder - - val file = File("/" + groupfolder.mountPoint) - - listHolder.apply { - fileName.text = file.name - fileSize.text = file.parentFile?.path ?: "/" - fileSizeSeparator.visibility = View.GONE - lastModification.visibility = View.GONE - checkbox.visibility = View.GONE - overflowMenu.visibility = View.GONE - shared.visibility = View.GONE - localFileIndicator.visibility = View.GONE - favorite.visibility = View.GONE - - thumbnail.setImageDrawable(getFolderIcon()) - - itemLayout.setOnClickListener { groupfolderListInterface.onFolderClick(groupfolder.mountPoint) } - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java deleted file mode 100644 index 302ba09..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * - * Nextcloud Android client application - * - * @author Tobias Kaminsky - * @author TSI-mc - * - * Copyright (C) 2020 Tobias Kaminsky - * Copyright (C) 2020 Nextcloud GmbH - * Copyright (C) 2021 TSI-mc - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.owncloud.android.ui.adapter; - -import android.content.Context; -import android.graphics.PorterDuff; -import android.text.TextUtils; -import android.view.View; - -import com.owncloud.android.R; -import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding; -import com.owncloud.android.lib.resources.shares.OCShare; -import com.owncloud.android.lib.resources.shares.ShareType; -import com.owncloud.android.ui.fragment.util.SharingMenuHelper; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import androidx.annotation.NonNull; -import androidx.core.content.res.ResourcesCompat; -import androidx.recyclerview.widget.RecyclerView; - -class LinkShareViewHolder extends RecyclerView.ViewHolder { - private FileDetailsShareLinkShareItemBinding binding; - private Context context; - private ViewThemeUtils viewThemeUtils; - - public LinkShareViewHolder(@NonNull View itemView) { - super(itemView); - } - - public LinkShareViewHolder(FileDetailsShareLinkShareItemBinding binding, - Context context, - final ViewThemeUtils viewThemeUtils) { - this(binding.getRoot()); - this.binding = binding; - this.context = context; - this.viewThemeUtils = viewThemeUtils; - } - - public void bind(OCShare publicShare, ShareeListAdapterListener listener) { - if (ShareType.EMAIL == publicShare.getShareType()) { - binding.name.setText(publicShare.getSharedWithDisplayName()); - binding.icon.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(), - R.drawable.ic_email, - null)); - binding.copyLink.setVisibility(View.GONE); - - binding.icon.getBackground().setColorFilter(context.getResources().getColor(R.color.nc_grey), - PorterDuff.Mode.SRC_IN); - binding.icon.getDrawable().mutate().setColorFilter(context.getResources().getColor(R.color.icon_on_nc_grey), - PorterDuff.Mode.SRC_IN); - } else { - if (!TextUtils.isEmpty(publicShare.getLabel())) { - String text = String.format(context.getString(R.string.share_link_with_label), publicShare.getLabel()); - binding.name.setText(text); - } else { - if (SharingMenuHelper.isSecureFileDrop(publicShare)) { - binding.name.setText(context.getResources().getString(R.string.share_permission_secure_file_drop)); - } else { - binding.name.setText(R.string.share_link); - } - } - - viewThemeUtils.platform.colorImageViewBackgroundAndIcon(binding.icon); - } - - String permissionName = SharingMenuHelper.getPermissionName(context, publicShare); - setPermissionName(publicShare, permissionName); - - binding.copyLink.setOnClickListener(v -> listener.copyLink(publicShare)); - binding.overflowMenu.setOnClickListener(v -> listener.showSharingMenuActionSheet(publicShare)); - if (!SharingMenuHelper.isSecureFileDrop(publicShare)) { - binding.shareByLinkContainer.setOnClickListener(v -> listener.showPermissionsDialog(publicShare)); - } - } - - private void setPermissionName(OCShare publicShare, String permissionName) { - if (!TextUtils.isEmpty(permissionName) && !SharingMenuHelper.isSecureFileDrop(publicShare)) { - binding.permissionName.setText(permissionName); - binding.permissionName.setVisibility(View.VISIBLE); - viewThemeUtils.androidx.colorPrimaryTextViewElement(binding.permissionName); - } else { - binding.permissionName.setVisibility(View.GONE); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ListGridImageViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/ListGridImageViewHolder.kt deleted file mode 100644 index 23f7a9b..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ListGridImageViewHolder.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter - -import android.view.View -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import com.elyeproj.loaderviewlibrary.LoaderImageView - -interface ListGridImageViewHolder { - val thumbnail: ImageView - fun showVideoOverlay() - val shimmerThumbnail: LoaderImageView - val favorite: ImageView - val localFileIndicator: ImageView - val imageFileName: TextView? - val shared: ImageView - val checkbox: ImageView - val itemLayout: View - val unreadComments: ImageView - val more: ImageButton? - val fileFeaturesLayout: LinearLayout? - val gridLivePhotoIndicator: ImageView? - val livePhotoIndicator: TextView? - val livePhotoIndicatorSeparator: TextView? -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 1a6af4d..df827ca 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -505,9 +505,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter - -import android.view.View -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.elyeproj.loaderviewlibrary.LoaderImageView -import com.owncloud.android.databinding.GridImageBinding - -internal class OCFileListGridImageViewHolder(var binding: GridImageBinding) : - RecyclerView.ViewHolder( - binding.root - ), - ListGridImageViewHolder { - - override val thumbnail: ImageView - get() = binding.thumbnail - - override val imageFileName: TextView - get() = binding.Filename - - override fun showVideoOverlay() { - // noop - } - - override val shimmerThumbnail: LoaderImageView - get() = binding.thumbnailShimmer - override val favorite: ImageView - get() = binding.favoriteAction - override val localFileIndicator: ImageView - get() = binding.localFileIndicator - override val shared: ImageView - get() = binding.sharedIcon - override val checkbox: ImageView - get() = binding.customCheckbox - override val itemLayout: View - get() = binding.ListItemLayout - override val unreadComments: ImageView - get() = binding.unreadComments - override val more: ImageButton - get() = binding.more - override val fileFeaturesLayout: LinearLayout - get() = binding.fileFeaturesLayout - override val gridLivePhotoIndicator: ImageView - get() = binding.gridLivePhotoIndicator - override val livePhotoIndicator: TextView? - get() = null - override val livePhotoIndicatorSeparator: TextView? - get() = null - - init { - binding.favoriteAction.drawable.mutate() - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ProgressListener.java b/app/src/main/java/com/owncloud/android/ui/adapter/ProgressListener.java deleted file mode 100644 index c5d022a..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ProgressListener.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2017-2018 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter; - -import android.widget.ProgressBar; - -import com.owncloud.android.db.OCUpload; -import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; - -import java.lang.ref.WeakReference; - -/** - * Progress listener for file transfers. - */ -public class ProgressListener implements OnDatatransferProgressListener { - private int mLastPercent; - private OCUpload mUpload; - private WeakReference mProgressBar; - - public ProgressListener(OCUpload upload, ProgressBar progressBar) { - mUpload = upload; - mProgressBar = new WeakReference<>(progressBar); - } - - @Override - public void onTransferProgress( - long progressRate, - long totalTransferredSoFar, - long totalToTransfer, - String fileAbsoluteName) { - int percent = (int) (100.0 * ((double) totalTransferredSoFar) / ((double) totalToTransfer)); - - if (percent != mLastPercent) { - ProgressBar progressBar = mProgressBar.get(); - if (progressBar != null) { - progressBar.setProgress(percent); - progressBar.postInvalidate(); - } - } - - mLastPercent = percent; - } - - public boolean isWrapping(ProgressBar progressBar) { - ProgressBar wrappedProgressBar = mProgressBar.get(); - return wrappedProgressBar != null && wrappedProgressBar == progressBar; // on purpose; don't replace with equals - } - - public OCUpload getUpload() { - return mUpload; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java deleted file mode 100644 index 3b7d70b..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2017-2018 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Chris Narkiewicz - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-FileCopyrightText: 2015-2018 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter; - -import android.annotation.SuppressLint; -import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.nextcloud.client.account.User; -import com.owncloud.android.R; -import com.owncloud.android.databinding.FileDetailsShareInternalShareLinkBinding; -import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding; -import com.owncloud.android.databinding.FileDetailsSharePublicLinkAddNewItemBinding; -import com.owncloud.android.databinding.FileDetailsShareSecureFileDropAddNewItemBinding; -import com.owncloud.android.databinding.FileDetailsShareShareItemBinding; -import com.owncloud.android.lib.resources.shares.OCShare; -import com.owncloud.android.lib.resources.shares.ShareType; -import com.owncloud.android.ui.activity.FileActivity; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.util.ArrayList; -import java.util.List; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -/** - * Adapter to show a user/group/email/remote in Sharing list in file details view. - */ -public class ShareeListAdapter extends RecyclerView.Adapter - implements DisplayUtils.AvatarGenerationListener { - - private final ShareeListAdapterListener listener; - private final FileActivity fileActivity; - private List shares; - private final float avatarRadiusDimension; - private final String userId; - private final User user; - private final ViewThemeUtils viewThemeUtils; - private final boolean encrypted; - - public ShareeListAdapter(FileActivity fileActivity, - List shares, - ShareeListAdapterListener listener, - String userId, - User user, - final ViewThemeUtils viewThemeUtils, - boolean encrypted) { - this.fileActivity = fileActivity; - this.shares = shares; - this.listener = listener; - this.userId = userId; - this.user = user; - this.viewThemeUtils = viewThemeUtils; - this.encrypted = encrypted; - - avatarRadiusDimension = fileActivity.getResources().getDimension(R.dimen.user_icon_radius); - - sortShares(); - } - - @Override - public int getItemViewType(int position) { - return shares.get(position).getShareType().getValue(); - } - - @NonNull - @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - switch (ShareType.fromValue(viewType)) { - case PUBLIC_LINK, EMAIL -> { - return new LinkShareViewHolder( - FileDetailsShareLinkShareItemBinding.inflate(LayoutInflater.from(fileActivity), - parent, - false), - fileActivity, - viewThemeUtils); - } - case NEW_PUBLIC_LINK -> { - if (encrypted) { - return new NewSecureFileDropViewHolder( - FileDetailsShareSecureFileDropAddNewItemBinding.inflate(LayoutInflater.from(fileActivity), - parent, - false) - ); - } else { - return new NewLinkShareViewHolder( - FileDetailsSharePublicLinkAddNewItemBinding.inflate(LayoutInflater.from(fileActivity), - parent, - false) - ); - } - } - case INTERNAL -> { - return new InternalShareViewHolder( - FileDetailsShareInternalShareLinkBinding.inflate(LayoutInflater.from(fileActivity), parent, false), - fileActivity); - } - default -> { - return new ShareViewHolder(FileDetailsShareShareItemBinding.inflate(LayoutInflater.from(fileActivity), - parent, - false), - user, - fileActivity, - viewThemeUtils); - } - } - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - if (shares == null || shares.size() <= position) { - return; - } - - final OCShare share = shares.get(position); - - if (holder instanceof LinkShareViewHolder publicShareViewHolder) { - publicShareViewHolder.bind(share, listener); - } else if (holder instanceof InternalShareViewHolder internalShareViewHolder) { - internalShareViewHolder.bind(share, listener); - } else if (holder instanceof NewLinkShareViewHolder newLinkShareViewHolder) { - newLinkShareViewHolder.bind(listener); - } else if (holder instanceof NewSecureFileDropViewHolder newSecureFileDropViewHolder) { - newSecureFileDropViewHolder.bind(listener); - } else { - ShareViewHolder userViewHolder = (ShareViewHolder) holder; - userViewHolder.bind(share, listener, this, userId, avatarRadiusDimension); - } - } - - @Override - public long getItemId(int position) { - return shares.get(position).getId(); - } - - @Override - public int getItemCount() { - return shares.size(); - } - - @SuppressLint("NotifyDataSetChanged") - public void addShares(List sharesToAdd) { - shares.addAll(sharesToAdd); - sortShares(); - notifyDataSetChanged(); - } - - @Override - public void avatarGenerated(Drawable avatarDrawable, Object callContext) { - if (callContext instanceof ImageView iv) { - iv.setImageDrawable(avatarDrawable); - } - } - - @Override - public boolean shouldCallGeneratedCallback(String tag, Object callContext) { - if (callContext instanceof ImageView iv) { - // needs to be changed once federated users have avatars - return String.valueOf(iv.getTag()).equals(tag.split("@")[0]); - } - return false; - } - - @SuppressLint("NotifyDataSetChanged") - public void remove(OCShare share) { - shares.remove(share); - notifyDataSetChanged(); - } - - /** - * sort all by creation time, then email/link shares on top - */ - protected final void sortShares() { - List links = new ArrayList<>(); - List users = new ArrayList<>(); - - for (OCShare share : shares) { - if (ShareType.PUBLIC_LINK == share.getShareType() || ShareType.EMAIL == share.getShareType()) { - links.add(share); - } else if (share.getShareType() != ShareType.INTERNAL) { - users.add(share); - } - } - - links.sort((o1, o2) -> Long.compare(o2.getSharedDate(), o1.getSharedDate())); - users.sort((o1, o2) -> Long.compare(o2.getSharedDate(), o1.getSharedDate())); - - shares = links; - shares.addAll(users); - - // add internal share link at end - if (!encrypted) { - final OCShare ocShare = new OCShare(); - ocShare.setShareType(ShareType.INTERNAL); - shares.add(ocShare); - } - } - - public List getShares() { - return shares; - } - - public void removeNewPublicShare() { - for (OCShare share : shares) { - if (share.getShareType() == ShareType.NEW_PUBLIC_LINK) { - shares.remove(share); - break; - } - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java deleted file mode 100644 index 194c3f5..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016 Andy Scherzinger - * SPDX-FileCopyrightText: 2016 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.PopupMenu; - -import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter; -import com.afollestad.sectionedrecyclerview.SectionedViewHolder; -import com.nextcloud.client.core.Clock; -import com.owncloud.android.R; -import com.owncloud.android.databinding.GridSyncItemBinding; -import com.owncloud.android.databinding.SyncedFoldersEmptyBinding; -import com.owncloud.android.databinding.SyncedFoldersFooterBinding; -import com.owncloud.android.databinding.SyncedFoldersItemHeaderBinding; -import com.owncloud.android.datamodel.MediaFolderType; -import com.owncloud.android.datamodel.SyncedFolderDisplayItem; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; - -/** - * Adapter to display all auto-synced folders and/or instant upload media folders. - */ -public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter { - - private final Context context; - private final Clock clock; - private final int gridWidth; - private final int gridTotal; - private final ClickListener clickListener; - private final List syncFolderItems; - private final List filteredSyncFolderItems; - private final boolean light; - private static final int VIEW_TYPE_EMPTY = Integer.MAX_VALUE; - private static final int VIEW_TYPE_ITEM = 1; - private static final int VIEW_TYPE_HEADER = 2; - private static final int VIEW_TYPE_FOOTER = 3; - private boolean hideItems; - private final ViewThemeUtils viewThemeUtils; - private final Executor thumbnailThreadPool; - - public SyncedFolderAdapter(Context context, - Clock clock, - int gridWidth, - ClickListener listener, - boolean light, - ViewThemeUtils viewThemeUtils) { - this.context = context; - this.clock = clock; - this.gridWidth = gridWidth; - gridTotal = gridWidth * 2; - clickListener = listener; - syncFolderItems = new ArrayList<>(); - filteredSyncFolderItems = new ArrayList<>(); - this.light = light; - this.hideItems = true; - this.viewThemeUtils = viewThemeUtils; - this.thumbnailThreadPool = Executors.newCachedThreadPool(); - - shouldShowHeadersForEmptySections(true); - shouldShowFooters(true); - } - - public void toggleHiddenItemsVisibility() { - hideItems = !hideItems; - filteredSyncFolderItems.clear(); - filteredSyncFolderItems.addAll(filterHiddenItems(syncFolderItems, hideItems)); - notifyDataSetChanged(); - } - - public void setSyncFolderItems(List syncFolderItems) { - this.syncFolderItems.clear(); - this.syncFolderItems.addAll(syncFolderItems); - - this.filteredSyncFolderItems.clear(); - this.filteredSyncFolderItems.addAll(filterHiddenItems(this.syncFolderItems, hideItems)); - } - - public void setSyncFolderItem(int location, SyncedFolderDisplayItem syncFolderItem) { - if (hideItems && syncFolderItem.isHidden() && filteredSyncFolderItems.contains(syncFolderItem)) { - filteredSyncFolderItems.remove(location); - } else { - if (filteredSyncFolderItems.contains(syncFolderItem)) { - filteredSyncFolderItems.set(filteredSyncFolderItems.indexOf(syncFolderItem), syncFolderItem); - } else { - filteredSyncFolderItems.add(syncFolderItem); - } - } - - if (syncFolderItems.contains(syncFolderItem)) { - syncFolderItems.set(syncFolderItems.indexOf(syncFolderItem), syncFolderItem); - } else { - syncFolderItems.add(syncFolderItem); - } - - notifyDataSetChanged(); - } - - public void addSyncFolderItem(SyncedFolderDisplayItem syncFolderItem) { - syncFolderItems.add(syncFolderItem); - - // add item for display when either all items should be shown (!hideItems) - // or if item should be shown (!.isHidden()) - if (!hideItems || !syncFolderItem.isHidden()) { - filteredSyncFolderItems.add(syncFolderItem); - notifyDataSetChanged(); - } - } - - public void removeItem(int section) { - if (filteredSyncFolderItems.contains(syncFolderItems.get(section))) { - filteredSyncFolderItems.remove(syncFolderItems.get(section)); - notifyDataSetChanged(); - } - syncFolderItems.remove(section); - } - - /** - * Filter for hidden items - * - * @param items Collection of items to filter - * @return Non-hidden items - */ - private List filterHiddenItems(List items, boolean hide) { - if (!hide) { - return items; - } else { - List result = new ArrayList<>(); - - for (SyncedFolderDisplayItem item : items) { - if (!item.isHidden() && !result.contains(item)) { - result.add(item); - } - } - - return result; - } - } - - @Override - public int getSectionCount() { - if (filteredSyncFolderItems.size() > 0) { - return filteredSyncFolderItems.size() + 1; - } else { - return 0; - } - } - - @VisibleForTesting - public void clear() { - filteredSyncFolderItems.clear(); - syncFolderItems.clear(); - } - - public int getUnfilteredSectionCount() { - if (syncFolderItems.size() > 0) { - return syncFolderItems.size() + 1; - } else { - return 0; - } - } - - @Override - public int getItemCount(int section) { - if (section < filteredSyncFolderItems.size()) { - List filePaths = filteredSyncFolderItems.get(section).getFilePaths(); - - if (filePaths != null) { - return filteredSyncFolderItems.get(section).getFilePaths().size(); - } else { - return 1; - } - } else { - return 1; - } - } - - public SyncedFolderDisplayItem get(int section) { - return filteredSyncFolderItems.get(section); - } - - @Override - public int getItemViewType(int section, int relativePosition, int absolutePosition) { - if (isLastSection(section)) { - return VIEW_TYPE_EMPTY; - } else { - return VIEW_TYPE_ITEM; - } - } - - @Override - public int getHeaderViewType(int section) { - if (isLastSection(section)) { - return VIEW_TYPE_EMPTY; - } else { - return VIEW_TYPE_HEADER; - } - } - - @Override - public int getFooterViewType(int section) { - if (isLastSection(section) && showFooter()) { - return VIEW_TYPE_FOOTER; - } else { - // only show footer after last item and only if folders have been hidden - return VIEW_TYPE_EMPTY; - } - } - - private boolean showFooter() { - return syncFolderItems.size() > filteredSyncFolderItems.size(); - } - - /** - * returns the section of a synced folder for the given local path and type. - * - * @param localPath the local path of the synced folder - * @param type the of the synced folder - * @return the section index of the looked up synced folder, -1 if not present - */ - public int getSectionByLocalPathAndType(String localPath, int type) { - for (int i = 0; i < filteredSyncFolderItems.size(); i++) { - if (filteredSyncFolderItems.get(i).getLocalPath().equalsIgnoreCase(localPath) && - filteredSyncFolderItems.get(i).getType().id == type) { - return i; - } - } - - return -1; - } - - @Override - public void onBindHeaderViewHolder(SectionedViewHolder commonHolder, final int section, boolean expanded) { - if (section < filteredSyncFolderItems.size()) { - HeaderViewHolder holder = (HeaderViewHolder) commonHolder; - holder.binding.headerContainer.setVisibility(View.VISIBLE); - - holder.binding.title.setText(filteredSyncFolderItems.get(section).getFolderName()); - - if (MediaFolderType.VIDEO == filteredSyncFolderItems.get(section).getType()) { - holder.binding.type.setImageResource(R.drawable.video_32dp); - } else if (MediaFolderType.IMAGE == filteredSyncFolderItems.get(section).getType()) { - holder.binding.type.setImageResource(R.drawable.image_32dp); - } else { - holder.binding.type.setImageResource(R.drawable.folder_star_32dp); - } - - holder.binding.syncStatusButton.setVisibility(View.VISIBLE); - holder.binding.syncStatusButton.setTag(section); - holder.binding.syncStatusButton.setOnClickListener(v -> { - filteredSyncFolderItems.get(section).setEnabled( - !filteredSyncFolderItems.get(section).isEnabled(), - clock.getCurrentTime() - ); - setSyncButtonActiveIcon( - holder.binding.syncStatusButton, - filteredSyncFolderItems.get(section).isEnabled()); - clickListener.onSyncStatusToggleClick(section, filteredSyncFolderItems.get(section)); - }); - setSyncButtonActiveIcon(holder.binding.syncStatusButton, filteredSyncFolderItems.get(section).isEnabled()); - - if (light) { - holder.binding.settingsButton.setVisibility(View.GONE); - } else { - holder.binding.settingsButton.setVisibility(View.VISIBLE); - holder.binding.settingsButton.setTag(section); - holder.binding.settingsButton.setOnClickListener( - v -> onOverflowIconClicked(section, filteredSyncFolderItems.get(section), v)); - } - } - } - - private void onOverflowIconClicked(int section, SyncedFolderDisplayItem item, View view) { - PopupMenu popup = new PopupMenu(context, view); - popup.inflate(R.menu.synced_folders_adapter); - popup.setOnMenuItemClickListener(i -> optionsItemSelected(i, section, item)); - popup.getMenu() - .findItem(R.id.action_auto_upload_folder_toggle_visibility) - .setChecked(item.isHidden()); - - popup.show(); - } - - private boolean optionsItemSelected(MenuItem menuItem, int section, SyncedFolderDisplayItem item) { - if (menuItem.getItemId() == R.id.action_auto_upload_folder_toggle_visibility) { - clickListener.onVisibilityToggleClick(section, item); - } else { - // default: R.id.action_create_custom_folder - clickListener.onSyncFolderSettingsClick(section, item); - } - return true; - } - - @Override - public void onBindFooterViewHolder(SectionedViewHolder holder, int section) { - if (isLastSection(section) && showFooter()) { - FooterViewHolder footerHolder = (FooterViewHolder) holder; - footerHolder.binding.footerText.setOnClickListener(v -> toggleHiddenItemsVisibility()); - footerHolder.binding.footerText.setText( - context.getResources().getQuantityString( - R.plurals.synced_folders_show_hidden_folders, - getHiddenFolderCount(), - getHiddenFolderCount() - ) - ); - } - } - - @Override - public void onBindViewHolder(SectionedViewHolder commonHolder, int section, int relativePosition, - int absolutePosition) { - if (section < filteredSyncFolderItems.size() && filteredSyncFolderItems.get(section).getFilePaths() != null) { - MainViewHolder holder = (MainViewHolder) commonHolder; - - File file = new File(filteredSyncFolderItems.get(section).getFilePaths().get(relativePosition)); - - ThumbnailsCacheManager.MediaThumbnailGenerationTask task = - new ThumbnailsCacheManager.MediaThumbnailGenerationTask(holder.binding.thumbnail, - context, - viewThemeUtils); - - ThumbnailsCacheManager.AsyncMediaThumbnailDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncMediaThumbnailDrawable( - context.getResources(), - ThumbnailsCacheManager.mDefaultImg - ); - holder.binding.thumbnail.setImageDrawable(asyncDrawable); - - task.executeOnExecutor(thumbnailThreadPool, file); - - // set proper tag - holder.binding.thumbnail.setTag(file.hashCode()); - - holder.itemView.setTag(relativePosition % gridWidth); - - if (filteredSyncFolderItems.get(section).getNumberOfFiles() > gridTotal && - relativePosition >= gridTotal - 1) { - holder.binding.counter.setText( - String.format( - Locale.US, - "%d", - filteredSyncFolderItems.get(section).getNumberOfFiles() - gridTotal)); - holder.binding.counterLayout.setVisibility(View.VISIBLE); - holder.binding.thumbnailDarkener.setVisibility(View.VISIBLE); - } else { - holder.binding.counterLayout.setVisibility(View.GONE); - holder.binding.thumbnailDarkener.setVisibility(View.GONE); - } - } - } - - @NonNull - @Override - public SectionedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - if (viewType == VIEW_TYPE_HEADER) { - return new HeaderViewHolder( - SyncedFoldersItemHeaderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else if (viewType == VIEW_TYPE_FOOTER) { - return new FooterViewHolder( - SyncedFoldersFooterBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else if (viewType == VIEW_TYPE_EMPTY) { - return new EmptyViewHolder( - SyncedFoldersEmptyBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } else { - return new MainViewHolder( - GridSyncItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false) - ); - } - } - - private boolean isLastSection(int section) { - return section >= getSectionCount() - 1; - } - - public int getHiddenFolderCount() { - if (syncFolderItems != null && filteredSyncFolderItems != null) { - return syncFolderItems.size() - filteredSyncFolderItems.size(); - } else { - return 0; - } - } - - public interface ClickListener { - void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem); - void onSyncFolderSettingsClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem); - void onVisibilityToggleClick(int section, SyncedFolderDisplayItem item); - } - - static class HeaderViewHolder extends SectionedViewHolder { - protected SyncedFoldersItemHeaderBinding binding; - - private HeaderViewHolder(SyncedFoldersItemHeaderBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - static class FooterViewHolder extends SectionedViewHolder { - protected SyncedFoldersFooterBinding binding; - - private FooterViewHolder(SyncedFoldersFooterBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - static class EmptyViewHolder extends SectionedViewHolder { - private EmptyViewHolder(SyncedFoldersEmptyBinding binding) { - super(binding.getRoot()); - } - } - - static class MainViewHolder extends SectionedViewHolder { - protected GridSyncItemBinding binding; - - private MainViewHolder(GridSyncItemBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - private void setSyncButtonActiveIcon(ImageButton syncStatusButton, boolean enabled) { - if (enabled) { - syncStatusButton.setImageDrawable( - viewThemeUtils.platform.tintPrimaryDrawable(context, R.drawable.ic_cloud_sync_on) - ); - } else { - syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_off); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ViewType.java b/app/src/main/java/com/owncloud/android/ui/adapter/ViewType.java deleted file mode 100644 index eb3d7af..0000000 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ViewType.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016 Andy Scherzinger - * SPDX-FileCopyrightText: 2016 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.adapter; - -/** - * Enumeration of available/supported view types for file list/grid items - */ -public enum ViewType { - LIST_ITEM, - GRID_IMAGE, - GRID_ITEM -} diff --git a/app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveStatusAsyncTask.java b/app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveStatusAsyncTask.java deleted file mode 100644 index f00f308..0000000 --- a/app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveStatusAsyncTask.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.asynctasks; - -import android.os.AsyncTask; - -import com.nextcloud.client.account.User; -import com.nextcloud.client.network.ClientFactory; -import com.nextcloud.common.NextcloudClient; -import com.nextcloud.ui.ChooseAccountDialogFragment; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.resources.users.GetStatusRemoteOperation; -import com.owncloud.android.lib.resources.users.Status; -import com.owncloud.android.lib.resources.users.StatusType; - -import java.lang.ref.WeakReference; - -import androidx.lifecycle.Lifecycle; - -public class RetrieveStatusAsyncTask extends AsyncTask { - private final User user; - private final WeakReference chooseAccountDialogFragment; - private final ClientFactory clientFactory; - - public RetrieveStatusAsyncTask(User user, - ChooseAccountDialogFragment chooseAccountDialogFragment, - ClientFactory clientFactory) { - this.user = user; - this.chooseAccountDialogFragment = new WeakReference<>(chooseAccountDialogFragment); - this.clientFactory = clientFactory; - } - - @Override - protected com.owncloud.android.lib.resources.users.Status doInBackground(Void... voids) { - try { - NextcloudClient client = clientFactory.createNextcloudClient(user); - RemoteOperationResult result = - new GetStatusRemoteOperation().execute(client); - - if (result.isSuccess()) { - return result.getResultData(); - } else { - return new com.owncloud.android.lib.resources.users.Status(StatusType.OFFLINE, "", "", -1); - } - } catch (ClientFactory.CreationException | NullPointerException e) { - return new com.owncloud.android.lib.resources.users.Status(StatusType.OFFLINE, "", "", -1); - } - } - - @Override - protected void onPostExecute(com.owncloud.android.lib.resources.users.Status status) { - ChooseAccountDialogFragment fragment = chooseAccountDialogFragment.get(); - - if (fragment != null && fragment.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { - fragment.setStatus(status, fragment.requireContext()); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/components/CustomViewPager.java b/app/src/main/java/com/owncloud/android/ui/components/CustomViewPager.java deleted file mode 100644 index 5a81a8f..0000000 --- a/app/src/main/java/com/owncloud/android/ui/components/CustomViewPager.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Tobias Kaminsky - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.components; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.viewpager.widget.ViewPager; - -public class CustomViewPager extends ViewPager { - public CustomViewPager(@NonNull Context context) { - super(context); - } - - public CustomViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouchEvent(MotionEvent ev) { - try { - return super.onTouchEvent(ev); - } catch (IllegalArgumentException ex) { - // no logging as this might flood log and we cannot do anything - } - return false; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - try { - return super.onInterceptTouchEvent(ev); - } catch (IllegalArgumentException ex) { - // no logging as this might flood log and we cannot do anything - } - return false; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java b/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java deleted file mode 100644 index db0e8fc..0000000 --- a/app/src/main/java/com/owncloud/android/ui/decoration/SimpleListItemDividerDecoration.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.decoration; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.util.DisplayMetrics; -import android.view.View; - -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.RecyclerView; - -/** - * DividerItemDecoration based on {@link DividerItemDecoration} adding a 72dp left padding. - */ -public class SimpleListItemDividerDecoration extends DividerItemDecoration { - private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; - - private final Rect bounds = new Rect(); - private Drawable divider; - private int leftPadding; - - /** - * Default divider will be used - */ - public SimpleListItemDividerDecoration(Context context) { - super(context, DividerItemDecoration.VERTICAL); - final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); - divider = styledAttributes.getDrawable(0); - leftPadding = Math.round(72 * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT)); - styledAttributes.recycle(); - } - - @Override - public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { - canvas.save(); - final int right; - //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides. - if (parent.getClipToPadding()) { - right = parent.getWidth() - parent.getPaddingRight(); - canvas.clipRect(leftPadding, parent.getPaddingTop(), right, - parent.getHeight() - parent.getPaddingBottom()); - } else { - right = parent.getWidth(); - } - - final int childCount = parent.getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = parent.getChildAt(i); - parent.getDecoratedBoundsWithMargins(child, bounds); - final int bottom = bounds.bottom + Math.round(child.getTranslationY()); - final int top = bottom - 1; - - if (divider != null) { - divider.setBounds(leftPadding, top, right, bottom); - divider.draw(canvas); - } - } - canvas.restore(); - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java deleted file mode 100644 index 56eeeea..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2020-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2012 Bartosz Przybylski - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import android.view.View; -import android.widget.Toast; - -import com.google.android.material.button.MaterialButton; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.client.account.User; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.databinding.ConflictResolveDialogBinding; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.SyncedFolderProvider; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.adapter.LocalFileListAdapter; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentTransaction; - -/** - * Dialog which will be displayed to user upon keep-in-sync file conflict. - */ -public class ConflictsResolveDialog extends DialogFragment implements Injectable { - - private ConflictResolveDialogBinding binding; - - private OCFile existingFile; - private File newFile; - public OnConflictDecisionMadeListener listener; - private User user; - private final List asyncTasks = new ArrayList<>(); - private MaterialButton positiveButton; - @Inject ViewThemeUtils viewThemeUtils; - @Inject SyncedFolderProvider syncedFolderProvider; - - private static final String KEY_NEW_FILE = "file"; - private static final String KEY_EXISTING_FILE = "ocfile"; - private static final String KEY_USER = "user"; - - public enum Decision { - CANCEL, - KEEP_BOTH, - KEEP_LOCAL, - KEEP_SERVER, - } - - public static ConflictsResolveDialog newInstance(OCFile existingFile, OCFile newFile, User user) { - ConflictsResolveDialog dialog = new ConflictsResolveDialog(); - - Bundle args = new Bundle(); - args.putParcelable(KEY_EXISTING_FILE, existingFile); - args.putSerializable(KEY_NEW_FILE, new File(newFile.getStoragePath())); - args.putParcelable(KEY_USER, user); - dialog.setArguments(args); - - return dialog; - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - - try { - listener = (OnConflictDecisionMadeListener) context; - } catch (ClassCastException e) { - throw new ClassCastException("Activity of this dialog must implement OnConflictDecisionMadeListener"); - } - } - - @Override - public void onStart() { - super.onStart(); - - AlertDialog alertDialog = (AlertDialog) getDialog(); - - if (alertDialog == null) { - Toast.makeText(getContext(), "Failed to create conflict dialog", Toast.LENGTH_LONG).show(); - return; - } - - positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); - positiveButton.setEnabled(false); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (savedInstanceState != null) { - existingFile = BundleExtensionsKt.getParcelableArgument(savedInstanceState, KEY_EXISTING_FILE, OCFile.class); - newFile = BundleExtensionsKt.getSerializableArgument(savedInstanceState, KEY_NEW_FILE, File.class); - user = BundleExtensionsKt.getParcelableArgument(savedInstanceState, KEY_USER, User.class); - } else if (getArguments() != null) { - existingFile = BundleExtensionsKt.getParcelableArgument(getArguments(), KEY_EXISTING_FILE, OCFile.class); - newFile = BundleExtensionsKt.getSerializableArgument(getArguments(), KEY_NEW_FILE, File.class); - user = BundleExtensionsKt.getParcelableArgument(getArguments(), KEY_USER, User.class); - } else { - Toast.makeText(getContext(), "Failed to create conflict dialog", Toast.LENGTH_LONG).show(); - } - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putParcelable(KEY_EXISTING_FILE, existingFile); - outState.putSerializable(KEY_NEW_FILE, newFile); - outState.putParcelable(KEY_USER, user); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - // Inflate the layout for the dialog - binding = ConflictResolveDialogBinding.inflate(requireActivity().getLayoutInflater()); - - viewThemeUtils.platform.themeCheckbox(binding.newCheckbox); - viewThemeUtils.platform.themeCheckbox(binding.existingCheckbox); - - // Build the dialog - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity()); - builder.setView(binding.getRoot()) - .setPositiveButton(R.string.common_ok, (dialog, which) -> { - if (listener != null) { - if (binding.newCheckbox.isChecked() && binding.existingCheckbox.isChecked()) { - listener.conflictDecisionMade(Decision.KEEP_BOTH); - } else if (binding.newCheckbox.isChecked()) { - listener.conflictDecisionMade(Decision.KEEP_LOCAL); - } else if (binding.existingCheckbox.isChecked()) { - listener.conflictDecisionMade(Decision.KEEP_SERVER); - } // else do nothing - - } - }) - .setNegativeButton(R.string.common_cancel, (dialog, which) -> { - if (listener != null) { - listener.conflictDecisionMade(Decision.CANCEL); - } - }) - .setTitle(String.format(getString(R.string.conflict_file_headline), existingFile.getFileName())); - - File parentFile = new File(existingFile.getRemotePath()).getParentFile(); - if (parentFile != null) { - binding.in.setText(String.format(getString(R.string.in_folder), parentFile.getAbsolutePath())); - } else { - binding.in.setVisibility(View.GONE); - } - - // set info for new file - binding.newSize.setText(DisplayUtils.bytesToHumanReadable(newFile.length())); - binding.newTimestamp.setText(DisplayUtils.getRelativeTimestamp(getContext(), newFile.lastModified())); - binding.newThumbnail.setTag(newFile.hashCode()); - LocalFileListAdapter.setThumbnail(newFile, - binding.newThumbnail, - getContext(), - viewThemeUtils); - - // set info for existing file - binding.existingSize.setText(DisplayUtils.bytesToHumanReadable(existingFile.getFileLength())); - binding.existingTimestamp.setText(DisplayUtils.getRelativeTimestamp(getContext(), - existingFile.getModificationTimestamp())); - - binding.existingThumbnail.setTag(existingFile.getFileId()); - DisplayUtils.setThumbnail(existingFile, - binding.existingThumbnail, - user, - new FileDataStorageManager(user, - requireContext().getContentResolver()), - asyncTasks, - false, - getContext(), - null, - syncedFolderProvider.getPreferences(), - viewThemeUtils, - syncedFolderProvider); - - View.OnClickListener checkBoxClickListener = v -> - positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked()); - - binding.newCheckbox.setOnClickListener(checkBoxClickListener); - binding.existingCheckbox.setOnClickListener(checkBoxClickListener); - - binding.newFileContainer.setOnClickListener(v -> { - binding.newCheckbox.setChecked(!binding.newCheckbox.isChecked()); - positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked()); - }); - binding.existingFileContainer.setOnClickListener(v -> { - binding.existingCheckbox.setChecked(!binding.existingCheckbox.isChecked()); - positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked()); - }); - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.existingFileContainer.getContext(), builder); - - return builder.create(); - } - - public void showDialog(AppCompatActivity activity) { - Fragment prev = activity.getSupportFragmentManager().findFragmentByTag("dialog"); - FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); - if (prev != null) { - ft.remove(prev); - } - ft.addToBackStack(null); - - this.show(ft, "dialog"); - } - - @Override - public void onCancel(@NonNull DialogInterface dialog) { - if (listener != null) { - listener.conflictDecisionMade(Decision.CANCEL); - } - } - - public interface OnConflictDecisionMadeListener { - void conflictDecisionMade(Decision decision); - } - - @Override - public void onStop() { - super.onStop(); - - for (ThumbnailsCacheManager.ThumbnailGenerationTask task : asyncTasks) { - if (task != null) { - task.cancel(true); - if (task.getGetMethod() != null) { - Log_OC.d(this, "cancel: abort get method directly"); - task.getGetMethod().abort(); - } - } - } - - asyncTasks.clear(); - } - -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java deleted file mode 100644 index e8ec640..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-FileCopyrightText: 2018 Jessie Chatham Spencer - * SPDX-FileCopyrightText: 2016-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.app.Dialog; -import android.os.Bundle; -import android.view.ActionMode; - -import com.google.android.material.button.MaterialButton; -import com.nextcloud.client.di.Injectable; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.ui.activity.ComponentsGetter; -import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; - -import java.util.ArrayList; -import java.util.Collection; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; - -/** - * Dialog requiring confirmation before removing a collection of given OCFiles. - * Triggers the removal according to the user response. - */ -public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implements - ConfirmationDialogFragmentListener, Injectable { - - private static final int SINGLE_SELECTION = 1; - private static final String ARG_TARGET_FILES = "TARGET_FILES"; - - private Collection mTargetFiles; - private ActionMode actionMode; - - /** - * Public factory method to create new RemoveFilesDialogFragment instances. - * - * @param files Files to remove. - * @param actionMode ActionMode to finish on confirmation - * @return Dialog ready to show. - */ - public static RemoveFilesDialogFragment newInstance(ArrayList files, ActionMode actionMode) { - RemoveFilesDialogFragment dialogFragment = newInstance(files); - dialogFragment.setActionMode(actionMode); - return dialogFragment; - } - - /** - * Public factory method to create new RemoveFilesDialogFragment instances. - * - * @param files Files to remove. - * @return Dialog ready to show. - */ - public static RemoveFilesDialogFragment newInstance(ArrayList files) { - RemoveFilesDialogFragment frag = new RemoveFilesDialogFragment(); - Bundle args = new Bundle(); - int messageStringId; - - boolean containsFolder = false; - boolean containsDown = false; - - for (OCFile file: files) { - containsFolder |= file.isFolder(); - containsDown |= file.isDown(); - } - - if (files.size() == SINGLE_SELECTION) { - // choose message for a single file - OCFile file = files.get(0); - - messageStringId = file.isFolder() ? - R.string.confirmation_remove_folder_alert : - R.string.confirmation_remove_file_alert; - - } else { - // choose message for more than one file - messageStringId = containsFolder ? - R.string.confirmation_remove_folders_alert : - R.string.confirmation_remove_files_alert; - } - - args.putInt(ARG_MESSAGE_RESOURCE_ID, messageStringId); - if (files.size() == SINGLE_SELECTION) { - args.putStringArray(ARG_MESSAGE_ARGUMENTS, new String[] { files.get(0).getFileName() } ); - } - - args.putInt(ARG_POSITIVE_BTN_RES, R.string.file_delete); - - if (containsFolder || containsDown) { - args.putInt(ARG_NEGATIVE_BTN_RES, R.string.confirmation_remove_local); - } - - args.putInt(ARG_NEUTRAL_BTN_RES, R.string.file_keep); - args.putParcelableArrayList(ARG_TARGET_FILES, files); - frag.setArguments(args); - - return frag; - } - - - /** - * Convenience factory method to create new RemoveFilesDialogFragment instances for a single file - * - * @param file File to remove. - * @return Dialog ready to show. - */ - public static RemoveFilesDialogFragment newInstance(OCFile file) { - ArrayList list = new ArrayList<>(); - list.add(file); - return newInstance(list); - } - - @Override - public void onStart() { - super.onStart(); - - AlertDialog alertDialog = (AlertDialog) getDialog(); - - if (alertDialog != null) { - MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); - - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); - - MaterialButton neutralButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL); - if (neutralButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); - } - } - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - Dialog dialog = super.onCreateDialog(savedInstanceState); - Bundle arguments = getArguments(); - - if (arguments == null) { - return dialog; - } - - mTargetFiles = arguments.getParcelableArrayList(ARG_TARGET_FILES); - setOnConfirmationListener(this); - return dialog; - } - - /** - * Performs the removal of the target file, both locally and in the server and - * finishes the supplied ActionMode if one was given. - */ - @Override - public void onConfirmation(String callerTag) { - removeFiles(false); - } - - /** - * Performs the removal of the local copy of the target file - */ - @Override - public void onCancel(String callerTag) { - removeFiles(true); - } - - private void removeFiles(boolean onlyLocalCopy) { - ComponentsGetter cg = (ComponentsGetter) getActivity(); - if (cg != null) { - cg.getFileOperationsHelper().removeFiles(mTargetFiles, onlyLocalCopy, false); - } - finishActionMode(); - } - - @Override - public void onNeutral(String callerTag) { - // nothing to do here - } - - private void setActionMode(ActionMode actionMode) { - this.actionMode = actionMode; - } - - /** - * This is used when finishing an actionMode, - * for example if we want to exit the selection mode - * after deleting the target files. - */ - private void finishActionMode() { - if (actionMode != null) { - actionMode.finish(); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java deleted file mode 100644 index 8572166..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Andy Scherzinger - * SPDX-FileCopyrightText: 2017-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2014 ownCloud Inc. - * SPDX-FileCopyrightText: 2014 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; - -import com.google.android.material.button.MaterialButton; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.common.collect.Sets; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.databinding.EditBoxDialogBinding; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.ui.activity.ComponentsGetter; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.KeyboardUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.util.List; -import java.util.Set; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; - -/** - * Dialog to input a new name for an {@link OCFile} being renamed. - * Triggers the rename operation. - */ -public class RenameFileDialogFragment - extends DialogFragment implements DialogInterface.OnClickListener, TextWatcher, Injectable { - - private static final String ARG_TARGET_FILE = "TARGET_FILE"; - private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER"; - - @Inject ViewThemeUtils viewThemeUtils; - @Inject FileDataStorageManager fileDataStorageManager; - @Inject KeyboardUtils keyboardUtils; - - private EditBoxDialogBinding binding; - private OCFile mTargetFile; - private MaterialButton positiveButton; - private Set fileNames; - - /** - * Public factory method to create new RenameFileDialogFragment instances. - * - * @param file File to rename. - * @return Dialog ready to show. - */ - public static RenameFileDialogFragment newInstance(OCFile file, OCFile parentFolder) { - RenameFileDialogFragment frag = new RenameFileDialogFragment(); - Bundle args = new Bundle(); - args.putParcelable(ARG_TARGET_FILE, file); - args.putParcelable(ARG_PARENT_FOLDER, parentFolder); - frag.setArguments(args); - return frag; - } - - @Override - public void onStart() { - super.onStart(); - initAlertDialog(); - } - - @Override - public void onResume() { - super.onResume(); - keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.userInput); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - mTargetFile = BundleExtensionsKt.getParcelableArgument(requireArguments(), ARG_TARGET_FILE, OCFile.class); - - // Inflate the layout for the dialog - LayoutInflater inflater = requireActivity().getLayoutInflater(); - binding = EditBoxDialogBinding.inflate(inflater, null, false); - View view = binding.getRoot(); - - // Setup layout - String currentName = mTargetFile.getFileName(); - binding.userInput.setText(currentName); - viewThemeUtils.material.colorTextInputLayout(binding.userInputContainer); - int extensionStart = mTargetFile.isFolder() ? -1 : currentName.lastIndexOf('.'); - int selectionEnd = extensionStart >= 0 ? extensionStart : currentName.length(); - binding.userInput.setSelection(0, selectionEnd); - - OCFile parentFolder = BundleExtensionsKt.getParcelableArgument(getArguments(), ARG_PARENT_FOLDER, OCFile.class); - List folderContent = fileDataStorageManager.getFolderContent(parentFolder, false); - fileNames = Sets.newHashSetWithExpectedSize(folderContent.size()); - - for (OCFile file : folderContent) { - fileNames.add(file.getFileName()); - } - - // Add TextChangedListener to handle showing/hiding the input warning message - binding.userInput.addTextChangedListener(this); - - // Build the dialog - MaterialAlertDialogBuilder builder = buildMaterialAlertDialog(view); - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInputContainer.getContext(), builder); - - return builder.create(); - } - - private MaterialAlertDialogBuilder buildMaterialAlertDialog(View view) { - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireActivity()); - - builder - .setView(view) - .setPositiveButton(R.string.file_rename, this) - .setNegativeButton(R.string.common_cancel, this) - .setTitle(R.string.rename_dialog_title); - - return builder; - } - - private void initAlertDialog() { - AlertDialog alertDialog = (AlertDialog) getDialog(); - - if (alertDialog != null) { - positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); - } - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == AlertDialog.BUTTON_POSITIVE) { - String newFileName = ""; - - if (binding.userInput.getText() != null) { - newFileName = binding.userInput.getText().toString().trim(); - } - - if (TextUtils.isEmpty(newFileName)) { - DisplayUtils.showSnackMessage(requireActivity(), R.string.filename_empty); - return; - } - - if (!FileUtils.isValidName(newFileName)) { - DisplayUtils.showSnackMessage(requireActivity(), R.string.filename_forbidden_charaters_from_server); - - return; - } - - ((ComponentsGetter) requireActivity()).getFileOperationsHelper().renameFile(mTargetFile, newFileName); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - /** - * When user enters a hidden file name, the 'hidden file' message is shown. - * Otherwise, the message is ensured to be hidden. - */ - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - String newFileName = ""; - if (binding.userInput.getText() != null) { - newFileName = binding.userInput.getText().toString().trim(); - } - - if (!TextUtils.isEmpty(newFileName) && newFileName.charAt(0) == '.') { - binding.userInputContainer.setError(getText(R.string.hidden_file_name_warning)); - } else if (TextUtils.isEmpty(newFileName)) { - binding.userInputContainer.setError(getString(R.string.filename_empty)); - positiveButton.setEnabled(false); - } else if (fileNames.contains(newFileName)) { - binding.userInputContainer.setError(getText(R.string.file_already_exists)); - positiveButton.setEnabled(false); - } else if (binding.userInputContainer.getError() != null) { - binding.userInputContainer.setError(null); - // Called to remove extra padding - binding.userInputContainer.setErrorEnabled(false); - positiveButton.setEnabled(true); - } - } - - @Override - public void afterTextChanged(Editable s) { - - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java b/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java deleted file mode 100644 index f01ef6c..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; - -import com.google.android.material.button.MaterialButton; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.databinding.EditBoxDialogBinding; -import com.owncloud.android.lib.resources.shares.OCShare; -import com.owncloud.android.ui.activity.ComponentsGetter; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.KeyboardUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; - -/** - * Dialog to rename a public share. - */ -public class RenamePublicShareDialogFragment - extends DialogFragment implements DialogInterface.OnClickListener, Injectable { - - private static final String ARG_PUBLIC_SHARE = "PUBLIC_SHARE"; - - @Inject ViewThemeUtils viewThemeUtils; - @Inject KeyboardUtils keyboardUtils; - - private EditBoxDialogBinding binding; - private OCShare publicShare; - - public static RenamePublicShareDialogFragment newInstance(OCShare share) { - RenamePublicShareDialogFragment frag = new RenamePublicShareDialogFragment(); - Bundle args = new Bundle(); - args.putParcelable(ARG_PUBLIC_SHARE, share); - frag.setArguments(args); - return frag; - } - - @Override - public void onStart() { - super.onStart(); - - AlertDialog alertDialog = (AlertDialog) getDialog(); - - if (alertDialog != null) { - MaterialButton positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); - } - } - - @Override - public void onResume() { - super.onResume(); - keyboardUtils.showKeyboardForEditText(requireDialog().getWindow(), binding.userInput); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - publicShare = BundleExtensionsKt.getParcelableArgument(requireArguments(), ARG_PUBLIC_SHARE, OCShare.class); - - // Inflate the layout for the dialog - LayoutInflater inflater = requireActivity().getLayoutInflater(); - binding = EditBoxDialogBinding.inflate(inflater, null, false); - View view = binding.getRoot(); - - // Setup layout - viewThemeUtils.material.colorTextInputLayout(binding.userInputContainer); - binding.userInput.setText(publicShare.getLabel()); - - // Build the dialog - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(view.getContext()); - builder.setView(view) - .setPositiveButton(R.string.file_rename, this) - .setNegativeButton(R.string.common_cancel, this) - .setTitle(R.string.public_share_name); - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.userInput.getContext(), builder); - - return builder.create(); - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == AlertDialog.BUTTON_POSITIVE) { - String newName = ""; - if (binding.userInput.getText() != null) { - newName = binding.userInput.getText().toString().trim(); - } - - if (TextUtils.isEmpty(newName)) { - DisplayUtils.showSnackMessage(requireActivity(), R.string.label_empty); - return; - } - - ((ComponentsGetter) requireActivity()).getFileOperationsHelper().setLabelToPublicShare(publicShare, - newName); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.kt deleted file mode 100644 index 61a3ce3..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.kt +++ /dev/null @@ -1,557 +0,0 @@ -/* - * Nextcloud - Android Client - * - * @author Tobias Kaminsky - * @author TSI-mc - * Copyright (C) 2017 Tobias Kaminsky - * Copyright (C) 2017 Nextcloud GmbH. - * Copyright (C) 2023 TSI-mc - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog - -import android.accounts.AccountManager -import android.annotation.SuppressLint -import android.app.Dialog -import android.content.Context -import android.content.DialogInterface -import android.content.Intent -import android.os.AsyncTask -import android.os.Bundle -import android.view.View -import androidx.annotation.VisibleForTesting -import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.DialogFragment -import com.google.android.material.button.MaterialButton -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.nextcloud.client.account.User -import com.nextcloud.client.di.Injectable -import com.nextcloud.utils.extensions.getParcelableArgument -import com.owncloud.android.R -import com.owncloud.android.databinding.SetupEncryptionDialogBinding -import com.owncloud.android.datamodel.ArbitraryDataProvider -import com.owncloud.android.datamodel.ArbitraryDataProviderImpl -import com.owncloud.android.lib.common.accounts.AccountUtils -import com.owncloud.android.lib.common.utils.Log_OC -import com.owncloud.android.lib.resources.e2ee.CsrHelper -import com.owncloud.android.lib.resources.users.DeletePublicKeyRemoteOperation -import com.owncloud.android.lib.resources.users.GetPrivateKeyRemoteOperation -import com.owncloud.android.lib.resources.users.GetPublicKeyRemoteOperation -import com.owncloud.android.lib.resources.users.SendCSRRemoteOperation -import com.owncloud.android.lib.resources.users.StorePrivateKeyRemoteOperation -import com.owncloud.android.utils.EncryptionUtils -import com.owncloud.android.utils.theme.ViewThemeUtils -import java.io.IOException -import java.lang.ref.WeakReference -import java.util.Arrays -import javax.inject.Inject - -/* - * Dialog to setup encryption - */ -class SetupEncryptionDialogFragment : DialogFragment(), Injectable { - - @Inject - lateinit var viewThemeUtils: ViewThemeUtils - - private var user: User? = null - private var arbitraryDataProvider: ArbitraryDataProvider? = null - private var positiveButton: MaterialButton? = null - private var negativeButton: MaterialButton? = null - private var task: DownloadKeysAsyncTask? = null - private var keyResult: String? = null - private var keyWords: ArrayList? = null - - private lateinit var binding: SetupEncryptionDialogBinding - - override fun onStart() { - super.onStart() - - setupAlertDialog() - executeTask() - } - - private fun setupAlertDialog() { - val alertDialog = dialog as AlertDialog? - - if (alertDialog != null) { - positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton? - positiveButton?.let { - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(it) - } - - negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton? - negativeButton?.let { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(it) - } - } - } - - private fun executeTask() { - task = DownloadKeysAsyncTask(requireContext()) - task?.execute() - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - checkNotNull(arguments) { "Arguments may not be null" } - - user = requireArguments().getParcelableArgument(ARG_USER, User::class.java) - - if (savedInstanceState != null) { - keyWords = savedInstanceState.getStringArrayList(EncryptionUtils.MNEMONIC) - } - - arbitraryDataProvider = ArbitraryDataProviderImpl(context) - - // Inflate the layout for the dialog - val inflater = requireActivity().layoutInflater - binding = SetupEncryptionDialogBinding.inflate(inflater, null, false) - - // Setup layout - viewThemeUtils.material.colorTextInputLayout(binding.encryptionPasswordInputContainer) - - val builder = buildMaterialAlertDialog(binding.root) - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireContext(), builder) - return builder.create().apply { - setCanceledOnTouchOutside(false) - setOnShowListener { dialog1: DialogInterface -> - val button = (dialog1 as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE) - button.setOnClickListener { positiveButtonOnClick(this) } - } - } - } - - private fun buildMaterialAlertDialog(v: View): MaterialAlertDialogBuilder { - return MaterialAlertDialogBuilder(requireContext()) - .setView(v) - .setPositiveButton(R.string.common_ok, null) - .setNegativeButton(R.string.common_cancel) { dialog: DialogInterface, _: Int -> dialog.cancel() } - .setTitle(R.string.end_to_end_encryption_title) - } - - private fun positiveButtonOnClick(dialog: DialogInterface) { - when (keyResult) { - KEY_CREATED -> { - Log_OC.d(TAG, "New keys generated and stored.") - dialog.dismiss() - notifyResult() - } - - KEY_EXISTING_USED -> { - decryptPrivateKey(dialog) - } - - KEY_GENERATE -> { - generateKey() - } - - else -> dialog.dismiss() - } - } - - @Suppress("TooGenericExceptionCaught", "TooGenericExceptionThrown") - private fun decryptPrivateKey(dialog: DialogInterface) { - Log_OC.d(TAG, "Decrypt private key") - binding.encryptionStatus.setText(R.string.end_to_end_encryption_decrypting) - - try { - val privateKey = task?.get() - val mnemonicUnchanged = binding.encryptionPasswordInput.text.toString().trim() - val mnemonic = - binding.encryptionPasswordInput.text.toString().replace("\\s".toRegex(), "") - .lowercase() - val decryptedPrivateKey = EncryptionUtils.decryptPrivateKey( - privateKey, - mnemonic - ) - - val accountName = user?.accountName ?: return - - arbitraryDataProvider?.storeOrUpdateKeyValue( - accountName, - EncryptionUtils.PRIVATE_KEY, - decryptedPrivateKey - ) - dialog.dismiss() - - Log_OC.d(TAG, "Private key successfully decrypted and stored") - - arbitraryDataProvider?.storeOrUpdateKeyValue( - accountName, - EncryptionUtils.MNEMONIC, - mnemonicUnchanged - ) - - // check if private key and public key match - val publicKey = arbitraryDataProvider?.getValue( - accountName, - EncryptionUtils.PUBLIC_KEY - ) - - val firstKey = EncryptionUtils.generateKey() - val base64encodedKey = EncryptionUtils.encodeBytesToBase64String(firstKey) - val encryptedString = EncryptionUtils.encryptStringAsymmetric( - base64encodedKey, - publicKey - ) - val decryptedString = EncryptionUtils.decryptStringAsymmetric( - encryptedString, - decryptedPrivateKey - ) - val secondKey = EncryptionUtils.decodeStringToBase64Bytes(decryptedString) - - if (!Arrays.equals(firstKey, secondKey)) { - EncryptionUtils.reportE2eError(arbitraryDataProvider, user) - throw Exception("Keys do not match") - } - - notifyResult() - } catch (e: Exception) { - binding.encryptionStatus.setText(R.string.end_to_end_encryption_wrong_password) - Log_OC.d(TAG, "Error while decrypting private key: " + e.message) - } - } - - private fun generateKey() { - binding.encryptionPassphrase.visibility = View.GONE - positiveButton?.visibility = View.GONE - negativeButton?.visibility = View.GONE - - dialog?.setTitle(R.string.end_to_end_encryption_storing_keys) - - val newKeysTask = GenerateNewKeysAsyncTask(requireContext()) - newKeysTask.execute() - } - - private fun notifyResult() { - val targetFragment = targetFragment - targetFragment?.onActivityResult( - targetRequestCode, - SETUP_ENCRYPTION_RESULT_CODE, - resultIntent - ) - parentFragmentManager.setFragmentResult(RESULT_REQUEST_KEY, resultBundle) - } - - private val resultIntent: Intent - get() { - return Intent().apply { - putExtra(SUCCESS, true) - putExtra(ARG_POSITION, requireArguments().getInt(ARG_POSITION)) - } - } - private val resultBundle: Bundle - get() { - return Bundle().apply { - putBoolean(SUCCESS, true) - putInt(ARG_POSITION, requireArguments().getInt(ARG_POSITION)) - } - } - - override fun onCancel(dialog: DialogInterface) { - super.onCancel(dialog) - - val bundle = Bundle().apply { - putBoolean(RESULT_KEY_CANCELLED, true) - } - - parentFragmentManager.setFragmentResult(RESULT_REQUEST_KEY, bundle) - } - - override fun onSaveInstanceState(outState: Bundle) { - outState.putStringArrayList(EncryptionUtils.MNEMONIC, keyWords) - super.onSaveInstanceState(outState) - } - - @SuppressLint("StaticFieldLeak") - inner class DownloadKeysAsyncTask(context: Context) : AsyncTask() { - private val mWeakContext: WeakReference = WeakReference(context) - - @Suppress("ReturnCount", "LongMethod") - @Deprecated("Deprecated in Java") - override fun doInBackground(vararg params: Void?): String? { - // fetch private/public key - // if available - // - store public key - // - decrypt private key, store unencrypted private key in database - val context = mWeakContext.get() ?: return null - val publicKeyOperation = GetPublicKeyRemoteOperation() - val user = user ?: return null - - val publicKeyResult = publicKeyOperation.executeNextcloudClient(user, context) - - if (!publicKeyResult.isSuccess) { - return null - } - - Log_OC.d(TAG, "public key successful downloaded for " + user.accountName) - - if (arbitraryDataProvider == null) { - return null - } - - val publicKeyFromServer = publicKeyResult.resultData - arbitraryDataProvider?.storeOrUpdateKeyValue( - user.accountName, - EncryptionUtils.PUBLIC_KEY, - publicKeyFromServer - ) - - val privateKeyResult = GetPrivateKeyRemoteOperation().executeNextcloudClient(user, context) - if (privateKeyResult.isSuccess) { - Log_OC.d(TAG, "private key successful downloaded for " + user.accountName) - keyResult = KEY_EXISTING_USED - return privateKeyResult.resultData.getKey() - } - - return null - } - - @Deprecated("Deprecated in Java") - override fun onPreExecute() { - super.onPreExecute() - - binding.encryptionStatus.setText(R.string.end_to_end_encryption_retrieving_keys) - positiveButton?.visibility = View.INVISIBLE - } - - @Deprecated("Deprecated in Java") - override fun onPostExecute(privateKey: String?) { - super.onPostExecute(privateKey) - - val context = mWeakContext.get() - if (context == null) { - Log_OC.e(TAG, "Context lost after fetching private keys.") - return - } - - if (privateKey == null) { - // first show info - try { - if (keyWords == null || keyWords!!.isEmpty()) { - keyWords = EncryptionUtils.getRandomWords(NUMBER_OF_WORDS, context) - } - showMnemonicInfo() - } catch (e: IOException) { - binding.encryptionStatus.setText(R.string.common_error) - } - } else if (privateKey.isNotEmpty()) { - binding.encryptionStatus.setText(R.string.end_to_end_encryption_enter_password) - binding.encryptionPasswordInputContainer.visibility = View.VISIBLE - positiveButton?.visibility = View.VISIBLE - } else { - Log_OC.e(TAG, "Got empty private key string") - } - } - } - - @SuppressLint("StaticFieldLeak") - inner class GenerateNewKeysAsyncTask(context: Context) : AsyncTask() { - private val mWeakContext: WeakReference = WeakReference(context) - - @Deprecated("Deprecated in Java") - override fun onPreExecute() { - super.onPreExecute() - binding.encryptionStatus.setText(R.string.end_to_end_encryption_generating_keys) - } - - @Suppress("TooGenericExceptionCaught", "TooGenericExceptionThrown", "ReturnCount", "LongMethod") - @Deprecated("Deprecated in Java") - override fun doInBackground(vararg voids: Void?): String { - // - create CSR, push to server, store returned public key in database - // - encrypt private key, push key to server, store unencrypted private key in database - try { - val context = mWeakContext.get() - val publicKeyString: String - - if (context == null) { - keyResult = KEY_FAILED - return "" - } - - // Create public/private key pair - val keyPair = EncryptionUtils.generateKeyPair() - - // create CSR - val accountManager = AccountManager.get(context) - val user = user ?: return "" - - val userId = accountManager.getUserData(user.toPlatformAccount(), AccountUtils.Constants.KEY_USER_ID) - val urlEncoded = CsrHelper().generateCsrPemEncodedString(keyPair, userId) - val operation = SendCSRRemoteOperation(urlEncoded) - val result = operation.executeNextcloudClient(user, context) - - if (result.isSuccess) { - publicKeyString = result.resultData - if (!EncryptionUtils.isMatchingKeys(keyPair, publicKeyString)) { - EncryptionUtils.reportE2eError(arbitraryDataProvider, user) - throw RuntimeException("Wrong CSR returned") - } - Log_OC.d(TAG, "public key success") - } else { - keyResult = KEY_FAILED - return "" - } - - val privateKey = keyPair.private - val privateKeyString = EncryptionUtils.encodeBytesToBase64String(privateKey.encoded) - val privatePemKeyString = EncryptionUtils.privateKeyToPEM(privateKey) - val encryptedPrivateKey = EncryptionUtils.encryptPrivateKey( - privatePemKeyString, - generateMnemonicString(false) - ) - - // upload encryptedPrivateKey - val storePrivateKeyOperation = StorePrivateKeyRemoteOperation(encryptedPrivateKey) - val storePrivateKeyResult = storePrivateKeyOperation.executeNextcloudClient(user, context) - if (storePrivateKeyResult.isSuccess) { - Log_OC.d(TAG, "private key success") - arbitraryDataProvider?.storeOrUpdateKeyValue( - user.accountName, - EncryptionUtils.PRIVATE_KEY, - privateKeyString - ) - arbitraryDataProvider?.storeOrUpdateKeyValue( - user.accountName, - EncryptionUtils.PUBLIC_KEY, - publicKeyString - ) - arbitraryDataProvider?.storeOrUpdateKeyValue( - user.accountName, - EncryptionUtils.MNEMONIC, - generateMnemonicString(true) - ) - keyResult = KEY_CREATED - - return storePrivateKeyResult.resultData - } else { - val deletePublicKeyOperation = DeletePublicKeyRemoteOperation() - deletePublicKeyOperation.executeNextcloudClient(user, context) - } - } catch (e: Exception) { - Log_OC.e(TAG, e.message) - } - keyResult = KEY_FAILED - return "" - } - - @Deprecated("Deprecated in Java") - override fun onPostExecute(s: String) { - super.onPostExecute(s) - val context = mWeakContext.get() - if (context == null) { - Log_OC.e(TAG, "Context lost after generating new private keys.") - return - } - if (s.isEmpty()) { - errorSavingKeys() - } else { - if (dialog == null) { - Log_OC.e(TAG, "Dialog is null cannot proceed further.") - return - } - requireDialog().dismiss() - notifyResult() - } - } - } - - private fun generateMnemonicString(withWhitespace: Boolean): String { - val stringBuilder = StringBuilder() - - keyWords?.let { - for (string in it) { - stringBuilder.append(string) - if (withWhitespace) { - stringBuilder.append(' ') - } - } - } - - return stringBuilder.toString() - } - - @VisibleForTesting - fun showMnemonicInfo() { - if (dialog == null) { - Log_OC.e(TAG, "Dialog is null cannot proceed further.") - return - } - requireDialog().setTitle(R.string.end_to_end_encryption_passphrase_title) - binding.encryptionStatus.setText(R.string.end_to_end_encryption_keywords_description) - viewThemeUtils.material.colorTextInputLayout(binding.encryptionPasswordInputContainer) - binding.encryptionPassphrase.text = generateMnemonicString(true) - binding.encryptionPassphrase.visibility = View.VISIBLE - - positiveButton?.setText(R.string.end_to_end_encryption_confirm_button) - positiveButton?.visibility = View.VISIBLE - negativeButton?.visibility = View.VISIBLE - - positiveButton?.let { positiveButton -> - negativeButton?.let { negativeButton -> - viewThemeUtils.platform.colorTextButtons(positiveButton, negativeButton) - } - } - - keyResult = KEY_GENERATE - } - - @VisibleForTesting - fun errorSavingKeys() { - if (dialog == null) { - Log_OC.e(TAG, "Dialog is null cannot proceed further.") - return - } - - keyResult = KEY_FAILED - requireDialog().setTitle(R.string.common_error) - binding.encryptionStatus.setText(R.string.end_to_end_encryption_unsuccessful) - binding.encryptionPassphrase.visibility = View.GONE - - positiveButton?.setText(R.string.end_to_end_encryption_dialog_close) - positiveButton?.visibility = View.VISIBLE - positiveButton?.let { - viewThemeUtils.platform.colorTextButtons(it) - } - } - - @VisibleForTesting - fun setMnemonic(keyWords: ArrayList?) { - this.keyWords = keyWords - } - - companion object { - const val SUCCESS = "SUCCESS" - const val SETUP_ENCRYPTION_RESULT_CODE = 101 - const val SETUP_ENCRYPTION_REQUEST_CODE = 100 - const val SETUP_ENCRYPTION_DIALOG_TAG = "SETUP_ENCRYPTION_DIALOG_TAG" - const val ARG_POSITION = "ARG_POSITION" - const val RESULT_REQUEST_KEY = "RESULT_REQUEST" - const val RESULT_KEY_CANCELLED = "IS_CANCELLED" - private const val NUMBER_OF_WORDS = 12 - private const val ARG_USER = "ARG_USER" - private val TAG = SetupEncryptionDialogFragment::class.java.simpleName - private const val KEY_CREATED = "KEY_CREATED" - private const val KEY_EXISTING_USED = "KEY_EXISTING_USED" - private const val KEY_FAILED = "KEY_FAILED" - private const val KEY_GENERATE = "KEY_GENERATE" - - /** - * Public factory method to create new SetupEncryptionDialogFragment instance - * - * @return Dialog ready to show. - */ - @JvmStatic - fun newInstance(user: User?, position: Int): SetupEncryptionDialogFragment { - val bundle = Bundle().apply { - putParcelable(ARG_USER, user) - putInt(ARG_POSITION, position) - } - - return SetupEncryptionDialogFragment().apply { - arguments = bundle - } - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java deleted file mode 100644 index 0ed3cf1..0000000 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ShareLinkToDialog.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2017-2018 Andy Scherzinger - * SPDX-FileCopyrightText: 2017-2018 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.dialog; - -import android.app.Dialog; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.activity.CopyToClipboardActivity; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; - -/** - * Dialog showing a list activities able to resolve a given Intent, - * filtering out the activities matching give package names. - */ -public class ShareLinkToDialog extends DialogFragment { - - private final static String TAG = ShareLinkToDialog.class.getSimpleName(); - private final static String ARG_INTENT = ShareLinkToDialog.class.getSimpleName() + - ".ARG_INTENT"; - private final static String ARG_PACKAGES_TO_EXCLUDE = ShareLinkToDialog.class.getSimpleName() + - ".ARG_PACKAGES_TO_EXCLUDE"; - - private ActivityAdapter mAdapter; - private Intent mIntent; - - public static ShareLinkToDialog newInstance(Intent intent, String... packagesToExclude) { - ShareLinkToDialog f = new ShareLinkToDialog(); - Bundle args = new Bundle(); - args.putParcelable(ARG_INTENT, intent); - args.putStringArray(ARG_PACKAGES_TO_EXCLUDE, packagesToExclude); - f.setArguments(args); - return f; - } - - public ShareLinkToDialog() { - super(); - Log_OC.d(TAG, "constructor"); - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - mIntent = BundleExtensionsKt.getParcelableArgument(getArguments(), ARG_INTENT, Intent.class); - String[] packagesToExclude = getArguments().getStringArray(ARG_PACKAGES_TO_EXCLUDE); - List packagesToExcludeList = Arrays.asList(packagesToExclude != null ? - packagesToExclude : new String[0]); - - PackageManager pm = getActivity().getPackageManager(); - List activities = pm.queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY); - Iterator it = activities.iterator(); - ResolveInfo resolveInfo; - while (it.hasNext()) { - resolveInfo = it.next(); - if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase(Locale.ROOT))) { - it.remove(); - } - } - - boolean sendAction = mIntent.getBooleanExtra(Intent.ACTION_SEND, false); - - if (!sendAction) { - // add activity for copy to clipboard - Intent copyToClipboardIntent = new Intent(getActivity(), CopyToClipboardActivity.class); - List copyToClipboard = pm.queryIntentActivities(copyToClipboardIntent, 0); - if (!copyToClipboard.isEmpty()) { - activities.add(copyToClipboard.get(0)); - } - } - - Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm)); - mAdapter = new ActivityAdapter(getActivity(), pm, activities); - - return createSelector(sendAction); - } - - private AlertDialog createSelector(final boolean sendAction) { - - int titleId; - if (sendAction) { - titleId = R.string.activity_chooser_send_file_title; - } else { - titleId = R.string.activity_chooser_title; - } - - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity()) - .setTitle(titleId) - .setAdapter(mAdapter, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // Add the information of the chosen activity to the intent to send - ResolveInfo chosen = mAdapter.getItem(which); - ActivityInfo actInfo = chosen.activityInfo; - ComponentName name=new ComponentName( - actInfo.applicationInfo.packageName, - actInfo.name); - mIntent.setComponent(name); - - // Send the file - getActivity().startActivity(mIntent); - } - }); - return builder.create(); - } - - class ActivityAdapter extends ArrayAdapter { - - private PackageManager mPackageManager; - - ActivityAdapter(Context context, PackageManager pm, List apps) { - super(context, R.layout.activity_row, apps); - this.mPackageManager = pm; - } - - @Override - public @NonNull View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { - View view = convertView; - - if (view == null) { - view = newView(parent); - } - bindView(position, view); - return view; - } - - private View newView(ViewGroup parent) { - return((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)). - inflate(R.layout.activity_row, parent, false); - } - - private void bindView(int position, View row) { - TextView label = row.findViewById(R.id.title); - label.setText(getItem(position).loadLabel(mPackageManager)); - ImageView icon = row.findViewById(R.id.icon); - icon.setImageDrawable(getItem(position).loadIcon(mPackageManager)); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java deleted file mode 100644 index 621ed86..0000000 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ /dev/null @@ -1,705 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2018-2021 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2017 Andy Scherzinger - * SPDX-FileCopyrightText: 2017 Mario Danic - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 María Asensio Valverde - * SPDX-FileCopyrightText: 2014 Luke Owncloud - * SPDX-FileCopyrightText: 2012 Bartosz Przybylski - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.fragment; - -import android.animation.LayoutTransition; -import android.app.Activity; -import android.content.Context; -import android.content.res.Configuration; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.text.TextUtils; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.GridView; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.google.android.material.button.MaterialButton; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.preferences.AppPreferences; -import com.nextcloud.client.preferences.AppPreferencesImpl; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.databinding.ListFragmentBinding; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.files.SearchRemoteOperation; -import com.owncloud.android.lib.resources.status.OwnCloudVersion; -import com.owncloud.android.ui.EmptyRecyclerView; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.activity.FolderPickerActivity; -import com.owncloud.android.ui.activity.OnEnforceableRefreshListener; -import com.owncloud.android.ui.activity.UploadFilesActivity; -import com.owncloud.android.ui.adapter.LocalFileListAdapter; -import com.owncloud.android.ui.adapter.OCFileListAdapter; -import com.owncloud.android.ui.events.SearchEvent; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import org.greenrobot.eventbus.EventBus; - -import java.util.ArrayList; - -import javax.inject.Inject; - -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; -import androidx.appcompat.widget.SearchView; -import androidx.core.content.ContextCompat; -import androidx.core.view.MenuItemCompat; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - -public class ExtendedListFragment extends Fragment implements - OnItemClickListener, - OnEnforceableRefreshListener, - SearchView.OnQueryTextListener, - SearchView.OnCloseListener, - Injectable { - - protected static final String TAG = ExtendedListFragment.class.getSimpleName(); - - protected static final String KEY_SAVED_LIST_POSITION = "SAVED_LIST_POSITION"; - - private static final String KEY_INDEXES = "INDEXES"; - private static final String KEY_FIRST_POSITIONS = "FIRST_POSITIONS"; - private static final String KEY_TOPS = "TOPS"; - private static final String KEY_HEIGHT_CELL = "HEIGHT_CELL"; - private static final String KEY_EMPTY_LIST_MESSAGE = "EMPTY_LIST_MESSAGE"; - private static final String KEY_IS_GRID_VISIBLE = "IS_GRID_VISIBLE"; - public static final float minColumnSize = 2.0f; - - private int maxColumnSize = 5; - private int maxColumnSizePortrait = 5; - private int maxColumnSizeLandscape = 10; - - @Inject AppPreferences preferences; - @Inject UserAccountManager accountManager; - @Inject ViewThemeUtils viewThemeUtils; - - private ScaleGestureDetector mScaleGestureDetector; - protected SwipeRefreshLayout mRefreshListLayout; - protected MaterialButton mSortButton; - protected MaterialButton mSwitchGridViewButton; - protected ViewGroup mEmptyListContainer; - protected TextView mEmptyListMessage; - protected TextView mEmptyListHeadline; - protected ImageView mEmptyListIcon; - - // Save the state of the scroll in browsing - private ArrayList mIndexes; - private ArrayList mFirstPositions; - private ArrayList mTops; - private int mHeightCell; - - private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener; - - private EmptyRecyclerView mRecyclerView; - - protected SearchView searchView; - private ImageView closeButton; - private Handler handler = new Handler(Looper.getMainLooper()); - - private float mScale = AppPreferencesImpl.DEFAULT_GRID_COLUMN; - - private ListFragmentBinding binding; - - public ListFragmentBinding getBinding() { - return binding; - } - - protected void setRecyclerViewAdapter(RecyclerView.Adapter recyclerViewAdapter) { - mRecyclerView.setAdapter(recyclerViewAdapter); - } - - protected RecyclerView getRecyclerView() { - return mRecyclerView; - } - - public void setLoading(boolean enabled) { - mRefreshListLayout.setRefreshing(enabled); - } - - public void switchToGridView() { - if (!isGridEnabled()) { - getRecyclerView().setLayoutManager(new GridLayoutManager(getContext(), getColumnsCount())); - } - } - - public void switchToListView() { - if (isGridEnabled()) { - getRecyclerView().setLayoutManager(new LinearLayoutManager(getContext())); - } - } - - public boolean isGridEnabled() { - if (getRecyclerView() != null) { - return getRecyclerView().getLayoutManager() instanceof GridLayoutManager; - } else { - return false; - } - } - - @Override - public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) { - final MenuItem item = menu.findItem(R.id.action_search); - searchView = (SearchView) MenuItemCompat.getActionView(item); - viewThemeUtils.androidx.themeToolbarSearchView(searchView); - closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); - searchView.setOnQueryTextListener(this); - searchView.setOnCloseListener(this); - - final Handler handler = new Handler(); - - DisplayMetrics displaymetrics = new DisplayMetrics(); - Activity activity; - if ((activity = getActivity()) != null) { - activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); - int width = displaymetrics.widthPixels; - if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - searchView.setMaxWidth((int) (width * 0.4)); - } else { - if (activity instanceof FolderPickerActivity) { - searchView.setMaxWidth((int) (width * 0.8)); - } else { - searchView.setMaxWidth(width); - } - } - } - - searchView.setOnQueryTextFocusChangeListener((v, hasFocus) -> handler.post(() -> { - if (getActivity() != null && !(getActivity() instanceof FolderPickerActivity) - && !(getActivity() instanceof UploadFilesActivity)) { - if (getActivity() instanceof FileDisplayActivity) { - Fragment fragment = ((FileDisplayActivity) getActivity()).getLeftFragment(); - if (fragment instanceof OCFileListFragment) { - ((OCFileListFragment) fragment).setFabVisible(!hasFocus); - } - } - if (TextUtils.isEmpty(searchView.getQuery())) { - closeButton.setVisibility(View.INVISIBLE); - } - } - })); - - // On close -> empty field, show keyboard and - closeButton.setOnClickListener(view -> { - searchView.setQuery("", true); - searchView.requestFocus(); - searchView.onActionViewExpanded(); - - InputMethodManager inputMethodManager = - (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - - if (inputMethodManager != null) { - inputMethodManager.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT); - } - }); - - LinearLayout searchBar = searchView.findViewById(R.id.search_bar); - searchBar.setLayoutTransition(new LayoutTransition()); - } - - public boolean onQueryTextChange(final String query) { - // After 300 ms, set the query - - closeButton.setVisibility(View.VISIBLE); - if (query.isEmpty()) { - closeButton.setVisibility(View.INVISIBLE); - } - return false; - } - - @Override - public boolean onQueryTextSubmit(String query) { - RecyclerView.Adapter adapter = getRecyclerView().getAdapter(); - if (adapter instanceof OCFileListAdapter) { - ArrayList listOfHiddenFiles = ((OCFileListAdapter) adapter).listOfHiddenFiles; - performSearch(query, listOfHiddenFiles, false); - return true; - } - return false; - } - - public void performSearch(final String query, final ArrayList listOfHiddenFiles, boolean isBackPressed) { - handler.removeCallbacksAndMessages(null); - RecyclerView.Adapter adapter = getRecyclerView().getAdapter(); - Activity activity = getActivity(); - if (activity != null) { - if (activity instanceof FileDisplayActivity) { - if (isBackPressed && TextUtils.isEmpty(query)) { - FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity; - fileDisplayActivity.resetSearchView(); - fileDisplayActivity.updateListOfFilesFragment(true); - } else { - handler.post(() -> { - if (adapter instanceof OCFileListAdapter) { - if (accountManager - .getUser() - .getServer() - .getVersion() - .isNewerOrEqual(OwnCloudVersion.nextcloud_20) - ) { - ((FileDisplayActivity) activity).performUnifiedSearch(query, listOfHiddenFiles); - } else { - EventBus.getDefault().post( - new SearchEvent(query, SearchRemoteOperation.SearchType.FILE_SEARCH) - ); - } - } else if (adapter instanceof LocalFileListAdapter) { - LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) adapter; - localFileListAdapter.filter(query); - } - }); - - if (searchView != null) { - searchView.clearFocus(); - } - } - } else if (activity instanceof UploadFilesActivity) { - LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) adapter; - localFileListAdapter.filter(query); - ((UploadFilesActivity) activity).showToolbarSpinner(); - } else if (activity instanceof FolderPickerActivity) { - ((FolderPickerActivity) activity).search(query); - } - } - } - - @Override - public boolean onClose() { - RecyclerView.Adapter adapter = getRecyclerView().getAdapter(); - if (adapter instanceof OCFileListAdapter) { - ArrayList listOfHiddenFiles = ((OCFileListAdapter) adapter).listOfHiddenFiles; - performSearch("", listOfHiddenFiles,true); - return false; - } - return true; - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Log_OC.d(TAG, "onCreateView"); - - binding = ListFragmentBinding.inflate(inflater, container, false); - View v = binding.getRoot(); - - setupEmptyList(v); - - mRecyclerView = binding.listRoot; - mRecyclerView.setHasFooter(true); - mRecyclerView.setEmptyView(binding.emptyList.emptyListView); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - mScale = preferences.getGridColumns(); - setGridViewColumns(1f); - - mScaleGestureDetector = new ScaleGestureDetector(MainApp.getAppContext(), new ScaleListener()); - - getRecyclerView().setOnTouchListener((view, motionEvent) -> { - mScaleGestureDetector.onTouchEvent(motionEvent); - - if (motionEvent.getAction() == MotionEvent.ACTION_UP) { - view.performClick(); - } - - return false; - }); - - // Pull-down to refresh layout - mRefreshListLayout = binding.swipeContainingList; - viewThemeUtils.androidx.themeSwipeRefreshLayout(mRefreshListLayout); - mRefreshListLayout.setOnRefreshListener(this); - - mSortButton = getActivity().findViewById(R.id.sort_button); - if (mSortButton != null) { - viewThemeUtils.material.colorMaterialTextButton(mSortButton); - } - mSwitchGridViewButton = getActivity().findViewById(R.id.switch_grid_view_button); - if (mSwitchGridViewButton != null) { - viewThemeUtils.material.colorMaterialTextButton(mSwitchGridViewButton); - } - - return v; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { - @Override - public boolean onScale(ScaleGestureDetector detector) { - setGridViewColumns(detector.getScaleFactor()); - - preferences.setGridColumns(mScale); - - getRecyclerView().getAdapter().notifyDataSetChanged(); - - return true; - } - } - - protected void setGridViewColumns(float scaleFactor) { - if (mRecyclerView.getLayoutManager() instanceof GridLayoutManager) { - GridLayoutManager gridLayoutManager = (GridLayoutManager) mRecyclerView.getLayoutManager(); - if (mScale == -1f) { - gridLayoutManager.setSpanCount(GridView.AUTO_FIT); - mScale = gridLayoutManager.getSpanCount(); - } - mScale *= 1.f - (scaleFactor - 1.f); - mScale = Math.max(minColumnSize, Math.min(mScale, maxColumnSize)); - Integer scaleInt = Math.round(mScale); - gridLayoutManager.setSpanCount(scaleInt); - mRecyclerView.getAdapter().notifyDataSetChanged(); - } - } - - protected void setupEmptyList(View view) { - mEmptyListContainer = binding.emptyList.emptyListView; - mEmptyListMessage = binding.emptyList.emptyListViewText; - mEmptyListHeadline = binding.emptyList.emptyListViewHeadline; - mEmptyListIcon = binding.emptyList.emptyListIcon; - } - - /** - * {@inheritDoc} - */ - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - if (savedInstanceState != null) { - mIndexes = savedInstanceState.getIntegerArrayList(KEY_INDEXES); - mFirstPositions = savedInstanceState.getIntegerArrayList(KEY_FIRST_POSITIONS); - mTops = savedInstanceState.getIntegerArrayList(KEY_TOPS); - mHeightCell = savedInstanceState.getInt(KEY_HEIGHT_CELL); - setMessageForEmptyList(savedInstanceState.getString(KEY_EMPTY_LIST_MESSAGE)); - - if (savedInstanceState.getBoolean(KEY_IS_GRID_VISIBLE, false) && getRecyclerView().getAdapter() != null) { - switchToGridView(); - } - - int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION); - Log_OC.v(TAG, "Setting grid position " + referencePosition); - scrollToPosition(referencePosition); - } else { - mIndexes = new ArrayList<>(); - mFirstPositions = new ArrayList<>(); - mTops = new ArrayList<>(); - mHeightCell = 0; - } - } - - - @Override - public void onSaveInstanceState(@NonNull Bundle savedInstanceState) { - super.onSaveInstanceState(savedInstanceState); - Log_OC.d(TAG, "onSaveInstanceState()"); - savedInstanceState.putBoolean(KEY_IS_GRID_VISIBLE, isGridEnabled()); - savedInstanceState.putIntegerArrayList(KEY_INDEXES, mIndexes); - savedInstanceState.putIntegerArrayList(KEY_FIRST_POSITIONS, mFirstPositions); - savedInstanceState.putIntegerArrayList(KEY_TOPS, mTops); - savedInstanceState.putInt(KEY_HEIGHT_CELL, mHeightCell); - savedInstanceState.putString(KEY_EMPTY_LIST_MESSAGE, getEmptyViewText()); - - preferences.setGridColumns(mScale); - } - - public int getColumnsCount() { - if (mScale == -1) { - return Math.round(AppPreferencesImpl.DEFAULT_GRID_COLUMN); - } - return Math.round(mScale); - } - - /* - * Restore index and position - */ - protected void restoreIndexAndTopPosition() { - if (mIndexes == null || mIndexes.isEmpty()) { - Log_OC.d(TAG,"Indexes is null or empty"); - return; - } - - // needs to be checked; not every browse-up had a browse-down before - - int index = mIndexes.remove(mIndexes.size() - 1); - final int firstPosition = mFirstPositions.remove(mFirstPositions.size() - 1); - int top = mTops.remove(mTops.size() - 1); - - Log_OC.v(TAG, "Setting selection to position: " + firstPosition + "; top: " - + top + "; index: " + index); - - scrollToPosition(firstPosition); - } - - private void scrollToPosition(int position) { - LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager(); - - if (linearLayoutManager != null) { - int visibleItemCount = linearLayoutManager.findLastCompletelyVisibleItemPosition() - - linearLayoutManager.findFirstCompletelyVisibleItemPosition(); - linearLayoutManager.scrollToPositionWithOffset(position, (visibleItemCount / 2) * mHeightCell); - } - } - - /* - * Save index and top position - */ - protected void saveIndexAndTopPosition(int index) { - - mIndexes.add(index); - - RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager(); - int firstPosition; - if (layoutManager instanceof GridLayoutManager) { - firstPosition = ((GridLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition(); - } else { - firstPosition = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition(); - } - - mFirstPositions.add(firstPosition); - - View view = mRecyclerView.getChildAt(0); - int top = (view == null) ? 0 : view.getTop(); - - mTops.add(top); - - // Save the height of a cell - mHeightCell = (view == null || mHeightCell != 0) ? mHeightCell : view.getHeight(); - } - - - public void onItemClick(AdapterView parent, View view, int position, long id) { - // to be @overridden - } - - @Override - public void onRefresh() { - - if (searchView != null) { - searchView.onActionViewCollapsed(); - - Activity activity; - if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) { - FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity; - fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isDrawerIndicatorAvailable()); - fileDisplayActivity.hideSearchView(fileDisplayActivity.getCurrentDir()); - } - } - if (mOnRefreshListener != null) { - mOnRefreshListener.onRefresh(); - } - } - - public void setOnRefreshListener(OnEnforceableRefreshListener listener) { - mOnRefreshListener = listener; - } - - - /** - * Disables swipe gesture. - *

- * Sets the 'enabled' state of the refresh layouts contained in the fragment. - *

- * When 'false' is set, prevents user gestures but keeps the option to refresh programmatically, - * - * @param enabled Desired state for capturing swipe gesture. - */ - public void setSwipeEnabled(boolean enabled) { - mRefreshListLayout.setEnabled(enabled); - } - - - - /** - * /** Set message for empty list view. - */ - public void setMessageForEmptyList(String message) { - if (mEmptyListContainer != null && mEmptyListMessage != null) { - mEmptyListMessage.setText(message); - } - } - - /** - * displays an empty list information with a headline, a message and a not to be tinted icon. - * - * @param headline the headline - * @param message the message - * @param icon the icon to be shown - */ - public void setMessageForEmptyList(@StringRes final int headline, @StringRes final int message, - @DrawableRes final int icon) { - setMessageForEmptyList(headline, message, icon, false); - } - - /** - * displays an empty list information with a headline, a message and an icon. - * - * @param headline the headline - * @param message the message - * @param icon the icon to be shown - * @param tintIcon flag if the given icon should be tinted with primary color - */ - public void setMessageForEmptyList(@StringRes final int headline, @StringRes final int message, - @DrawableRes final int icon, final boolean tintIcon) { - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - - if (mEmptyListContainer != null && mEmptyListMessage != null) { - mEmptyListHeadline.setText(headline); - mEmptyListMessage.setText(message); - - if (tintIcon) { - if (getContext() != null) { - mEmptyListIcon.setImageDrawable( - viewThemeUtils.platform.tintPrimaryDrawable(getContext(), icon)); - } - } else { - mEmptyListIcon.setImageResource(icon); - } - - mEmptyListIcon.setVisibility(View.VISIBLE); - mEmptyListMessage.setVisibility(View.VISIBLE); - } - } - }); - } - - public void setEmptyListMessage(final SearchType searchType) { - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - - if (searchType == SearchType.NO_SEARCH) { - setMessageForEmptyList(R.string.file_list_empty_headline, - R.string.file_list_empty, - R.drawable.ic_list_empty_folder, - true); - } else if (searchType == SearchType.FILE_SEARCH) { - setMessageForEmptyList(R.string.file_list_empty_headline_server_search, - R.string.file_list_empty, - R.drawable.ic_search_light_grey); - } else if (searchType == SearchType.FAVORITE_SEARCH) { - setMessageForEmptyList(R.string.file_list_empty_favorite_headline, - R.string.file_list_empty_favorites_filter_list, - R.drawable.ic_star_light_yellow); - } else if (searchType == SearchType.RECENTLY_MODIFIED_SEARCH) { - setMessageForEmptyList(R.string.file_list_empty_headline_server_search, - R.string.file_list_empty_recently_modified, - R.drawable.ic_list_empty_recent); - } else if (searchType == SearchType.REGULAR_FILTER) { - setMessageForEmptyList(R.string.file_list_empty_headline_search, - R.string.file_list_empty_search, - R.drawable.ic_search_light_grey); - } else if (searchType == SearchType.SHARED_FILTER) { - setMessageForEmptyList(R.string.file_list_empty_shared_headline, - R.string.file_list_empty_shared, - R.drawable.ic_list_empty_shared); - } else if (searchType == SearchType.GALLERY_SEARCH) { - setMessageForEmptyList(R.string.file_list_empty_headline_server_search, - R.string.file_list_empty_gallery, - R.drawable.file_image); - } - } - }); - } - - /** - * Set message for empty list view. - */ - public void setEmptyListLoadingMessage() { - new Handler(Looper.getMainLooper()).post(() -> { - if (mEmptyListContainer != null && mEmptyListMessage != null) { - mEmptyListHeadline.setText(R.string.file_list_loading); - mEmptyListMessage.setText(""); - - mEmptyListIcon.setVisibility(View.GONE); - } - }); - } - - /** - * Get the text of EmptyListMessage TextView. - * - * @return String empty text view text-value - */ - public String getEmptyViewText() { - return (mEmptyListContainer != null && mEmptyListMessage != null) ? mEmptyListMessage.getText().toString() : ""; - } - - @Override - public void onRefresh(boolean ignoreETag) { - if (mOnRefreshListener != null) { - if (mOnRefreshListener instanceof FileDisplayActivity) { - ((FileDisplayActivity) mOnRefreshListener).onRefresh(ignoreETag); - } else { - mOnRefreshListener.onRefresh(); - } - } - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - maxColumnSize = maxColumnSizeLandscape; - } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - maxColumnSize = maxColumnSizePortrait; - } - - if (isGridEnabled() && getColumnsCount() > maxColumnSize) { - ((GridLayoutManager) getRecyclerView().getLayoutManager()).setSpanCount(maxColumnSize); - } - } - - protected void setGridSwitchButton() { - if (isGridEnabled()) { - mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_list_view)); - mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_list)); - } else { - mSwitchGridViewButton.setContentDescription(getString(R.string.action_switch_grid_view)); - mSwitchGridViewButton.setIcon(ContextCompat.getDrawable(requireContext(), R.drawable.ic_view_module)); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java deleted file mode 100644 index fd1a98f..0000000 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.fragment; - -import android.os.Bundle; -import android.view.View; - -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.google.gson.Gson; -import com.nextcloud.client.account.User; -import com.nextcloud.client.device.DeviceInfo; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.documentscan.AppScanOptionalFeature; -import com.nextcloud.utils.EditorUtils; -import com.owncloud.android.R; -import com.owncloud.android.databinding.FileListActionsBottomSheetCreatorBinding; -import com.owncloud.android.databinding.FileListActionsBottomSheetFragmentBinding; -import com.owncloud.android.datamodel.ArbitraryDataProvider; -import com.owncloud.android.datamodel.ArbitraryDataProviderImpl; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.Creator; -import com.owncloud.android.lib.common.DirectEditing; -import com.owncloud.android.lib.resources.status.OCCapability; -import com.owncloud.android.ui.activity.FileActivity; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.theme.ThemeUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -/** - * FAB menu {@link android.app.Dialog} styled as a bottom sheet for main actions. - */ -public class OCFileListBottomSheetDialog extends BottomSheetDialog implements Injectable { - - private FileListActionsBottomSheetFragmentBinding binding; - private final OCFileListBottomSheetActions actions; - private final FileActivity fileActivity; - private final DeviceInfo deviceInfo; - private final User user; - private final OCFile file; - private final ThemeUtils themeUtils; - private final ViewThemeUtils viewThemeUtils; - private final EditorUtils editorUtils; - - private final AppScanOptionalFeature appScanOptionalFeature; - - - public OCFileListBottomSheetDialog(FileActivity fileActivity, - OCFileListBottomSheetActions actions, - DeviceInfo deviceInfo, - User user, - OCFile file, - ThemeUtils themeUtils, - ViewThemeUtils viewThemeUtils, - EditorUtils editorUtils, - AppScanOptionalFeature appScanOptionalFeature) { - super(fileActivity); - this.actions = actions; - this.fileActivity = fileActivity; - this.deviceInfo = deviceInfo; - this.user = user; - this.file = file; - this.themeUtils = themeUtils; - this.viewThemeUtils = viewThemeUtils; - this.editorUtils = editorUtils; - this.appScanOptionalFeature = appScanOptionalFeature; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding = FileListActionsBottomSheetFragmentBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - viewThemeUtils.platform.colorImageView(binding.menuIconUploadFiles); - viewThemeUtils.platform.colorImageView(binding.menuIconUploadFromApp); - viewThemeUtils.platform.colorImageView(binding.menuIconDirectCameraUpload); - viewThemeUtils.platform.colorImageView(binding.menuIconScanDocUpload); - viewThemeUtils.platform.colorImageView(binding.menuIconMkdir); - viewThemeUtils.platform.colorImageView(binding.menuIconAddFolderInfo); - - binding.addToCloud.setText(getContext().getResources().getString(R.string.add_to_cloud, - themeUtils.getDefaultDisplayNameForRootFolder(getContext()))); - - OCCapability capability = fileActivity.getCapabilities(); - if (capability != null && - capability.getRichDocuments().isTrue() && - capability.getRichDocumentsDirectEditing().isTrue() && - capability.getRichDocumentsTemplatesAvailable().isTrue() && - !file.isEncrypted()) { - binding.templates.setVisibility(View.VISIBLE); - } - - String json = new ArbitraryDataProviderImpl(getContext()) - .getValue(user, ArbitraryDataProvider.DIRECT_EDITING); - - if (!json.isEmpty() && - !file.isEncrypted()) { - DirectEditing directEditing = new Gson().fromJson(json, DirectEditing.class); - - if (!directEditing.getCreators().isEmpty()) { - binding.creatorsContainer.setVisibility(View.VISIBLE); - - for (Creator creator : directEditing.getCreators().values()) { - FileListActionsBottomSheetCreatorBinding creatorViewBinding = - FileListActionsBottomSheetCreatorBinding.inflate(getLayoutInflater()); - - View creatorView = creatorViewBinding.getRoot(); - - creatorViewBinding.creatorName.setText( - String.format(fileActivity.getString(R.string.editor_placeholder), - fileActivity.getString(R.string.create_new), - creator.getName())); - - creatorViewBinding.creatorThumbnail.setImageDrawable( - MimeTypeUtil.getFileTypeIcon(creator.getMimetype(), - creator.getExtension(), - creatorViewBinding.creatorThumbnail.getContext(), - viewThemeUtils)); - - creatorView.setOnClickListener(v -> { - actions.showTemplate(creator, creatorViewBinding.creatorName.getText().toString()); - dismiss(); - }); - - binding.creators.addView(creatorView); - } - } - } - - if (!deviceInfo.hasCamera(getContext())) { - binding.menuDirectCameraUpload.setVisibility(View.GONE); - } - - // create rich workspace - if (editorUtils.isEditorAvailable(user, - MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN) && - file != null && !file.isEncrypted()) { - // richWorkspace - // == "": no info set -> show button - // == null: disabled on server side -> hide button - // != "": info set -> hide button - if (file.getRichWorkspace() == null || !"".equals(file.getRichWorkspace())) { - binding.menuCreateRichWorkspace.setVisibility(View.GONE); - binding.menuCreateRichWorkspaceDivider.setVisibility(View.GONE); - } else { - binding.menuCreateRichWorkspace.setVisibility(View.VISIBLE); - binding.menuCreateRichWorkspaceDivider.setVisibility(View.VISIBLE); - } - } else { - binding.menuCreateRichWorkspace.setVisibility(View.GONE); - binding.menuCreateRichWorkspaceDivider.setVisibility(View.GONE); - } - - setupClickListener(); - } - - private void setupClickListener() { - binding.menuCreateRichWorkspace.setOnClickListener(v -> { - actions.createRichWorkspace(); - dismiss(); - }); - - binding.menuMkdir.setOnClickListener(v -> { - actions.createFolder(); - dismiss(); - }); - - binding.menuUploadFromApp.setOnClickListener(v -> { - actions.uploadFromApp(); - dismiss(); - }); - - binding.menuDirectCameraUpload.setOnClickListener(v -> { - actions.directCameraUpload(); - dismiss(); - }); - - if (appScanOptionalFeature.isAvailable()) { - binding.menuScanDocUpload.setOnClickListener(v -> { - actions.scanDocUpload(); - dismiss(); - }); - } else { - binding.menuScanDocUpload.setVisibility(View.GONE); - } - - binding.menuUploadFiles.setOnClickListener(v -> { - actions.uploadFiles(); - dismiss(); - }); - - binding.menuNewDocument.setOnClickListener(v -> { - actions.newDocument(); - dismiss(); - }); - - binding.menuNewSpreadsheet.setOnClickListener(v -> { - actions.newSpreadsheet(); - dismiss(); - }); - - binding.menuNewPresentation.setOnClickListener(v -> { - actions.newPresentation(); - dismiss(); - }); - } - - @Override - protected void onStop() { - super.onStop(); - binding = null; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 981555d..ace98a6 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -508,16 +508,17 @@ public class OCFileListFragment extends ExtendedListFragment implements return; } - final var currentDir = getCurrentFile(); - if (currentDir == null) { - Log_OC.w(TAG, "currentDir is null cannot register fab listener"); - return; - } - // is not available in FolderPickerActivity viewThemeUtils.material.themeFAB(mFabMain); mFabMain.setOnClickListener(v -> { PermissionUtil.requestMediaLocationPermission(fileActivity); + + var currentDir = getCurrentFile(); + if (currentDir == null) { + Log_OC.w(TAG, "currentDir is null cannot open bottom sheet dialog"); + return; + } + final OCFileListBottomSheetDialog dialog = new OCFileListBottomSheetDialog(fileActivity, this, deviceInfo, @@ -1631,9 +1632,7 @@ public class OCFileListFragment extends ExtendedListFragment implements switchToListView(); } - if (mSortButton != null) { - mSortButton.setText(DisplayUtils.getSortOrderStringId(preferences.getSortOrderByFolder(mFile))); - } + updateSortButton(); if (mSwitchGridViewButton != null) { setGridSwitchButton(); } @@ -1644,6 +1643,19 @@ public class OCFileListFragment extends ExtendedListFragment implements invalidateActionMode(); } + + private void updateSortButton() { + if (mSortButton != null) { + FileSortOrder sortOrder; + if (currentSearchType == FAVORITE_SEARCH) { + sortOrder = preferences.getSortOrderByType(FileSortOrder.Type.favoritesListView, FileSortOrder.SORT_A_TO_Z); + } else { + sortOrder = preferences.getSortOrderByFolder(mFile); + } + + mSortButton.setText(DisplayUtils.getSortOrderStringId(sortOrder)); + } + } private void invalidateActionMode() { if (mActiveActionMode != null) { @@ -1924,6 +1936,8 @@ public class OCFileListFragment extends ExtendedListFragment implements } }; + updateSortButton(); + new Handler(Looper.getMainLooper()).post(switchViewsRunnable); final User currentUser = accountManager.getUser(); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharingMenuHelper.java b/app/src/main/java/com/owncloud/android/ui/fragment/util/SharingMenuHelper.java deleted file mode 100644 index 6f93fa2..0000000 --- a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharingMenuHelper.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Nextcloud Android client application - * - * @author Andy Scherzinger - * @author TSI-mc - * Copyright (C) 2018 Andy Scherzinger - * Copyright (C) 2021 TSI-mc - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.owncloud.android.ui.fragment.util; - -import android.content.Context; -import android.content.res.Resources; -import android.view.MenuItem; - -import com.owncloud.android.R; -import com.owncloud.android.lib.resources.shares.OCShare; - -import java.text.SimpleDateFormat; -import java.util.Date; - -import static com.owncloud.android.lib.resources.shares.OCShare.CREATE_PERMISSION_FLAG; -import static com.owncloud.android.lib.resources.shares.OCShare.MAXIMUM_PERMISSIONS_FOR_FILE; -import static com.owncloud.android.lib.resources.shares.OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER; -import static com.owncloud.android.lib.resources.shares.OCShare.NO_PERMISSION; -import static com.owncloud.android.lib.resources.shares.OCShare.READ_PERMISSION_FLAG; -import static com.owncloud.android.lib.resources.shares.OCShare.SHARE_PERMISSION_FLAG; - -/** - * Helper calls for visibility logic of the sharing menu. - */ -public final class SharingMenuHelper { - - private SharingMenuHelper() { - // utility class -> private constructor - } - - /** - * Sets checked/visibility state on the given {@link MenuItem} based on the given criteria. - * - * @param menuItem the {@link MenuItem} to be setup - */ - public static void setupHideFileDownload(MenuItem menuItem, - boolean hideFileDownload, - boolean isFileDrop) { - if (isFileDrop) { - menuItem.setVisible(false); - } else { - menuItem.setVisible(true); - menuItem.setChecked(hideFileDownload); - } - } - - /** - * sets up the password {@link MenuItem}'s title based on the fact if a password is present. - * - * @param password the password {@link MenuItem} - * @param isPasswordProtected flag is a password is present - */ - public static void setupPasswordMenuItem(MenuItem password, boolean isPasswordProtected) { - if (isPasswordProtected) { - password.setTitle(R.string.share_password_title); - } else { - password.setTitle(R.string.share_no_password_title); - } - } - - /** - * sets up the expiration date {@link MenuItem}'s title based on the fact if an expiration date is present. - * - * @param expirationDate the expiration date {@link MenuItem} - * @param expirationDateValue the expiration date - * @param res Resources to load the corresponding strings. - */ - public static void setupExpirationDateMenuItem(MenuItem expirationDate, long expirationDateValue, Resources res) { - if (expirationDateValue > 0) { - expirationDate.setTitle(res.getString( - R.string.share_expiration_date_label, - SimpleDateFormat.getDateInstance().format(new Date(expirationDateValue)) - )); - } else { - expirationDate.setTitle(R.string.share_no_expiration_date_label); - } - } - - public static boolean isUploadAndEditingAllowed(OCShare share) { - if (share.getPermissions() == NO_PERMISSION) { - return false; - } - - return (share.getPermissions() & (share.isFolder() ? MAXIMUM_PERMISSIONS_FOR_FOLDER : - MAXIMUM_PERMISSIONS_FOR_FILE)) == (share.isFolder() ? MAXIMUM_PERMISSIONS_FOR_FOLDER : - MAXIMUM_PERMISSIONS_FOR_FILE); - } - - public static boolean isReadOnly(OCShare share) { - if (share.getPermissions() == NO_PERMISSION) { - return false; - } - - return (share.getPermissions() & ~SHARE_PERMISSION_FLAG) == READ_PERMISSION_FLAG; - } - - public static boolean isFileDrop(OCShare share) { - if (share.getPermissions() == NO_PERMISSION) { - return false; - } - - return (share.getPermissions() & ~SHARE_PERMISSION_FLAG) == CREATE_PERMISSION_FLAG; - } - - public static boolean isSecureFileDrop(OCShare share) { - if (share.getPermissions() == NO_PERMISSION) { - return false; - } - - return (share.getPermissions() & ~SHARE_PERMISSION_FLAG) == CREATE_PERMISSION_FLAG + READ_PERMISSION_FLAG; - } - - public static String getPermissionName(Context context, OCShare share) { - if (SharingMenuHelper.isUploadAndEditingAllowed(share)) { - return context.getResources().getString(R.string.share_permission_can_edit); - } else if (SharingMenuHelper.isReadOnly(share)) { - return context.getResources().getString(R.string.share_permission_view_only); - } else if (SharingMenuHelper.isSecureFileDrop(share)) { - return context.getResources().getString(R.string.share_permission_secure_file_drop); - } else if (SharingMenuHelper.isFileDrop(share)) { - return context.getResources().getString(R.string.share_permission_file_drop); - } - return null; - } - - /** - * method to get the current checked index from the list of permissions - * - */ - public static int getPermissionCheckedItem(Context context, OCShare share, String[] permissionArray) { - if (SharingMenuHelper.isUploadAndEditingAllowed(share)) { - if (share.isFolder()) { - return getPermissionIndexFromArray(context, permissionArray, R.string.link_share_allow_upload_and_editing); - } else { - return getPermissionIndexFromArray(context, permissionArray, R.string.link_share_editing); - } - } else if (SharingMenuHelper.isReadOnly(share)) { - return getPermissionIndexFromArray(context, permissionArray, R.string.link_share_view_only); - } else if (SharingMenuHelper.isFileDrop(share)) { - return getPermissionIndexFromArray(context, permissionArray, R.string.link_share_file_drop); - } - return 0;//default first item selected - } - - private static int getPermissionIndexFromArray(Context context, String[] permissionArray, int permissionName) { - for (int i = 0; i < permissionArray.length; i++) { - if (permissionArray[i].equalsIgnoreCase(context.getResources().getString(permissionName))) { - return i; - } - } - return 0; - } - - public static boolean canReshare(OCShare share) { - return (share.getPermissions() & SHARE_PERMISSION_FLAG) > 0; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java b/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java deleted file mode 100644 index 05cba63..0000000 --- a/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Jonas Mayer - * SPDX-FileCopyrightText: 2018 Andy Scherzinger - * SPDX-FileCopyrightText: 2017 Tobias Kaminsky - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2014 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) - */ -package com.owncloud.android.ui.notifications; - -import android.app.NotificationManager; -import android.content.Context; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Process; - -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.security.SecureRandom; - -import androidx.core.app.NotificationCompat; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; - -public final class NotificationUtils { - - public static final String NOTIFICATION_CHANNEL_GENERAL = "NOTIFICATION_CHANNEL_GENERAL"; - public static final String NOTIFICATION_CHANNEL_DOWNLOAD = "NOTIFICATION_CHANNEL_DOWNLOAD"; - public static final String NOTIFICATION_CHANNEL_UPLOAD = "NOTIFICATION_CHANNEL_UPLOAD"; - public static final String NOTIFICATION_CHANNEL_MEDIA = "NOTIFICATION_CHANNEL_MEDIA"; - public static final String NOTIFICATION_CHANNEL_FILE_SYNC = "NOTIFICATION_CHANNEL_FILE_SYNC"; - public static final String NOTIFICATION_CHANNEL_FILE_OBSERVER = "NOTIFICATION_CHANNEL_FILE_OBSERVER"; - public static final String NOTIFICATION_CHANNEL_PUSH = "NOTIFICATION_CHANNEL_PUSH"; - public static final String NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS = "NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS"; - public static final String NOTIFICATION_CHANNEL_OFFLINE_OPERATIONS = "NOTIFICATION_CHANNEL_OFFLINE_OPERATIONS"; - - private NotificationUtils() { - // utility class -> private constructor - } - - /** - * Factory method for {@link androidx.core.app.NotificationCompat.Builder} instances. - * - * Not strictly needed from the moment when the minimum API level supported by the app - * was raised to 14 (Android 4.0). - * - * Formerly, returned a customized implementation of {@link androidx.core.app.NotificationCompat.Builder} - * for Android API levels >= 8 and < 14. - * - * Kept in place for the extra abstraction level; notifications in the app need a review, and they - * change a lot in different Android versions. - * - * @param context Context that will use the builder to create notifications - * @return An instance of the regular {@link NotificationCompat.Builder}. - */ - public static NotificationCompat.Builder newNotificationBuilder(Context context, String channelId, final ViewThemeUtils viewThemeUtils) { - final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId); - viewThemeUtils.androidx.themeNotificationCompatBuilder(context, builder); - return builder; - } - - @SuppressFBWarnings("DMI") - public static void cancelWithDelay(final NotificationManager notificationManager, final int notificationId, - long delayInMillis) { - - HandlerThread thread = new HandlerThread( - "NotificationDelayerThread_" + new SecureRandom().nextInt(), Process.THREAD_PRIORITY_BACKGROUND); - thread.start(); - - Handler handler = new Handler(thread.getLooper()); - handler.postDelayed(() -> { - notificationManager.cancel(notificationId); - ((HandlerThread) Thread.currentThread()).getLooper().quit(); - }, delayInMillis); - } - - public static String createUploadNotificationTag(OCFile file){ - return createUploadNotificationTag(file.getRemotePath(), file.getStoragePath()); - } - public static String createUploadNotificationTag(String remotePath, String localPath){ - return remotePath + localPath; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.kt b/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.kt new file mode 100644 index 0000000..c125d80 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/notifications/NotificationUtils.kt @@ -0,0 +1,32 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 Alper Ozturk + * SPDX-FileCopyrightText: 2023 Jonas Mayer + * SPDX-FileCopyrightText: 2018 Andy Scherzinger + * SPDX-FileCopyrightText: 2017 Tobias Kaminsky + * SPDX-FileCopyrightText: 2015 ownCloud Inc. + * SPDX-FileCopyrightText: 2014 David A. Velasco + * SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only) + */ +package com.owncloud.android.ui.notifications + +import com.owncloud.android.datamodel.OCFile + +object NotificationUtils { + const val NOTIFICATION_CHANNEL_GENERAL: String = "NOTIFICATION_CHANNEL_GENERAL" + const val NOTIFICATION_CHANNEL_DOWNLOAD: String = "NOTIFICATION_CHANNEL_DOWNLOAD" + const val NOTIFICATION_CHANNEL_UPLOAD: String = "NOTIFICATION_CHANNEL_UPLOAD" + const val NOTIFICATION_CHANNEL_MEDIA: String = "NOTIFICATION_CHANNEL_MEDIA" + const val NOTIFICATION_CHANNEL_FILE_SYNC: String = "NOTIFICATION_CHANNEL_FILE_SYNC" + const val NOTIFICATION_CHANNEL_FILE_OBSERVER: String = "NOTIFICATION_CHANNEL_FILE_OBSERVER" + const val NOTIFICATION_CHANNEL_PUSH: String = "NOTIFICATION_CHANNEL_PUSH" + const val NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS: String = "NOTIFICATION_CHANNEL_BACKGROUND_OPERATIONS" + const val NOTIFICATION_CHANNEL_OFFLINE_OPERATIONS: String = "NOTIFICATION_CHANNEL_OFFLINE_OPERATIONS" + + fun createUploadNotificationTag(file: OCFile): String = + createUploadNotificationTag(file.remotePath, file.storagePath) + + @JvmStatic + fun createUploadNotificationTag(remotePath: String?, localPath: String): String = remotePath + localPath +} diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java deleted file mode 100644 index 84920c6..0000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020-2024 Andy Scherzinger - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2016 ownCloud Inc. - * SPDX-FileCopyrightText: 2015 María Asensio Valverde - * SPDX-FileCopyrightText: 2013 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import android.annotation.SuppressLint; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Bundle; -import android.view.MenuItem; -import android.view.View; - -import com.nextcloud.client.account.User; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.editimage.EditImageActivity; -import com.nextcloud.client.jobs.download.FileDownloadHelper; -import com.nextcloud.client.jobs.download.FileDownloadWorker; -import com.nextcloud.client.jobs.upload.FileUploadWorker; -import com.nextcloud.client.preferences.AppPreferences; -import com.nextcloud.model.WorkerState; -import com.nextcloud.model.WorkerStateLiveData; -import com.nextcloud.utils.extensions.IntentExtensionsKt; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.datamodel.FileDataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.VirtualFolderType; -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.operations.SynchronizeFileOperation; -import com.owncloud.android.ui.activity.FileActivity; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.ui.fragment.GalleryFragment; -import com.owncloud.android.ui.fragment.OCFileListFragment; -import com.owncloud.android.utils.MimeTypeUtil; - -import java.io.Serializable; -import java.util.Optional; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.viewpager2.widget.ViewPager2; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; - -/** - * Holds a swiping gallery where image files contained in an Nextcloud directory are shown. - */ -@SuppressWarnings("PMD.AvoidDuplicateLiterals") -public class PreviewImageActivity extends FileActivity implements - FileFragment.ContainerActivity, - OnRemoteOperationListener, - Injectable { - - public static final String TAG = PreviewImageActivity.class.getSimpleName(); - public static final String EXTRA_VIRTUAL_TYPE = "EXTRA_VIRTUAL_TYPE"; - private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER"; - private static final String KEY_SYSTEM_VISIBLE = "TRUE"; - - private OCFile livePhotoFile; - private ViewPager2 viewPager; - private PreviewImagePagerAdapter previewImagePagerAdapter; - private int savedPosition; - private boolean hasSavedPosition; - private boolean requestWaitingForBinder; - private DownloadFinishReceiver downloadFinishReceiver; - private View fullScreenAnchorView; - private boolean isDownloadWorkStarted = false; - - @Inject AppPreferences preferences; - @Inject LocalBroadcastManager localBroadcastManager; - - private ActionBar actionBar; - - public static Intent previewFileIntent(Context context, User user, OCFile file) { - final Intent intent = new Intent(context, PreviewImageActivity.class); - intent.putExtra(FileActivity.EXTRA_FILE, file); - intent.putExtra(FileActivity.EXTRA_USER, user); - return intent; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - actionBar = getSupportActionBar(); - - if (savedInstanceState != null && !savedInstanceState.getBoolean(KEY_SYSTEM_VISIBLE, true) && - actionBar != null) { - actionBar.hide(); - } - - setContentView(R.layout.preview_image_activity); - - livePhotoFile = IntentExtensionsKt.getParcelableArgument(getIntent(), EXTRA_LIVE_PHOTO_FILE, OCFile.class); - - // Navigation Drawer - setupDrawer(); - - // ActionBar - OCFile chosenFile = IntentExtensionsKt.getParcelableArgument(getIntent(), FileActivity.EXTRA_FILE, OCFile.class); - updateActionBarTitleAndHomeButton(chosenFile); - - if (actionBar != null) { - viewThemeUtils.files.setWhiteBackButton(this, actionBar); - actionBar.setDisplayHomeAsUpEnabled(true); - } - - fullScreenAnchorView = getWindow().getDecorView(); - // to keep our UI controls visibility in line with system bars visibility - setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - - if (savedInstanceState != null) { - requestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER); - } else { - requestWaitingForBinder = false; - } - - observeWorkerState(); - } - - public void toggleActionBarVisibility(boolean hide) { - if (actionBar == null) { - return; - } - - if (hide) { - actionBar.hide(); - } else { - actionBar.show(); - } - } - - private void initViewPager(User user) { - // virtual folder - final Serializable virtualFolderType = IntentExtensionsKt.getSerializableArgument(getIntent(), EXTRA_VIRTUAL_TYPE, Serializable.class); - if (virtualFolderType != null && virtualFolderType != VirtualFolderType.NONE) { - VirtualFolderType type = (VirtualFolderType) virtualFolderType; - - previewImagePagerAdapter = new PreviewImagePagerAdapter(this, - type, - user, - getStorageManager()); - } else { - // get parent from path - OCFile parentFolder = getStorageManager().getFileById(getFile().getParentId()); - - if (parentFolder == null) { - // should not be necessary - parentFolder = getStorageManager().getFileByEncryptedRemotePath(OCFile.ROOT_PATH); - } - - previewImagePagerAdapter = new PreviewImagePagerAdapter( - this, - livePhotoFile, - parentFolder, - user, - getStorageManager(), - MainApp.isOnlyOnDevice(), - preferences - ); - } - - viewPager = findViewById(R.id.fragmentPager); - - int position = hasSavedPosition ? savedPosition : previewImagePagerAdapter.getFilePosition(getFile()); - position = Math.max(position, 0); - - viewPager.setAdapter(previewImagePagerAdapter); - viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { - @Override - public void onPageSelected(int position) { - selectPage(position); - } - }); - viewPager.setCurrentItem(position, false); - - if (position == 0 && !getFile().isDown()) { - // this is necessary because mViewPager.setCurrentItem(0) just after setting the - // adapter does not result in a call to #onPageSelected(0) - requestWaitingForBinder = true; - } - } - - @Override - public void onBackPressed() { - sendRefreshSearchEventBroadcast(); - super.onBackPressed(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - sendRefreshSearchEventBroadcast(); - - if (isDrawerOpen()) { - closeDrawer(); - } else { - backToDisplayActivity(); - } - return true; - } else { - return super.onOptionsItemSelected(item); - } - } - - private void sendRefreshSearchEventBroadcast() { - Intent intent = new Intent(GalleryFragment.REFRESH_SEARCH_EVENT_RECEIVER); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } - - @Override - public void onStart() { - super.onStart(); - Optional optionalUser = getUser(); - if (optionalUser.isPresent()) { - OCFile file = getFile(); - /// Validate handled file (first image to preview) - if (file == null) { - throw new IllegalStateException("Instanced with a NULL OCFile"); - } - if (!MimeTypeUtil.isImage(file)) { - throw new IllegalArgumentException("Non-image file passed as argument"); - } - - // Update file according to DB file, if it is possible - if (file.getFileId() > FileDataStorageManager.ROOT_PARENT_ID) { - file = getStorageManager().getFileById(file.getFileId()); - } - - if (file != null) { - /// Refresh the activity according to the Account and OCFile set - setFile(file); // reset after getting it fresh from storageManager - updateActionBarTitle(getFile().getFileName()); - //if (!stateWasRecovered) { - initViewPager(optionalUser.get()); - //} - - } else { - // handled file not in the current Account - finish(); - } - } - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(KEY_WAITING_FOR_BINDER, requestWaitingForBinder); - outState.putBoolean(KEY_SYSTEM_VISIBLE, isSystemUIVisible()); - } - - @Override - public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - super.onRemoteOperationFinish(operation, result); - - if (operation instanceof RemoveFileOperation) { - int deletePosition = viewPager.getCurrentItem(); - int nextPosition = deletePosition > 0 ? deletePosition - 1 : 0; - - if (previewImagePagerAdapter.getItemCount() <= 1) { - finish(); - return; - } - - viewPager.setCurrentItem(nextPosition, true); - previewImagePagerAdapter.delete(deletePosition); - } else if (operation instanceof SynchronizeFileOperation) { - onSynchronizeFileOperationFinish(result); - } - } - - private void onSynchronizeFileOperationFinish(RemoteOperationResult result) { - if (result.isSuccess()) { - supportInvalidateOptionsMenu(); - } - } - - private void observeWorkerState() { - WorkerStateLiveData.Companion.instance().observe(this, state -> { - if (state instanceof WorkerState.Download) { - Log_OC.d(TAG, "Download worker started"); - isDownloadWorkStarted = true; - - if (requestWaitingForBinder) { - requestWaitingForBinder = false; - Log_OC.d(TAG, "Simulating reselection of current page after connection " + - "of download binder"); - selectPage(viewPager.getCurrentItem()); - } - } else { - Log_OC.d(TAG, "Download worker stopped"); - isDownloadWorkStarted = false; - } - }); - } - - @Override - public void onStop() { - super.onStop(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - @Override - protected void onResume() { - super.onResume(); - - downloadFinishReceiver = new DownloadFinishReceiver(); - IntentFilter downloadIntentFilter = new IntentFilter(FileDownloadWorker.Companion.getDownloadFinishMessage()); - localBroadcastManager.registerReceiver(downloadFinishReceiver, downloadIntentFilter); - - UploadFinishReceiver uploadFinishReceiver = new UploadFinishReceiver(); - IntentFilter uploadIntentFilter = new IntentFilter(FileUploadWorker.Companion.getUploadFinishMessage()); - localBroadcastManager.registerReceiver(uploadFinishReceiver, uploadIntentFilter); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - } - - @Override - public void onPause() { - if (downloadFinishReceiver != null){ - localBroadcastManager.unregisterReceiver(downloadFinishReceiver); - downloadFinishReceiver = null; - } - - super.onPause(); - } - - - private void backToDisplayActivity() { - finish(); - } - - @SuppressFBWarnings("DLS") - @Override - public void showDetails(OCFile file) { - final Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class); - showDetailsIntent.setAction(FileDisplayActivity.ACTION_DETAILS); - showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file); - showDetailsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(showDetailsIntent); - finish(); - } - - @Override - public void showDetails(OCFile file, int activeTab) { - showDetails(file); - } - - public void requestForDownload(OCFile file) { - requestForDownload(file, null); - } - - public void requestForDownload(OCFile file, String downloadBehaviour) { - final User user = getUser().orElseThrow(RuntimeException::new); - FileDownloadHelper.Companion.instance().downloadFileIfNotStartedBefore(user, file); - } - - /** - * This method will be invoked when a new page becomes selected. Animation is not necessarily - * complete. - * - * @param position Position index of the new selected page - */ - public void selectPage(int position) { - savedPosition = position; - hasSavedPosition = true; - - OCFile currentFile = previewImagePagerAdapter.getFileAt(position); - - if (!isDownloadWorkStarted) { - requestWaitingForBinder = true; - } else { - if (currentFile != null) { - if (currentFile.isEncrypted() && !currentFile.isDown() && - !previewImagePagerAdapter.pendingErrorAt(position)) { - requestForDownload(currentFile); - } - - // Call to reset image zoom to initial state - // ((PreviewImagePagerAdapter) mViewPager.getAdapter()).resetZoom(); - } - } - - // Update ActionBar title - if (currentFile != null) { - if (getSupportActionBar() != null) { - getSupportActionBar().setTitle(currentFile.getFileName()); - } - setDrawerIndicatorEnabled(false); - } - } - - public void updateActionBarTitle(String title) { - if (getSupportActionBar() != null) { - getSupportActionBar().setTitle(title); - } - } - - /** - * Class waiting for broadcast events from the {@link FileDownloadWorker} service. - *

- * Updates the UI when a download is started or finished, provided that it is relevant for the - * folder displayed in the gallery. - */ - private class DownloadFinishReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - previewNewImage(intent); - } - } - - private class UploadFinishReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - previewNewImage(intent); - } - } - - private void previewNewImage(Intent intent) { - String accountName = intent.getStringExtra(FileDownloadWorker.EXTRA_ACCOUNT_NAME); - String downloadedRemotePath = intent.getStringExtra(FileDownloadWorker.EXTRA_REMOTE_PATH); - String downloadBehaviour = intent.getStringExtra(OCFileListFragment.DOWNLOAD_BEHAVIOUR); - - if (getAccount().name.equals(accountName) && downloadedRemotePath != null) { - OCFile file = getStorageManager().getFileByEncryptedRemotePath(downloadedRemotePath); - boolean downloadWasFine = intent.getBooleanExtra(FileDownloadWorker.EXTRA_DOWNLOAD_RESULT, false); - - if (EditImageActivity.OPEN_IMAGE_EDITOR.equals(downloadBehaviour)) { - startImageEditor(file); - } else { - int position = previewImagePagerAdapter.getFilePosition(file); - if (position >= 0) { - if (downloadWasFine) { - previewImagePagerAdapter.updateFile(position, file); - } else { - previewImagePagerAdapter.updateWithDownloadError(position); - } - previewImagePagerAdapter.notifyItemChanged(position); - } else if (downloadWasFine) { - Optional user = getUser(); - - if (user.isPresent()) { - initViewPager(user.get()); - int newPosition = previewImagePagerAdapter.getFilePosition(file); - if (newPosition >= 0) { - viewPager.setCurrentItem(newPosition); - } - } - } - } - } - } - - public boolean isSystemUIVisible() { - return getSupportActionBar() == null || getSupportActionBar().isShowing(); - } - - public void toggleFullScreen() { - boolean visible = (fullScreenAnchorView.getSystemUiVisibility() - & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; - - if (visible) { - hideSystemUI(fullScreenAnchorView); - } else { - showSystemUI(fullScreenAnchorView); - } - } - - public void startImageEditor(OCFile file) { - if (file.isDown()) { - Intent editImageIntent = new Intent(this, EditImageActivity.class); - editImageIntent.putExtra(EditImageActivity.EXTRA_FILE, file); - startActivity(editImageIntent); - } else { - requestForDownload(file, EditImageActivity.OPEN_IMAGE_EDITOR); - } - } - - @Override - public void onBrowsedDownTo(OCFile folder) { - // TODO Auto-generated method stub - - } - - @Override - public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) { - // TODO Auto-generated method stub - - } - - - @SuppressLint("InlinedApi") - private void hideSystemUI(View anchorView) { - anchorView.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hides NAVIGATION BAR; Android >= 4.0 - | View.SYSTEM_UI_FLAG_FULLSCREEN // hides STATUS BAR; Android >= 4.1 - | View.SYSTEM_UI_FLAG_IMMERSIVE // stays interactive; Android >= 4.4 - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE // draw full window; Android >= 4.1 - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // draw full window; Android >= 4.1 - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // draw full window; Android >= 4.1 - ); - } - - @SuppressLint("InlinedApi") - private void showSystemUI(View anchorView) { - anchorView.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE // draw full window; Android >= 4.1 - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // draw full window; Android >= 4.1 - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // draw full window; Android >= 4. - ); - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index 9cc5c6d..c71c86b 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -169,7 +169,8 @@ class PreviewImageActivity : this, type, user, - storageManager + storageManager, + preferences ) } else { // get parent from path diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageErrorFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageErrorFragment.java deleted file mode 100644 index 8009069..0000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageErrorFragment.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2018 Tobias Kaminsky - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.owncloud.android.R; -import com.owncloud.android.ui.fragment.FileFragment; - -import androidx.annotation.Nullable; - -import static com.owncloud.android.ui.activity.FileActivity.EXTRA_FILE; - -/** - * A fragment showing an error message. - */ -public class PreviewImageErrorFragment extends FileFragment { - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.preview_image_error_fragment, container, false); - } - - public static FileFragment newInstance() { - FileFragment fileFragment = new PreviewImageErrorFragment(); - Bundle bundle = new Bundle(); - - bundle.putParcelable(EXTRA_FILE, null); - fileFragment.setArguments(bundle); - - return fileFragment; - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java deleted file mode 100644 index 10e8eff..0000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ /dev/null @@ -1,834 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020-2024 Andy Scherzinger - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2017-2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-FileCopyrightText: 2013-2015 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import android.app.Activity; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Point; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; -import android.graphics.drawable.PictureDrawable; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Process; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; - -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; -import com.github.chrisbanes.photoview.PhotoView; -import com.google.android.material.snackbar.Snackbar; -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.jobs.BackgroundJobManager; -import com.nextcloud.client.network.ConnectivityService; -import com.nextcloud.ui.fileactions.FileActionsBottomSheet; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.nextcloud.utils.extensions.ExtensionsKt; -import com.owncloud.android.MainApp; -import com.owncloud.android.R; -import com.owncloud.android.databinding.PreviewImageFragmentBinding; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; -import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.BitmapUtils; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.MimeType; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.annotation.Nullable; -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; -import androidx.core.content.ContextCompat; -import androidx.core.content.res.ResourcesCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.fragment.app.FragmentTransaction; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import pl.droidsonroids.gif.GifDrawable; - -import static com.owncloud.android.datamodel.ThumbnailsCacheManager.PREFIX_THUMBNAIL; - -/** - * This fragment shows a preview of a downloaded image. - * Trying to get an instance with a NULL {@link OCFile} will produce an {@link IllegalStateException}. - * If the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on instantiation too. - */ -public class PreviewImageFragment extends FileFragment implements Injectable { - - private static final String EXTRA_FILE = "FILE"; - private static final String EXTRA_ZOOM = "ZOOM"; - - private static final String ARG_FILE = "FILE"; - private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST"; - private static final String ARG_SHOW_RESIZED_IMAGE = "SHOW_RESIZED_IMAGE"; - private static final String MIME_TYPE_PNG = "image/png"; - private static final String MIME_TYPE_GIF = "image/gif"; - private static final String MIME_TYPE_SVG = "image/svg+xml"; - - private Boolean showResizedImage; - private Bitmap bitmap; - - private static final String TAG = PreviewImageFragment.class.getSimpleName(); - - private boolean ignoreFirstSavedState; - private LoadBitmapTask loadBitmapTask; - - @Inject ConnectivityService connectivityService; - @Inject UserAccountManager accountManager; - @Inject BackgroundJobManager backgroundJobManager; - @Inject ViewThemeUtils viewThemeUtils; - - private PreviewImageFragmentBinding binding; - - /** - * Public factory method to create a new fragment that previews an image. - *

- * Android strongly recommends keep the empty constructor of fragments as the only public constructor, and use - * {@link #setArguments(Bundle)} to set the needed arguments. - *

- * This method hides to client objects the need of doing the construction in two steps. - * - * @param imageFile An {@link OCFile} to preview as an image in the fragment - * @param ignoreFirstSavedState Flag to work around an unexpected behaviour of {@link FragmentStateAdapter} ; - * TODO better solution - */ - public static PreviewImageFragment newInstance(@NonNull OCFile imageFile, - boolean ignoreFirstSavedState, - boolean showResizedImage) { - PreviewImageFragment frag = new PreviewImageFragment(); - frag.showResizedImage = showResizedImage; - Bundle args = new Bundle(); - args.putParcelable(ARG_FILE, imageFile); - args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState); - args.putBoolean(ARG_SHOW_RESIZED_IMAGE, showResizedImage); - frag.setArguments(args); - return frag; - } - - /** - * Creates an empty fragment for image previews. - *

- * MUST BE KEPT: the system uses it when tries to re-instantiate a fragment automatically (for instance, when the - * device is turned a aside). - *

- * DO NOT CALL IT: an {@link OCFile} and {@link User} must be provided for a successful construction - */ - public PreviewImageFragment() { - ignoreFirstSavedState = false; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Bundle args = getArguments(); - - if (args == null) { - throw new IllegalArgumentException("Arguments may not be null!"); - } - - setFile(BundleExtensionsKt.getParcelableArgument(args, ARG_FILE, OCFile.class)); - // TODO better in super, but needs to check ALL the class extending FileFragment; - // not right now - - ignoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST); - showResizedImage = args.getBoolean(ARG_SHOW_RESIZED_IMAGE); - setHasOptionsMenu(true); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - - binding = PreviewImageFragmentBinding.inflate(inflater, container, false); - View view = binding.getRoot(); - - binding.image.setVisibility(View.GONE); - - view.setOnClickListener(v -> togglePreviewImageFullScreen()); - - binding.image.setOnClickListener(v -> togglePreviewImageFullScreen()); - checkLivePhotoAvailability(); - setMultiListLoadingMessage(); - - return view; - } - - private void checkLivePhotoAvailability() { - OCFile livePhotoVideo = getFile().livePhotoVideo; - - if (livePhotoVideo == null) return; - - binding.livePhotoIndicator.setVisibility(View.VISIBLE); - ExtensionsKt.clickWithDebounce(binding.livePhotoIndicator, 4000L, () -> { - playLivePhoto(livePhotoVideo); - return null; - }); - } - - private void hideActionBar() { - PreviewImageActivity activity = (PreviewImageActivity) requireActivity(); - activity.toggleActionBarVisibility(true); - } - - private void playLivePhoto(OCFile file) { - if (file == null) { - return; - } - - hideActionBar(); - - Fragment mediaFragment = PreviewMediaFragment.newInstance(file, accountManager.getUser(), 0, true, true); - FragmentManager fragmentManager = requireActivity().getSupportFragmentManager(); - FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - fragmentTransaction.replace(R.id.top, mediaFragment); - fragmentTransaction.addToBackStack(null); - fragmentTransaction.commit(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - if (savedInstanceState != null) { - if (!ignoreFirstSavedState) { - OCFile file = BundleExtensionsKt.getParcelableArgument(savedInstanceState, EXTRA_FILE, OCFile.class); - if (file == null) { - return; - } - - setFile(file); - - try { - binding.image.setScale(Math.min(binding.image.getMaximumScale(), savedInstanceState.getFloat(EXTRA_ZOOM))); - } catch (IllegalArgumentException e) { - Log_OC.d(TAG, "Error caught at setScale: " + e); - } - } else { - ignoreFirstSavedState = false; - } - } - } - - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putFloat(EXTRA_ZOOM, binding.image.getScale()); - outState.putParcelable(EXTRA_FILE, getFile()); - } - - @Override - public void onStart() { - super.onStart(); - if (getFile() != null) { - binding.image.setTag(getFile().getFileId()); - - Point screenSize = DisplayUtils.getScreenSize(getActivity()); - int width = screenSize.x; - int height = screenSize.y; - - // show thumbnail while loading image - binding.image.setVisibility(View.GONE); - binding.emptyListProgress.setVisibility(View.VISIBLE); - - Bitmap thumbnail = getThumbnailBitmap(getFile()); - if (thumbnail != null) { - binding.shimmer.setVisibility(View.VISIBLE); - binding.shimmerThumbnail.setImageBitmap(thumbnail); - binding.image.setVisibility(View.GONE); - bitmap = thumbnail; - } else { - thumbnail = ThumbnailsCacheManager.mDefaultImg; - } - - if (showResizedImage) { - Bitmap resizedImage = getResizedBitmap(getFile(), width, height); - - if (resizedImage != null && !getFile().isUpdateThumbnailNeeded()) { - binding.image.setImageBitmap(resizedImage); - binding.image.setVisibility(View.VISIBLE); - binding.emptyListView.setVisibility(View.GONE); - binding.emptyListProgress.setVisibility(View.GONE); - binding.image.setBackgroundColor(getResources().getColor(R.color.background_color_inverse)); - - bitmap = resizedImage; - } else { - // generate new resized image - if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(getFile(), binding.image) && - containerActivity.getStorageManager() != null) { - final ThumbnailsCacheManager.ResizedImageGenerationTask task = - new ThumbnailsCacheManager.ResizedImageGenerationTask(this, - binding.image, - binding.emptyListProgress, - containerActivity.getStorageManager(), - connectivityService, - containerActivity.getStorageManager().getUser(), - getResources().getColor(R.color.background_color_inverse) - ); - if (resizedImage == null) { - resizedImage = thumbnail; - } - final ThumbnailsCacheManager.AsyncResizedImageDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncResizedImageDrawable( - MainApp.getAppContext().getResources(), - resizedImage, - task - ); - binding.image.setImageDrawable(asyncDrawable); - task.execute(getFile()); - } - } - } else { - loadBitmapTask = new LoadBitmapTask(binding.image, binding.emptyListView, binding.emptyListProgress); - binding.image.setVisibility(View.GONE); - binding.emptyListView.setVisibility(View.GONE); - binding.emptyListProgress.setVisibility(View.VISIBLE); - loadBitmapTask.execute(getFile()); - } - } else { - showErrorMessage(R.string.preview_image_error_no_local_file); - } - } - - private @Nullable - Bitmap getResizedBitmap(OCFile file, int width, int height) { - Bitmap cachedImage = null; - int scaledWidth = width; - int scaledHeight = height; - - for (int i = 0; i < 3 && cachedImage == null; i++) { - try { - cachedImage = ThumbnailsCacheManager.getScaledBitmapFromDiskCache( - ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.getRemoteId(), - scaledWidth, - scaledHeight); - } catch (OutOfMemoryError e) { - scaledWidth = scaledWidth / 2; - scaledHeight = scaledHeight / 2; - } - } - - return cachedImage; - } - - private @Nullable - Bitmap getThumbnailBitmap(OCFile file) { - return ThumbnailsCacheManager.getBitmapFromDiskCache(PREFIX_THUMBNAIL + file.getRemoteId()); - } - - @Override - public void onStop() { - Log_OC.d(TAG, "onStop starts"); - if (loadBitmapTask != null) { - loadBitmapTask.cancel(true); - loadBitmapTask = null; - } - super.onStop(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.custom_menu_placeholder, menu); - final MenuItem item = menu.findItem(R.id.custom_menu_placeholder_item); - item.setIcon(viewThemeUtils.platform.colorDrawable(item.getIcon(), ContextCompat.getColor(requireContext(), R.color.white))); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.custom_menu_placeholder_item) { - final OCFile file = getFile(); - if (containerActivity.getStorageManager() != null && file != null) { - // Update the file - final OCFile updatedFile = containerActivity.getStorageManager().getFileById(file.getFileId()); - setFile(updatedFile); - - final OCFile fileNew = getFile(); - if (fileNew != null) { - showFileActions(file); - } - } - return true; - } - return super.onOptionsItemSelected(item); - } - - private void showFileActions(OCFile file) { - final List additionalFilter = new ArrayList<>( - Arrays.asList( - R.id.action_rename_file, - R.id.action_sync_file, - R.id.action_move_or_copy, - R.id.action_favorite, - R.id.action_unset_favorite, - R.id.action_pin_to_homescreen - )); - if (getFile() != null && getFile().isSharedWithMe() && !getFile().canReshare()) { - additionalFilter.add(R.id.action_send_share_file); - } - final FragmentManager fragmentManager = getChildFragmentManager(); - FileActionsBottomSheet.newInstance(file, false, additionalFilter) - .setResultListener(fragmentManager, this, this::onFileActionChosen) - .show(fragmentManager, "actions"); - } - - /** - * {@inheritDoc} - */ - public void onFileActionChosen(final int itemId) { - if (itemId == R.id.action_send_share_file) { - if (getFile().isSharedWithMe() && !getFile().canReshare()) { - Snackbar.make(requireView(), R.string.resharing_is_not_allowed, Snackbar.LENGTH_LONG).show(); - } else { - containerActivity.getFileOperationsHelper().sendShareFile(getFile()); - } - } else if (itemId == R.id.action_open_file_with) { - openFile(); - } else if (itemId == R.id.action_remove_file) { - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(getFile()); - dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - } else if (itemId == R.id.action_see_details) { - seeDetails(); - } else if (itemId == R.id.action_download_file || itemId == R.id.action_sync_file) { - containerActivity.getFileOperationsHelper().syncFile(getFile()); - }else if(itemId == R.id.action_cancel_sync){ - containerActivity.getFileOperationsHelper().cancelTransference(getFile()); - } else if (itemId == R.id.action_set_as_wallpaper) { - containerActivity.getFileOperationsHelper().setPictureAs(getFile(), getImageView()); - } else if (itemId == R.id.action_export_file) { - ArrayList list = new ArrayList<>(); - list.add(getFile()); - containerActivity.getFileOperationsHelper().exportFiles(list, - getContext(), - getView(), - backgroundJobManager); - } else if (itemId == R.id.action_edit) { - ((PreviewImageActivity) requireActivity()).startImageEditor(getFile()); - } - } - - private void seeDetails() { - containerActivity.showDetails(getFile()); - } - - @SuppressFBWarnings("Dm") - @Override - public void onDestroy() { - if (bitmap != null) { - bitmap.recycle(); - // putting this in onStop() is just the same; the fragment is always destroyed by - // {@link FragmentStatePagerAdapter} when the fragment in swiped further than the - // valid offscreen distance, and onStop() is never called before than that - } - super.onDestroy(); - } - - /** - * Opens the previewed image with an external application. - */ - private void openFile() { - containerActivity.getFileOperationsHelper().openFile(getFile()); - finish(); - } - - private class LoadBitmapTask extends AsyncTask { - private static final int PARAMS_LENGTH = 1; - - /** - * Weak reference to the target {@link ImageView} where the bitmap will be loaded into. - *

- * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load - * finishes. - */ - private final WeakReference imageViewRef; - private final WeakReference infoViewRef; - private final WeakReference progressViewRef; - - /** - * Error message to show when a load fails. - */ - private int mErrorMessageId; - - /** - * Constructor. - * - * @param imageView Target {@link ImageView} where the bitmap will be loaded into. - */ - LoadBitmapTask(PhotoView imageView, LinearLayout infoView, FrameLayout progressView) { - imageViewRef = new WeakReference<>(imageView); - infoViewRef = new WeakReference<>(infoView); - progressViewRef = new WeakReference<>(progressView); - } - - @Override - protected LoadImage doInBackground(OCFile... params) { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE); - - if (params.length != PARAMS_LENGTH) { - return null; - } - - Bitmap bitmapResult = null; - Drawable drawableResult = null; - OCFile ocFile = params[0]; - String storagePath = ocFile.getStoragePath(); - try { - int maxDownScale = 3; // could be a parameter passed to doInBackground(...) - Point screenSize = DisplayUtils.getScreenSize(getActivity()); - int minWidth = screenSize.x; - int minHeight = screenSize.y; - for (int i = 0; i < maxDownScale && bitmapResult == null && drawableResult == null; i++) { - - if (MIME_TYPE_SVG.equalsIgnoreCase(ocFile.getMimeType())) { - if (isCancelled()) { - return null; - } - - try { - SVG svg = SVG.getFromInputStream(new FileInputStream(storagePath)); - drawableResult = new PictureDrawable(svg.renderToPicture()); - - if (isCancelled()) { - return new LoadImage(null, drawableResult, ocFile); - } - } catch (FileNotFoundException e) { - mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "File not found trying to load " + getFile().getStoragePath(), e); - } catch (SVGParseException e) { - mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "Couldn't parse SVG " + getFile().getStoragePath(), e); - } - } else { - if (isCancelled()) { - return null; - } - - try { - bitmapResult = BitmapUtils.decodeSampledBitmapFromFile(storagePath, minWidth, - minHeight); - - if (isCancelled()) { - return new LoadImage(bitmapResult, null, ocFile); - } - - if (bitmapResult == null) { - mErrorMessageId = R.string.preview_image_error_unknown_format; - Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); - break; - } else { - if (MimeType.JPEG.equalsIgnoreCase(ocFile.getMimeType())) { - // Rotate image, obeying exif tag. - bitmapResult = BitmapUtils.rotateImage(bitmapResult, storagePath); - } - } - - } catch (OutOfMemoryError e) { - mErrorMessageId = R.string.common_error_out_memory; - if (i < maxDownScale - 1) { - Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; scaling down"); - minWidth = minWidth / 2; - minHeight = minHeight / 2; - - } else { - Log_OC.w(TAG, "Out of memory rendering file " + storagePath + " ; failing"); - } - if (bitmapResult != null) { - bitmapResult.recycle(); - } - bitmapResult = null; - } - } - } - - } catch (NoSuchFieldError e) { - mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "Error from access to non-existing field despite protection; file " - + storagePath, e); - - } catch (Throwable t) { - mErrorMessageId = R.string.common_error_unknown; - Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t); - - } - - return new LoadImage(bitmapResult, drawableResult, ocFile); - } - - @Override - protected void onCancelled(LoadImage result) { - if (result != null && result.bitmap != null) { - result.bitmap.recycle(); - } - } - - @Override - protected void onPostExecute(LoadImage result) { - if (result.bitmap != null || result.drawable != null) { - showLoadedImage(result); - } else { - showErrorMessage(mErrorMessageId); - } - if (result.bitmap != null && bitmap != result.bitmap) { - // unused bitmap, release it! (just in case) - result.bitmap.recycle(); - } - } - - private void showLoadedImage(LoadImage result) { - final PhotoView imageView = imageViewRef.get(); - Bitmap bitmap = result.bitmap; - Drawable drawable = result.drawable; - - if (imageView != null) { - if (bitmap != null) { - Log_OC.d(TAG, "Showing image with resolution " + bitmap.getWidth() + "x" + - bitmap.getHeight()); - - if (MIME_TYPE_PNG.equalsIgnoreCase(result.ocFile.getMimeType()) || - MIME_TYPE_GIF.equalsIgnoreCase(result.ocFile.getMimeType())) { - getResources(); - imageView.setImageDrawable(generateCheckerboardLayeredDrawable(result, bitmap)); - } else { - imageView.setImageBitmap(bitmap); - } - - PreviewImageFragment.this.bitmap = bitmap; // needs to be kept for recycling when not useful - } else { - if (drawable != null - && MIME_TYPE_SVG.equalsIgnoreCase(result.ocFile.getMimeType())) { - getResources(); - imageView.setImageDrawable(generateCheckerboardLayeredDrawable(result, null)); - } - } - final LinearLayout infoView = infoViewRef.get(); - if (infoView != null) { - infoView.setVisibility(View.GONE); - } - - final FrameLayout progressView = progressViewRef.get(); - if (progressView != null) { - progressView.setVisibility(View.GONE); - } - imageView.setBackgroundColor(getResources().getColor(R.color.background_color_inverse)); - imageView.setVisibility(View.VISIBLE); - } - } - } - - private LayerDrawable generateCheckerboardLayeredDrawable(LoadImage result, Bitmap bitmap) { - Resources resources = getResources(); - Drawable[] layers = new Drawable[2]; - layers[0] = ResourcesCompat.getDrawable(resources, R.color.bg_default, null); - Drawable bitmapDrawable; - - if (MIME_TYPE_PNG.equalsIgnoreCase(result.ocFile.getMimeType())) { - bitmapDrawable = new BitmapDrawable(resources, bitmap); - } else if (MIME_TYPE_SVG.equalsIgnoreCase(result.ocFile.getMimeType())) { - bitmapDrawable = result.drawable; - } else if (MIME_TYPE_GIF.equalsIgnoreCase(result.ocFile.getMimeType())) { - try { - bitmapDrawable = new GifDrawable(result.ocFile.getStoragePath()); - } catch (IOException exception) { - bitmapDrawable = result.drawable; - } - } else { - bitmapDrawable = new BitmapDrawable(resources, bitmap); - } - - layers[1] = bitmapDrawable; - LayerDrawable layerDrawable = new LayerDrawable(layers); - - Activity activity = getActivity(); - if (activity != null) { - int bitmapWidth; - int bitmapHeight; - - if (MIME_TYPE_PNG.equalsIgnoreCase(result.ocFile.getMimeType())) { - bitmapWidth = convertDpToPixel(bitmap.getWidth(), getActivity()); - bitmapHeight = convertDpToPixel(bitmap.getHeight(), getActivity()); - } else { - bitmapWidth = convertDpToPixel(bitmapDrawable.getIntrinsicWidth(), getActivity()); - bitmapHeight = convertDpToPixel(bitmapDrawable.getIntrinsicHeight(), getActivity()); - } - layerDrawable.setLayerSize(0, bitmapWidth, bitmapHeight); - layerDrawable.setLayerSize(1, bitmapWidth, bitmapHeight); - } - - return layerDrawable; - } - - private void showErrorMessage(@StringRes int errorMessageId) { - setSorryMessageForMultiList(errorMessageId); - } - - private void setMultiListLoadingMessage() { - binding.image.setVisibility(View.GONE); - binding.emptyListView.setVisibility(View.GONE); - binding.emptyListProgress.setVisibility(View.VISIBLE); - } - - private void setSorryMessageForMultiList(@StringRes int message) { - binding.emptyListViewHeadline.setText(R.string.preview_sorry); - binding.emptyListViewText.setText(message); - binding.emptyListIcon.setImageResource(R.drawable.file_image); - - binding.emptyListView.setBackgroundColor(getResources().getColor(R.color.bg_default)); - binding.emptyListViewHeadline.setTextColor(getResources().getColor(R.color.standard_grey)); - binding.emptyListViewText.setTextColor(getResources().getColor(R.color.standard_grey)); - - binding.image.setVisibility(View.GONE); - binding.emptyListView.setVisibility(View.VISIBLE); - binding.emptyListProgress.setVisibility(View.GONE); - } - - public void setErrorPreviewMessage() { - try { - if (getActivity() != null) { - Snackbar.make(binding.emptyListView, - R.string.resized_image_not_possible_download, - Snackbar.LENGTH_INDEFINITE) - .setAction(R.string.common_yes, v -> { - PreviewImageActivity activity = (PreviewImageActivity) getActivity(); - if (activity != null) { - activity.requestForDownload(getFile()); - } else if (getContext() != null) { - Snackbar.make(binding.emptyListView, - getResources().getString(R.string.could_not_download_image), - Snackbar.LENGTH_INDEFINITE).show(); - } - } - ).show(); - } - } catch (IllegalArgumentException e) { - Log_OC.d(TAG, e.getMessage()); - } - } - - public void setNoConnectionErrorMessage() { - try { - Snackbar.make(binding.emptyListView, R.string.auth_no_net_conn_title, Snackbar.LENGTH_LONG).show(); - } catch (IllegalArgumentException e) { - Log_OC.d(TAG, e.getMessage()); - } - } - - /** - * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewImageFragment} to be previewed. - * - * @param file File to test if can be previewed. - * @return 'True' if the file can be handled by the fragment. - */ - public static boolean canBePreviewed(OCFile file) { - return file != null && MimeTypeUtil.isImage(file); - } - - /** - * Finishes the preview - */ - private void finish() { - Activity container = getActivity(); - if (container != null) { - container.finish(); - } - } - - private void togglePreviewImageFullScreen() { - Activity activity = getActivity(); - - if (activity != null) { - ((PreviewImageActivity) activity).toggleFullScreen(); - } - toggleImageBackground(); - } - - private void toggleImageBackground() { - if (getFile() != null && (MIME_TYPE_PNG.equalsIgnoreCase(getFile().getMimeType()) || - MIME_TYPE_SVG.equalsIgnoreCase(getFile().getMimeType())) && getActivity() != null && - getActivity() instanceof PreviewImageActivity) { - PreviewImageActivity previewImageActivity = (PreviewImageActivity) getActivity(); - - if (binding.image.getDrawable() instanceof LayerDrawable) { - LayerDrawable layerDrawable = (LayerDrawable) binding.image.getDrawable(); - Drawable layerOne; - - if (previewImageActivity.isSystemUIVisible()) { - layerOne = ResourcesCompat.getDrawable(getResources(), R.color.bg_default, null); - } else { - layerOne = ResourcesCompat.getDrawable(getResources(), R.drawable.backrepeat, null); - } - - layerDrawable.setDrawableByLayerId(layerDrawable.getId(0), layerOne); - - binding.image.setImageDrawable(layerDrawable); - binding.image.invalidate(); - } - } - } - - private static int convertDpToPixel(float dp, Context context) { - Resources resources = context.getResources(); - DisplayMetrics metrics = resources.getDisplayMetrics(); - return (int) (dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); - } - - public PhotoView getImageView() { - return binding.image; - } - - private class LoadImage { - private final Bitmap bitmap; - private final Drawable drawable; - private final OCFile ocFile; - - LoadImage(Bitmap bitmap, Drawable drawable, OCFile ocFile) { - this.bitmap = bitmap; - this.drawable = drawable; - this.ocFile = ocFile; - } - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt index 2131296..430e330 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.kt @@ -20,6 +20,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.VirtualFolderType import com.owncloud.android.ui.fragment.FileFragment +import com.owncloud.android.utils.FileSortOrder import com.owncloud.android.utils.FileStorageUtils /** @@ -82,7 +83,8 @@ class PreviewImagePagerAdapter : FragmentStateAdapter { fragmentActivity: FragmentActivity, type: VirtualFolderType?, user: User, - storageManager: FileDataStorageManager + storageManager: FileDataStorageManager, + preferences: AppPreferences ) : super(fragmentActivity) { requireNotNull(type) { "NULL parent folder" } require(type != VirtualFolderType.NONE) { "NONE virtual folder type" } @@ -97,6 +99,11 @@ class PreviewImagePagerAdapter : FragmentStateAdapter { imageFiles = mStorageManager.getVirtualFolderContent(type, true) } + if (type == VirtualFolderType.FAVORITE) { + val sortOrder = preferences.getSortOrderByType(FileSortOrder.Type.favoritesListView) + imageFiles = sortOrder.sortCloudFiles(imageFiles.toMutableList()).toMutableList() + } + mObsoleteFragments = HashSet() mObsoletePositions = HashSet() mDownloadErrors = HashSet() diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java deleted file mode 100644 index 39f2b09..0000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ /dev/null @@ -1,695 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 TSI-mc - * SPDX-FileCopyrightText: 2023 Parneet Singh - * SPDX-FileCopyrightText: 2020 Andy Scherzinger - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2016 ownCloud Inc. - * SPDX-FileCopyrightText: 2013 David A. Velasco - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; -import android.media.MediaMetadataRetriever; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; -import android.view.ViewGroup; - -import com.nextcloud.client.account.User; -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.di.Injectable; -import com.nextcloud.client.jobs.BackgroundJobManager; -import com.nextcloud.client.jobs.download.FileDownloadHelper; -import com.nextcloud.client.media.ExoplayerListener; -import com.nextcloud.client.media.NextcloudExoPlayer; -import com.nextcloud.client.media.PlayerServiceConnection; -import com.nextcloud.client.network.ClientFactory; -import com.nextcloud.common.NextcloudClient; -import com.nextcloud.ui.fileactions.FileActionsBottomSheet; -import com.nextcloud.utils.extensions.BundleExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.databinding.FragmentPreviewMediaBinding; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.datamodel.ThumbnailsCacheManager; -import com.owncloud.android.files.StreamMediaFileOperation; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.activity.DrawerActivity; -import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; -import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.MimeTypeUtil; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.Executors; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.OptIn; -import androidx.annotation.StringRes; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.fragment.app.FragmentActivity; -import androidx.fragment.app.FragmentManager; -import androidx.media3.common.MediaItem; -import androidx.media3.common.util.UnstableApi; -import androidx.media3.exoplayer.ExoPlayer; - -/** - * This fragment shows a preview of a downloaded media file (audio or video). - *

- * Trying to get an instance with NULL {@link OCFile} or ownCloud {@link User} values will produce an - * {@link IllegalStateException}. - *

- * By now, if the {@link OCFile} passed is not downloaded, an {@link IllegalStateException} is generated on - * instantiation too. - */ -public class PreviewMediaFragment extends FileFragment implements OnTouchListener, - Injectable { - - private static final String TAG = PreviewMediaFragment.class.getSimpleName(); - - public static final String EXTRA_FILE = "FILE"; - public static final String EXTRA_USER = "USER"; - public static final String EXTRA_AUTOPLAY = "AUTOPLAY"; - public static final String EXTRA_START_POSITION = "START_POSITION"; - - private static final String EXTRA_PLAY_POSITION = "PLAY_POSITION"; - private static final String EXTRA_PLAYING = "PLAYING"; - private static final double MIN_DENSITY_RATIO = 24.0; - - - private static final String FILE = "FILE"; - private static final String USER = "USER"; - private static final String PLAYBACK_POSITION = "PLAYBACK_POSITION"; - private static final String AUTOPLAY = "AUTOPLAY"; - private static final String IS_LIVE_PHOTO = "IS_LIVE_PHOTO"; - - private User user; - private long savedPlaybackPosition; - - private boolean autoplay; - private boolean isLivePhoto; - private boolean prepared; - private PlayerServiceConnection mediaPlayerServiceConnection; - - private Uri videoUri; - @Inject ClientFactory clientFactory; - @Inject UserAccountManager accountManager; - @Inject BackgroundJobManager backgroundJobManager; - FragmentPreviewMediaBinding binding; - private ViewGroup emptyListView; - private ExoPlayer exoPlayer; - private NextcloudClient nextcloudClient; - - /** - * Creates a fragment to preview a file. - *

- * When 'fileToDetail' or 'user' are null - * - * @param fileToDetail An {@link OCFile} to preview in the fragment - * @param user Currently active user - */ - public static PreviewMediaFragment newInstance(OCFile fileToDetail, - User user, - long startPlaybackPosition, - boolean autoplay, - boolean isLivePhoto) { - PreviewMediaFragment previewMediaFragment = new PreviewMediaFragment(); - - Bundle bundle = new Bundle(); - bundle.putParcelable(FILE, fileToDetail); - bundle.putParcelable(USER, user); - bundle.putLong(PLAYBACK_POSITION, startPlaybackPosition); - bundle.putBoolean(AUTOPLAY, autoplay); - bundle.putBoolean(IS_LIVE_PHOTO, isLivePhoto); - - previewMediaFragment.setArguments(bundle); - - return previewMediaFragment; - } - - /** - * Creates an empty fragment for previews. - *

- * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically (for instance, when the - * device is turned a aside). - *

- * DO NOT CALL IT: an {@link OCFile} and {@link User} must be provided for a successful construction - */ - public PreviewMediaFragment() { - super(); - - savedPlaybackPosition = 0; - autoplay = true; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - - Bundle bundle = getArguments(); - - setFile(BundleExtensionsKt.getParcelableArgument(bundle, FILE, OCFile.class)); - user = BundleExtensionsKt.getParcelableArgument(bundle, USER, User.class); - - savedPlaybackPosition = bundle.getLong(PLAYBACK_POSITION); - autoplay = bundle.getBoolean(AUTOPLAY); - isLivePhoto = bundle.getBoolean(IS_LIVE_PHOTO); - - mediaPlayerServiceConnection = new PlayerServiceConnection(requireContext()); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - Log_OC.v(TAG, "onCreateView"); - - binding = FragmentPreviewMediaBinding.inflate(inflater, container, false); - View view = binding.getRoot(); - - emptyListView = binding.emptyView.emptyListView; - - setLoadingView(); - return view; - } - - private void setLoadingView() { - binding.progress.setVisibility(View.VISIBLE); - binding.emptyView.emptyListView.setVisibility(View.GONE); - } - - private void setVideoErrorMessage(String headline, @StringRes int message) { - binding.emptyView.emptyListViewHeadline.setText(headline); - binding.emptyView.emptyListViewText.setText(message); - binding.emptyView.emptyListIcon.setImageResource(R.drawable.file_movie); - binding.emptyView.emptyListViewText.setVisibility(View.VISIBLE); - binding.emptyView.emptyListIcon.setVisibility(View.VISIBLE); - binding.progress.setVisibility(View.GONE); - binding.emptyView.emptyListView.setVisibility(View.VISIBLE); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - Log_OC.v(TAG, "onActivityCreated"); - - OCFile file = getFile(); - if (savedInstanceState == null) { - if (file == null) { - throw new IllegalStateException("Instanced with a NULL OCFile"); - } - if (user == null) { - throw new IllegalStateException("Instanced with a NULL ownCloud Account"); - } - } else { - file = BundleExtensionsKt.getParcelableArgument(savedInstanceState, EXTRA_FILE, OCFile.class); - setFile(file); - user = BundleExtensionsKt.getParcelableArgument(savedInstanceState, EXTRA_USER, User.class); - savedPlaybackPosition = savedInstanceState.getInt(EXTRA_PLAY_POSITION); - autoplay = savedInstanceState.getBoolean(EXTRA_PLAYING); - } - - if (file != null) { - if (MimeTypeUtil.isVideo(file)) { - binding.exoplayerView.setVisibility(View.VISIBLE); - binding.imagePreview.setVisibility(View.GONE); - } else { - binding.exoplayerView.setVisibility(View.GONE); - binding.imagePreview.setVisibility(View.VISIBLE); - extractAndSetCoverArt(file); - } - } - toggleDrawerLockMode(containerActivity, DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - } - - /** - * tries to read the cover art from the audio file and sets it as cover art. - * - * @param file audio file with potential cover art - */ - private void extractAndSetCoverArt(OCFile file) { - if (MimeTypeUtil.isAudio(file)) { - if (file.getStoragePath() == null) { - setThumbnailForAudio(file); - } else { - try { - MediaMetadataRetriever mmr = new MediaMetadataRetriever(); - mmr.setDataSource(file.getStoragePath()); - byte[] data = mmr.getEmbeddedPicture(); - if (data != null) { - Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); - binding.imagePreview.setImageBitmap(bitmap); //associated cover art in bitmap - } else { - setThumbnailForAudio(file); - } - } catch (Throwable t) { - setGenericThumbnail(); - } - } - } - } - - private void setThumbnailForAudio(OCFile file) { - Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( - ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); - - if (thumbnail != null) { - binding.imagePreview.setImageBitmap(thumbnail); - } else { - setGenericThumbnail(); - } - } - - /** - * Set generic icon (logo) as placeholder for thumbnail in preview. - */ - private void setGenericThumbnail() { - Drawable logo = AppCompatResources.getDrawable(requireContext(), R.drawable.logo); - if (logo != null) { - if (!getResources().getBoolean(R.bool.is_branded_client)) { - // only colour logo of non-branded client - DrawableCompat.setTint(logo, getResources().getColor(R.color.primary, requireContext().getTheme())); - } - binding.imagePreview.setImageDrawable(logo); - } - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - Log_OC.v(TAG, "onSaveInstanceState"); - toggleDrawerLockMode(containerActivity, DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - outState.putParcelable(EXTRA_FILE, getFile()); - outState.putParcelable(EXTRA_USER, user); - - if (MimeTypeUtil.isVideo(getFile()) && exoPlayer != null) { - savedPlaybackPosition = exoPlayer.getCurrentPosition(); - autoplay = exoPlayer.isPlaying(); - outState.putLong(EXTRA_PLAY_POSITION, savedPlaybackPosition); - outState.putBoolean(EXTRA_PLAYING, autoplay); - } else if (mediaPlayerServiceConnection != null && mediaPlayerServiceConnection.isConnected()) { - outState.putInt(EXTRA_PLAY_POSITION, mediaPlayerServiceConnection.getCurrentPosition()); - outState.putBoolean(EXTRA_PLAYING, mediaPlayerServiceConnection.isPlaying()); - } - } - - @Override - public void onStart() { - super.onStart(); - Log_OC.v(TAG, "onStart"); - OCFile file = getFile(); - if (file != null) { - // bind to any existing player - mediaPlayerServiceConnection.bind(); - - if (MimeTypeUtil.isAudio(file)) { - binding.mediaController.setMediaPlayer(mediaPlayerServiceConnection); - binding.mediaController.setVisibility(View.VISIBLE); - mediaPlayerServiceConnection.start(user, file, autoplay, savedPlaybackPosition); - binding.emptyView.emptyListView.setVisibility(View.GONE); - binding.progress.setVisibility(View.GONE); - } else if (MimeTypeUtil.isVideo(file)) { - if (mediaPlayerServiceConnection.isConnected()) { - // always stop player - stopAudio(); - } - if (exoPlayer != null) { - playVideo(); - } else { - final Handler handler = new Handler(Looper.getMainLooper()); - Executors.newSingleThreadExecutor().execute(() -> { - try { - nextcloudClient = clientFactory.createNextcloudClient(accountManager.getUser()); - handler.post(() -> { - exoPlayer = NextcloudExoPlayer.createNextcloudExoplayer(requireContext(), nextcloudClient); - - exoPlayer.addListener(new ExoplayerListener(requireContext(), binding.exoplayerView, exoPlayer, () -> { - goBackToLivePhoto(); - return null; - })); - - playVideo(); - }); - } catch (ClientFactory.CreationException e) { - handler.post(() -> Log_OC.e(TAG, "error setting up ExoPlayer", e)); - } - }); - } - } - } - } - - private void goBackToLivePhoto() { - if (!isLivePhoto) { - return; - } - - showActionBar(); - - requireActivity().getSupportFragmentManager().popBackStack(); - } - - private void showActionBar() { - Activity currentActivity = requireActivity(); - if (currentActivity instanceof PreviewImageActivity activity) { - activity.toggleActionBarVisibility(false); - } - } - @OptIn(markerClass = UnstableApi.class) - private void setupVideoView() { - binding.exoplayerView.setShowNextButton(false); - binding.exoplayerView.setShowPreviousButton(false); - binding.exoplayerView.setPlayer(exoPlayer); - binding.exoplayerView.setFullscreenButtonClickListener(isFullScreen -> startFullScreenVideo()); - } - - private void stopAudio() { - mediaPlayerServiceConnection.stop(); - } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - menu.removeItem(R.id.action_search); - inflater.inflate(R.menu.custom_menu_placeholder, menu); - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == R.id.custom_menu_placeholder_item) { - final OCFile file = getFile(); - if (containerActivity.getStorageManager() != null && file != null) { - // Update the file - final OCFile updatedFile = containerActivity.getStorageManager().getFileById(file.getFileId()); - setFile(updatedFile); - - final OCFile fileNew = getFile(); - if (fileNew != null) { - showFileActions(fileNew); - } - } - } - return super.onOptionsItemSelected(item); - } - - private void showFileActions(OCFile file) { - final List additionalFilter = new ArrayList<>( - Arrays.asList( - R.id.action_rename_file, - R.id.action_sync_file, - R.id.action_move_or_copy, - R.id.action_favorite, - R.id.action_unset_favorite, - R.id.action_pin_to_homescreen - )); - if (getFile() != null && getFile().isSharedWithMe() && !getFile().canReshare()) { - additionalFilter.add(R.id.action_send_share_file); - } - final FragmentManager fragmentManager = getChildFragmentManager(); - FileActionsBottomSheet.newInstance(file, false, additionalFilter) - .setResultListener(fragmentManager, this, this::onFileActionChosen) - .show(fragmentManager, "actions"); - } - - public void onFileActionChosen(final int itemId) { - if (itemId == R.id.action_send_share_file) { - sendShareFile(); - } else if (itemId == R.id.action_open_file_with) { - openFile(); - } else if (itemId == R.id.action_remove_file) { - RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(getFile()); - dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); - } else if (itemId == R.id.action_see_details) { - seeDetails(); - } else if (itemId == R.id.action_sync_file) { - containerActivity.getFileOperationsHelper().syncFile(getFile()); - } else if (itemId == R.id.action_cancel_sync) { - containerActivity.getFileOperationsHelper().cancelTransference(getFile()); - } else if (itemId == R.id.action_stream_media) { - containerActivity.getFileOperationsHelper().streamMediaFile(getFile()); - } else if (itemId == R.id.action_export_file) { - ArrayList list = new ArrayList<>(); - list.add(getFile()); - containerActivity.getFileOperationsHelper().exportFiles(list, - getContext(), - getView(), - backgroundJobManager); - } else if (itemId == R.id.action_download_file) { - FileDownloadHelper.Companion.instance().downloadFileIfNotStartedBefore(user, getFile()); - } - } - - /** - * Update the file of the fragment with file value - * - * @param file Replaces the held file with a new one - */ - public void updateFile(OCFile file) { - setFile(file); - } - - private void seeDetails() { - stopPreview(false); - containerActivity.showDetails(getFile()); - } - - private void sendShareFile() { - stopPreview(false); - containerActivity.getFileOperationsHelper().sendShareFile(getFile()); - } - - private void playVideo() { - setupVideoView(); - // load the video file in the video player - // when done, VideoHelper#onPrepared() will be called - if (getFile().isDown()) { - playVideoUri(getFile().getStorageUri()); - } else { - try { - new LoadStreamUrl(this, user, clientFactory).execute(getFile().getLocalId()); - } catch (Exception e) { - Log_OC.e(TAG, "Loading stream url not possible: " + e); - } - } - } - - private void playVideoUri(final Uri uri) { - binding.progress.setVisibility(View.GONE); - - exoPlayer.setMediaItem(MediaItem.fromUri(uri)); - exoPlayer.setPlayWhenReady(autoplay); - exoPlayer.prepare(); - - if (savedPlaybackPosition >= 0) { - exoPlayer.seekTo(savedPlaybackPosition); - } - - // only autoplay video once - autoplay = false; - } - - private static class LoadStreamUrl extends AsyncTask { - - private final ClientFactory clientFactory; - private final User user; - private final WeakReference previewMediaFragmentWeakReference; - - public LoadStreamUrl(PreviewMediaFragment previewMediaFragment, User user, ClientFactory clientFactory) { - this.previewMediaFragmentWeakReference = new WeakReference<>(previewMediaFragment); - this.user = user; - this.clientFactory = clientFactory; - } - - @Override - protected Uri doInBackground(Long... fileId) { - OwnCloudClient client; - try { - client = clientFactory.create(user); - } catch (ClientFactory.CreationException e) { - Log_OC.e(TAG, "Loading stream url not possible: " + e); - return null; - } - - StreamMediaFileOperation sfo = new StreamMediaFileOperation(fileId[0]); - RemoteOperationResult result = sfo.execute(client); - - if (!result.isSuccess()) { - return null; - } - - return Uri.parse((String) result.getData().get(0)); - } - - @Override - protected void onPostExecute(Uri uri) { - final PreviewMediaFragment previewMediaFragment = previewMediaFragmentWeakReference.get(); - final Context context = previewMediaFragment != null ? previewMediaFragment.getContext() : null; - if (previewMediaFragment != null && previewMediaFragment.binding != null && context != null) { - if (uri != null) { - previewMediaFragment.videoUri = uri; - previewMediaFragment.playVideoUri(uri); - } else { - previewMediaFragment.emptyListView.setVisibility(View.VISIBLE); - previewMediaFragment.setVideoErrorMessage( - previewMediaFragment.getString(R.string.stream_not_possible_headline), - R.string.stream_not_possible_message); - } - } else { - Log_OC.e(TAG, "Error streaming file: no previewMediaFragment!"); - } - } - } - - @Override - public void onPause() { - Log_OC.v(TAG, "onPause"); - super.onPause(); - } - - @Override - public void onResume() { - super.onResume(); - Log_OC.v(TAG, "onResume"); - } - - @Override - public void onDestroy() { - Log_OC.v(TAG, "onDestroy"); - super.onDestroy(); - } - - @Override - public void onDestroyView() { - Log_OC.v(TAG, "onDestroyView"); - super.onDestroyView(); - binding = null; - } - - @Override - public void onStop() { - Log_OC.v(TAG, "onStop"); - final OCFile file = getFile(); - if (MimeTypeUtil.isAudio(file) && !mediaPlayerServiceConnection.isPlaying()) { - stopAudio(); - } else if (MimeTypeUtil.isVideo(file) && exoPlayer != null && exoPlayer.isPlaying()) { - savedPlaybackPosition = exoPlayer.getCurrentPosition(); - exoPlayer.pause(); - } - - mediaPlayerServiceConnection.unbind(); - toggleDrawerLockMode(containerActivity, DrawerLayout.LOCK_MODE_UNLOCKED); - super.onStop(); - } - - @Override - public boolean onTouch(View v, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN && v.equals(binding.exoplayerView)) { - // added a margin on the left to avoid interfering with gesture to open navigation drawer - if (event.getX() / Resources.getSystem().getDisplayMetrics().density > MIN_DENSITY_RATIO) { - startFullScreenVideo(); - } - return true; - } - return false; - } - - private void startFullScreenVideo() { - final FragmentActivity activity = getActivity(); - if (activity != null) { - new PreviewVideoFullscreenDialog(activity, nextcloudClient, exoPlayer, binding.exoplayerView).show(); - } - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - Log_OC.v(TAG, "onConfigurationChanged " + this); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - Log_OC.v(TAG, "onActivityResult " + this); - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == Activity.RESULT_OK) { - savedPlaybackPosition = data.getLongExtra(PreviewMediaFragment.EXTRA_START_POSITION, 0); - autoplay = data.getBooleanExtra(PreviewMediaFragment.EXTRA_AUTOPLAY, false); - } - } - - /** - * Opens the previewed file with an external application. - */ - private void openFile() { - stopPreview(true); - containerActivity.getFileOperationsHelper().openFile(getFile()); - } - - /** - * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewMediaFragment} to be previewed. - * - * @param file File to test if can be previewed. - * @return 'True' if the file can be handled by the fragment. - */ - public static boolean canBePreviewed(OCFile file) { - return file != null && (MimeTypeUtil.isAudio(file) || MimeTypeUtil.isVideo(file)); - } - - public void stopPreview(boolean stopAudio) { - if (stopAudio && mediaPlayerServiceConnection != null) { - mediaPlayerServiceConnection.stop(); - } else if (exoPlayer != null) { - savedPlaybackPosition = exoPlayer.getCurrentPosition(); - exoPlayer.stop(); - } - } - - public long getPosition() { - if (prepared) { - savedPlaybackPosition = exoPlayer.getCurrentPosition(); - } - Log_OC.v(TAG, "getting position: " + savedPlaybackPosition); - return savedPlaybackPosition; - } - - private void toggleDrawerLockMode(ContainerActivity containerActivity, int lockMode) { - ((DrawerActivity) containerActivity).setDrawerLockMode(lockMode); - } - - @Override - public void onDetach() { - - if (exoPlayer != null) { - exoPlayer.stop(); - exoPlayer.release(); - } - - super.onDetach(); - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java deleted file mode 100644 index ba37adf..0000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019-2022 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019-2022 Andy Scherzinger - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2016 ownCloud Inc. - * SPDX-FileCopyrightText: 2014 Jorge Antonio Diaz-Benito Soriano - * SPDX-License-Identifier: GPL-2.0-only AND AGPL-3.0-or-later - */ -package com.owncloud.android.ui.preview; - -import android.app.Activity; -import android.content.res.Resources; -import android.graphics.Color; -import android.os.Bundle; -import android.os.Handler; -import android.text.Html; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.nextcloud.client.account.UserAccountManager; -import com.nextcloud.client.device.DeviceInfo; -import com.nextcloud.client.di.Injectable; -import com.owncloud.android.R; -import com.owncloud.android.databinding.TextFilePreviewBinding; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.MimeTypeUtil; -import com.owncloud.android.utils.StringUtils; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.SearchView; -import io.noties.markwon.AbstractMarkwonPlugin; -import io.noties.markwon.Markwon; -import io.noties.markwon.MarkwonConfiguration; -import io.noties.markwon.core.MarkwonTheme; -import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; -import io.noties.markwon.ext.tables.TablePlugin; -import io.noties.markwon.ext.tasklist.TaskListDrawable; -import io.noties.markwon.ext.tasklist.TaskListPlugin; -import io.noties.markwon.html.HtmlPlugin; -import io.noties.markwon.syntax.Prism4jTheme; -import io.noties.markwon.syntax.Prism4jThemeDefault; -import io.noties.markwon.syntax.SyntaxHighlightPlugin; -import io.noties.prism4j.Prism4j; -import io.noties.prism4j.annotations.PrismBundle; - -@PrismBundle( - include = { - "c", "clike", "clojure", "cpp", "csharp", "css", "dart", "git", "go", "groovy", "java", "javascript", "json", - "kotlin", "latex", "makefile", "markdown", "markup", "python", "scala", "sql", "swift", "yaml" - }, - grammarLocatorClassName = ".MarkwonGrammarLocator" -) -public abstract class PreviewTextFragment extends FileFragment implements SearchView.OnQueryTextListener, Injectable { - private static final String TAG = PreviewTextFragment.class.getSimpleName(); - - protected SearchView searchView; - protected String searchQuery = ""; - protected boolean searchOpen; - protected Handler handler; - protected String originalText; - - @Inject UserAccountManager accountManager; - @Inject DeviceInfo deviceInfo; - @Inject ViewThemeUtils viewThemeUtils; - - protected TextFilePreviewBinding binding; - - /** - * {@inheritDoc} - */ - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - Log_OC.e(TAG, "onCreateView"); - - binding = TextFilePreviewBinding.inflate(inflater, container, false); - View view = binding.getRoot(); - - binding.emptyListProgress.setVisibility(View.VISIBLE); - - return view; - } - - @Override - public void onStart() { - super.onStart(); - Log_OC.e(TAG, "onStart"); - - loadAndShowTextPreview(); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - abstract void loadAndShowTextPreview(); - - @Override - public boolean onQueryTextSubmit(String query) { - performSearch(query, 0); - return true; - } - - @Override - public boolean onQueryTextChange(final String newText) { - performSearch(newText, 500); - return true; - } - - - private void performSearch(final String query, int delay) { - handler.removeCallbacksAndMessages(null); - - if (originalText != null) { - if (getActivity() instanceof FileDisplayActivity) { - FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) getActivity(); - fileDisplayActivity.setSearchQuery(query); - } - handler.postDelayed(() -> markText(query), delay); - } - - if (delay == 0 && searchView != null) { - searchView.clearFocus(); - } - } - - private void markText(String query) { - // called asynchronously - must check preconditions in case of UI detachment - if (binding == null) { - return; - } - final Activity activity = getActivity(); - if (activity == null) { - return; - } - final Resources resources = activity.getResources(); - if (resources == null) { - return; - } - - if (!TextUtils.isEmpty(query)) { - String coloredText = StringUtils.searchAndColor(originalText, - query, - resources.getColor(R.color.primary)); - binding.textPreview.setText(Html.fromHtml(coloredText.replace("\n", "
"))); - } else { - setText(binding.textPreview, originalText, getFile(), activity, false, false, viewThemeUtils); - } - } - - protected static Spanned getRenderedMarkdownText(Activity activity, - String markdown, - ViewThemeUtils viewThemeUtils) { - Prism4j prism4j = new Prism4j(new MarkwonGrammarLocator()); - Prism4jTheme prism4jTheme = Prism4jThemeDefault.create(); - TaskListDrawable drawable = new TaskListDrawable(Color.GRAY, Color.GRAY, Color.WHITE); - viewThemeUtils.platform.tintPrimaryDrawable(activity, drawable); - - final Markwon markwon = Markwon.builder(activity) - .usePlugin(new AbstractMarkwonPlugin() { - @Override - public void configureTheme(@NonNull MarkwonTheme.Builder builder) { - builder.linkColor(viewThemeUtils.platform.primaryColor(activity)); - builder.headingBreakHeight(0); - } - - @Override - public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder.linkResolver((view, link) -> DisplayUtils.startLinkIntent(activity, link)); - } - }) - .usePlugin(TablePlugin.create(activity)) - .usePlugin(TaskListPlugin.create(drawable)) - .usePlugin(StrikethroughPlugin.create()) - .usePlugin(HtmlPlugin.create()) - .usePlugin(SyntaxHighlightPlugin.create(prism4j, prism4jTheme)) - .build(); - - return markwon.toMarkdown(markdown); - } - - /** - * Finishes the preview - */ - protected void finish() { - requireActivity().runOnUiThread(() -> requireActivity().onBackPressed()); - } - - public static void setText(TextView textView, - @Nullable String text, - @Nullable OCFile file, - Activity activity, - boolean ignoreMimetype, - boolean preview, - ViewThemeUtils viewThemeUtils) { - if (text == null) { - return; - } - - if ((ignoreMimetype || file != null && MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN.equals(file.getMimeType())) - && activity != null) { - if (!preview) { - // clickable links prevent to open full view of rich workspace - textView.setMovementMethod(LinkMovementMethod.getInstance()); - } - textView.setText(getRenderedMarkdownText(activity, text, viewThemeUtils)); - } else { - textView.setText(text); - } - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/FileSortOrder.kt b/app/src/main/java/com/owncloud/android/utils/FileSortOrder.kt index 6cd6aa5..0767754 100644 --- a/app/src/main/java/com/owncloud/android/utils/FileSortOrder.kt +++ b/app/src/main/java/com/owncloud/android/utils/FileSortOrder.kt @@ -25,7 +25,9 @@ open class FileSortOrder(@JvmField var name: String, var isAscending: Boolean) { trashBinView, @Suppress("ktlint:standard:enum-entry-name-case") - localFileListView + localFileListView, + + favoritesListView } enum class SortType { diff --git a/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java b/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java deleted file mode 100644 index 2152adc..0000000 --- a/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019 Chris Narkiewicz - * SPDX-FileCopyrightText: 2017 Alejandro Morales - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.glide; - -import com.bumptech.glide.load.data.DataFetcher; -import com.bumptech.glide.load.model.stream.StreamModelLoader; -import com.nextcloud.client.account.User; -import com.nextcloud.client.network.ClientFactory; - -import java.io.InputStream; - -/** - * Custom Model for OwnCloudClient - */ -public class CustomGlideStreamLoader implements StreamModelLoader { - - private final User user; - private final ClientFactory clientFactory; - - public CustomGlideStreamLoader(User user, ClientFactory clientFactory) { - this.user = user; - this.clientFactory = clientFactory; - } - - @Override - public DataFetcher getResourceFetcher(String url, int width, int height) { - return new HttpStreamFetcher(user, clientFactory, url); - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideUriLoader.java b/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideUriLoader.java deleted file mode 100644 index c885261..0000000 --- a/app/src/main/java/com/owncloud/android/utils/glide/CustomGlideUriLoader.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2019 Tobias Kaminsky - * SPDX-FileCopyrightText: 2019 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.glide; - -import android.net.Uri; - -import com.bumptech.glide.load.data.DataFetcher; -import com.bumptech.glide.load.model.stream.StreamModelLoader; -import com.nextcloud.client.account.User; -import com.nextcloud.client.network.ClientFactory; - -import java.io.InputStream; - -/** - * Custom Model for authenticated fetching from Uri - */ -public class CustomGlideUriLoader implements StreamModelLoader { - - private final User user; - private final ClientFactory clientFactory; - - public CustomGlideUriLoader(User user, ClientFactory clientFactory) { - this.user = user; - this.clientFactory = clientFactory; - } - - @Override - public DataFetcher getResourceFetcher(Uri url, int width, int height) { - return new HttpStreamFetcher(user, clientFactory, url.toString()); - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/MenuSimpleTarget.java b/app/src/main/java/com/owncloud/android/utils/svg/MenuSimpleTarget.java deleted file mode 100644 index 055afdd..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/MenuSimpleTarget.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2017 Alejandro Morales - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.svg; - - -import com.bumptech.glide.request.target.SimpleTarget; - -/** - * SimpleTarget for MenuItems. - */ -public abstract class MenuSimpleTarget extends SimpleTarget{ - - private final int mIdMenuItem; - - public MenuSimpleTarget(int idMenuItem){ - super(); - this.mIdMenuItem=idMenuItem; - } - - public int getIdMenuItem() { - return mIdMenuItem; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SVGorImage.java b/app/src/main/java/com/owncloud/android/utils/svg/SVGorImage.java deleted file mode 100644 index 3b1bb26..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SVGorImage.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2021 Tobias Kaminsky - * SPDX-FileCopyrightText: 2021 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.svg; - -import android.graphics.Bitmap; - -import com.caverock.androidsvg.SVG; - -public class SVGorImage { - private SVG svg; - private Bitmap bitmap; - - public SVGorImage(SVG svg, Bitmap bitmap) { - this.svg = svg; - this.bitmap = bitmap; - } - - public SVG getSVG() { - return svg; - } - - public Bitmap getBitmap() { - return bitmap; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgBitmapTranscoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgBitmapTranscoder.java deleted file mode 100644 index 208e711..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgBitmapTranscoder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.svg; - -import android.graphics.Bitmap; -import android.graphics.Canvas; - -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; -import com.owncloud.android.lib.common.utils.Log_OC; - -/** - * Convert the {@link SVG}'s internal representation to a Bitmap. - */ -public class SvgBitmapTranscoder implements ResourceTranscoder { - private int width; - private int height; - - public SvgBitmapTranscoder(int width, int height) { - this.width = width; - this.height = height; - } - - @Override - public Resource transcode(Resource toTranscode) { - SVG svg = toTranscode.get(); - - try { - svg.setDocumentHeight("100%"); - svg.setDocumentWidth("100%"); - } catch (SVGParseException e) { - Log_OC.e(this, "Could not set document size. Output might have wrong size"); - } - - // Create a canvas to draw onto - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - - // Render our document onto our canvas - svg.renderToCanvas(canvas); - - return new SimpleResource<>(bitmap); - } - - @Override - public String getId() { - return ""; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java deleted file mode 100644 index cee481b..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2014 Google, Inc. All rights reserved. - * SPDX-License-Identifier: BSD-2-Clause - * - * Borrowed from: - * https://github.com/bumptech/glide/blob/master/samples/svg/src/main/java/com/bumptech/glide/samples/svg/ - * SvgDecoder.java - */ -package com.owncloud.android.utils.svg; - -import com.bumptech.glide.load.ResourceDecoder; -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.caverock.androidsvg.PreserveAspectRatio; -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Decodes an SVG internal representation from an {@link InputStream}. - */ -public class SvgDecoder implements ResourceDecoder { - public SvgDecoder() { - // empty constructor - } - - public Resource decode(InputStream source, int w, int h) throws IOException { - try { - SVG svg = SVG.getFromInputStream(source); - svg.setDocumentViewBox(0, 0, svg.getDocumentWidth(), svg.getDocumentHeight()); - svg.setDocumentWidth("100%"); - svg.setDocumentHeight("100%"); - svg.setDocumentPreserveAspectRatio(PreserveAspectRatio.LETTERBOX); - - return new SimpleResource<>(svg); - } catch (SVGParseException ex) { - throw new IOException("Cannot load SVG from stream", ex); - } - } - - @Override - public String getId() { - return "SvgDecoder.com.owncloud.android"; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java deleted file mode 100644 index 08dea75..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2014 Google, Inc. All rights reserved. - * SPDX-License-Identifier: BSD-2-Clause - * - * Borrowed from: - * https://github.com/bumptech/glide/blob/master/samples/svg/src/main/java/com/bumptech/glide/samples/svg/ - * SvgDrawableTranscoder.java - */ -package com.owncloud.android.utils.svg; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Picture; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.PictureDrawable; - -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import com.caverock.androidsvg.SVG; - -/** - * Convert the {@link SVG}'s internal representation to an Android-compatible one ({@link Picture}). - */ -public class SvgDrawableTranscoder implements ResourceTranscoder { - private final Context context; - - public SvgDrawableTranscoder(Context context) { - this.context = context; - } - - @Override - public Resource transcode(Resource toTranscode) { - SVG svg = toTranscode.get(); - Picture picture = svg.renderToPicture(); - PictureDrawable drawable = new PictureDrawable(picture); - - Bitmap returnedBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), - drawable.getIntrinsicHeight(), - Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(returnedBitmap); - canvas.drawPicture(drawable.getPicture()); - Drawable d = new BitmapDrawable(context.getResources(), returnedBitmap); - - return new SimpleResource<>(d); - } - - @Override - public String getId() { - return ""; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageBitmapTranscoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageBitmapTranscoder.java deleted file mode 100644 index 634aa43..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageBitmapTranscoder.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2021 Tobias Kaminsky - * SPDX-FileCopyrightText: 2021 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.utils.svg; - -import android.graphics.Bitmap; -import android.graphics.Canvas; - -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; -import com.owncloud.android.lib.common.utils.Log_OC; - -/** - * Convert the {@link SVG}'s internal representation to a Bitmap. - */ -public class SvgOrImageBitmapTranscoder implements ResourceTranscoder { - private int width; - private int height; - - public SvgOrImageBitmapTranscoder(int width, int height) { - this.width = width; - this.height = height; - } - - @Override - public Resource transcode(Resource toTranscode) { - SVGorImage svGorImage = toTranscode.get(); - - if (svGorImage.getSVG() != null) { - SVG svg = svGorImage.getSVG(); - - try { - svg.setDocumentHeight("100%"); - svg.setDocumentWidth("100%"); - } catch (SVGParseException e) { - Log_OC.e(this, "Could not set document size. Output might have wrong size"); - } - - // Create a canvas to draw onto - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - - // Render our document onto our canvas - svg.renderToCanvas(canvas); - - return new SimpleResource<>(bitmap); - } else { - Bitmap bitmap = svGorImage.getBitmap(); - - return new SimpleResource<>(bitmap); - } - } - - @Override - public String getId() { - return ""; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageDecoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageDecoder.java deleted file mode 100644 index 7ac8e0a..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgOrImageDecoder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2014 Google, Inc. All rights reserved. - * SPDX-License-Identifier: BSD-2-Clause - * - * Borrowed from: - * https://github.com/bumptech/glide/blob/master/samples/svg/src/main/java/com/bumptech/glide/samples/svg/ - * SvgDecoder.java - * - * Adapted from https://stackoverflow.com/a/54523482 - * - */ - -package com.owncloud.android.utils.svg; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; - -import com.bumptech.glide.load.ResourceDecoder; -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.caverock.androidsvg.PreserveAspectRatio; -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * Decodes an SVG internal representation from an {@link InputStream}. - */ -public class SvgOrImageDecoder implements ResourceDecoder { - private int height = -1; - private int width = -1; - - public SvgOrImageDecoder(int height, int width) { - this.height = height; - this.width = width; - } - - public SvgOrImageDecoder() { - // empty constructor - } - - public Resource decode(InputStream source, int w, int h) throws IOException { - byte[] array = new byte[source.available()]; - source.read(array); - ByteArrayInputStream svgInputStream = new ByteArrayInputStream(array.clone()); - ByteArrayInputStream pngInputStream = new ByteArrayInputStream(array.clone()); - - try { - SVG svg = SVG.getFromInputStream(svgInputStream); - source.close(); - pngInputStream.close(); - - if (width > 0) { - svg.setDocumentWidth(width); - } - if (height > 0) { - svg.setDocumentHeight(height); - } - svg.setDocumentPreserveAspectRatio(PreserveAspectRatio.LETTERBOX); - - return new SimpleResource<>(new SVGorImage(svg, null)); - } catch (SVGParseException ex) { - Bitmap bitmap = BitmapFactory.decodeStream(pngInputStream); - return new SimpleResource<>(new SVGorImage(null, bitmap)); - } - } - - @Override - public String getId() { - return "SvgDecoder.com.owncloud.android"; - } -} diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java deleted file mode 100644 index 47c4bb5..0000000 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2014 Google, Inc. All rights reserved. - * SPDX-License-Identifier: BSD-2-Clause - * - * Borrowed from: - * https://github.com/bumptech/glide/blob/master/samples/svg/src/main/java/com/bumptech/glide/samples/svg/ - * SvgSoftwareLayerSetter.java - */ -package com.owncloud.android.utils.svg; - -import android.graphics.drawable.Drawable; -import android.widget.ImageView; - -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.target.ImageViewTarget; -import com.bumptech.glide.request.target.Target; - -public class SvgSoftwareLayerSetter implements RequestListener { - - @Override - public boolean onException(Exception e, T model, Target target, boolean isFirstResource) { - ImageView view = ((ImageViewTarget) target).getView(); - view.setLayerType(ImageView.LAYER_TYPE_NONE, null); - - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, T model, Target target, - boolean isFromMemoryCache, boolean isFirstResource) { - ImageView view = ((ImageViewTarget) target).getView(); - view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null); - - return false; - } -} diff --git a/app/src/main/res/drawable/ic_baseline_check_24.xml b/app/src/main/res/drawable/ic_baseline_check_24.xml deleted file mode 100644 index c11536b..0000000 --- a/app/src/main/res/drawable/ic_baseline_check_24.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/nav_notifications.xml b/app/src/main/res/drawable/nav_notifications.xml deleted file mode 100644 index e609ad5..0000000 --- a/app/src/main/res/drawable/nav_notifications.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/online_status.xml b/app/src/main/res/drawable/online_status.xml deleted file mode 100644 index dc8d568..0000000 --- a/app/src/main/res/drawable/online_status.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ripple.xml b/app/src/main/res/drawable/ripple.xml deleted file mode 100644 index b466410..0000000 --- a/app/src/main/res/drawable/ripple.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_set_status.xml b/app/src/main/res/layout/dialog_set_status.xml deleted file mode 100644 index 68594a4..0000000 --- a/app/src/main/res/layout/dialog_set_status.xml +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/grid_image.xml b/app/src/main/res/layout/grid_image.xml deleted file mode 100644 index 77aaaf9..0000000 --- a/app/src/main/res/layout/grid_image.xml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index f9a790c..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 20b799c..f844709 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -249,6 +249,13 @@ Zvolte typ exportu Vytvoření PDF se nezdařilo Vytváření PDF… + Zde není možné vytvořit položku: chybí oprávnění pro vytváření. + Nebylo možné vytvořit soubor: chybí oprávnění + Nebylo možné vytvořit složku: chybí oprávnění + Položku nebylo možné smazat: chybí oprávnění ke smazání. + Položku nebylo možné přesunout: chybí oprávnění k přesouvání. + Položku nebylo možné otevřít: chybí oprávnění ke čtení. + Položku nebylo možné přejmenovat: chybí oprávnění k přejmenovávání. Hotovo Nikdy Nedaří se vytvořit místní soubor @@ -335,6 +342,7 @@ Nahlásit problém? (vyžaduje GitHub účet) Chyba při získávání souboru Chyba při získávání šablon + Chyba při nastavování stavové zprávy! Chyba při zobrazování dialogu pro nastavení šifrování! Chyba při spouštění kamery Chyba při spouštění skenu dokumentu @@ -363,6 +371,7 @@ Přenos Stáhnout Nahrát + Nemáte oprávnění pro vytváření nebo nahrávání souborů v této složce. Externí sdílení Přidat nebo nahrát Předání souboru správci stahování se nezdařilo @@ -442,6 +451,7 @@ Soubor se nepodařilo synchronizovat. Zobrazuje se poslední dostupná verze. Přejmenovat Nahrávání se nezdařilo. Není k dispozici připojení k Internetu + %s už existuje – nezjištěny žádné konflikty Chyba při obnovování verze souboru! Verze souboru úspěšně obnovena. Podrobnosti @@ -518,6 +528,7 @@ Nejnovější záloha: %1$s Odkaz Název odkazu + Odkaz nenásledován kvůli nastavení zabezpečení. Upravování Zobrazit jako seznam Načíst další výsledky @@ -570,6 +581,7 @@ Není možné přesunout složku do její vlastní podsložky Soubor už v cílové složce existuje Soubor se nedaří přesunout – zkontrolujte zda existuje. + Ztlumit veškerá upozornění Při čekání na server se vyskytla chyba. Operace proto nemohla být dokončena. Při připojování k serveru došlo k chybě Při čekání na server se vyskytla chyba. Operace proto nemohla být dokončena. @@ -603,6 +615,7 @@ Obecná oznámení Průběh přehrávače hudby Přehrávač médií + Zobrazit ukazatel postupu operací se soubory offline Offline operace Zobrazit push upozornění poslaná serverem: Zmínění v komentářích, příjem nových vzdálených sdílení, oznámení vydaná správcem, atd. Push upozorňování @@ -1027,6 +1040,8 @@ Odeslání bylo zrušeno uživatelem Umožnit přístup ke všem souborům Oprávnění aplikace + Bez přístupu k lokálnímu úložišti není možné vaše soubory nahrávat. Klepnutím udělte oprávnění. + Nahrávání zastaveno – je zapotřebí oprávnění pro úložiště %1$d / %2$d - %3$s Šifrování je možné pouze na systému Android verze 5.0 a novějším Pro zkopírování vybraných souborů do složky %1$s není dostatek volného místa. Chcete je tam namísto toho přesunout? diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 52d7afd..d6647e3 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -249,8 +249,13 @@ Vælg eksporttype Dannelse af PDF mislykkedes Genererer PDF… + Kan ikke oprette elementer: manglende oprettelsesrettighed. Kan ikke oprette fil: mangler rettigheder. Kan ikke oprette mappe: mangler rettigheder. + Kan ikke slette element: manglende sletterettighed. + Kan ikke flytte element: manglende flytterettighed. + Kan ikke åbne element: manglende læserettighed. + Kan ikke omdøbe element: manglende omdøbningsrettighed. Færdig Ryd ikke Kan ikke oprette filen lokalt @@ -330,12 +335,14 @@ kommentering af fil fejlet %1$s krakket Fejl ved oprettelse af fil fra skabelon + Kan ikke hente delinger. Fejl under visning af filhandlinger Fejl ved ændring af status for fillås Rapporter Rapportere problem til tracker? (kræver en GitHub-konto) Fejl ved modtagelse af fil Fejl ved indlæsning af modeller + Fejl under angivelse af statusbesked! Fejl under visning af dialogboks for opsætning af kryptering! Fejl ved start af kamera Fejl ved start af scanning af dokument @@ -364,6 +371,7 @@ Overførsel Download Send + Du har ikke tilladelse til at oprette eller uploade filer i denne mappe. Eksterne delinger Tilføj eller send Fejl ved overførsel af fil til download manager @@ -376,8 +384,10 @@ Filnavn findes allerede Slet Fejl ved indlæsning af aktiviteter for fil + Du kan ikke slette en deling, deling er allerede aktiv fra denne bruger. Ingen app tilgængelig til at vælge kontakter Fejl ved indlæsning af detaljer + Vælg venligst brugerdefineret rettighed Fil Behold Upload indhold eller synkroniser med dine enheder. @@ -396,6 +406,7 @@ Intet er delt endnu Ingen resultater fundet for din forespørgsel Start din søgning + Indtast i søgebjælken foroven for at finde filer, kontakter, kalenderbegivenheder, og mere på tværs af din konto. mappe LIVE Indlæser... @@ -440,6 +451,7 @@ Filen kunne ikke synkroniseres. Viser senest tilgængelige version. Omdøb Upload mislykkedes. Ingen internetforbindelse + %s eksisterer allerede. Ingen konflikt detekteret Fejl ved genskabning af fil version! Succes ved genskabning af fil version! Detaljer @@ -516,6 +528,7 @@ Seneste backup: %1$s Link Link Navn + Link ikke fulgt på grund af sikkerhedsindstillinger. Redigering Liste layout Indlæs flere resultater @@ -602,6 +615,7 @@ Generalle notifikationer Music afspiller fremskridt Media afspiller + Viser fremskridt for offline filhandlinger Offline handlinger Vis push notifikationer sent fra serveren: Omtaler, modtagelse a nye fjerne delinger, annonceringer skrevet af en admin etc. Pushbeskeder @@ -617,8 +631,12 @@ Selv uden internetforbindelse kan du organisere dine mapper, oprette filer. Når du er online igen, synkroniseres dine afventende handlinger automatisk. Du er offline, men arbejdet fortsætter Filen eksisterer ikke endnu. Upload venligst filen først. + Kunne ikke oprette %s. En fil med det samme navn eksisterer på serveren. + Kunne ikke oprette %s. En mappe med det samme navn eksisterer på serveren. Offline handlingen kan ikke gennemføres. %s Offline handlinger + Annullerede sletning af %s. Filen er blevet ændret på serveren. + Annullerede omdøbning af %s. En fil med det samme navn eksisterer på serveren. Starter offline handlinger 1 time Online @@ -646,6 +664,7 @@ Åbn %1$s .txt 389 KB + pladsholder 12:23:45 Nyligt redigeret Dette er en pladsholder @@ -794,6 +813,7 @@ Kunne ikke indlæse indhold Enheden er sandsynligvis ikke forbundet til internettet Sæt som + Kan ikke sætte downloadgrænse. Kontroller venligst mulighederne. Indstil besked Sæt note Online status @@ -827,6 +847,7 @@ Angiv udløbsdato Skift adgangskode Gen-deling er ikke tilladt under sikke fil drop + Vælg venligst mindst én delingsmulighed inden du fortsætter. Kan redigere Filforespørgsler Sikkert fil drop @@ -1022,6 +1043,7 @@ Tillad adgang til alle filer App tilladelser Dine filer kan ikke blive uploadet uden adgang til dit lokalt lager. Tryk for at give tilladelse. + Upload stoppet - Lagringsrettighed krævet %1$d / %2$d - %3$s Kryptering kun mulig med >= Android 5.0 Utilstrækkelig plads til, at kopiere de valgte filer ind i %1$s mappen. Vil du flytte dem i stedet? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6bb94fc..316d90a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -93,7 +93,10 @@ %1$s unterstützt nicht mehrere Benutzerkonten Verbindung konnte nicht hergestellt werden Anmelden abbrechen + Bitte eine gültige Serveradresse eingeben. + Die Anmeldedaten konnten nicht abgerufen werden. Bitte noch einmal versuchen. Fehler bei der Verarbeitung Ihrer Anmeldeanforderung. Bitte versuchen Sie es später erneut. + Es ist kein Browser verfügbar, um diesen Link zu öffnen. Bitte schließen Sie den Anmeldevorgang in Ihrem Browser ab im Original-Verzeichnis belassen, da nur lesbar Nur über gebührenfreies WLAN hochladen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f033db4..55cba02 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -35,6 +35,7 @@ Πληκτρολογήστε κάποιο κείμενο Διαγραφή εργασίας Η εργασία διαγράφηκε με επιτυχία + Βοηθός Είσοδος Δεν βρέθηκε ο συνδεδεμένος λογαριασμός! Αποτυχία πρόσβασης: %1$s @@ -81,6 +82,7 @@ Απενεργοποίηση Η συσκευή σας ίσως έχει ενεργές ρυθμίσεις εξοικονόμησης ενέργειας. Η αυτόματη μεταφόρτωση δουλεύει μόνο εάν η εφαρμογή εξαιρεθεί από αυτές. Βελτιστοποίηση μπαταρίας + Βοηθός Αγαπημένα Όλα τα αρχεία Μέσα ενημέρωσης @@ -230,6 +232,7 @@ Φωτογραφία φόντου επικεφαλίδας συρταριού Δραστηριότητες Όλα τα αρχεία + Βοηθός Αγαπημένα Πολυμέσα Ομαδικοί φάκελοι @@ -248,6 +251,7 @@ Αυτόματη μεταφόρτωση Το Ε2Ε δεν έχει εγκατασταθεί ακόμη Δεν είναι δυνατό χωρίς σύνδεση στο διαδίκτυο + Βοηθός Περισσότερα Περισσότερες εφαρμογές Nextcloud Ορισμός ως κρυπτογραφημένου @@ -303,6 +307,7 @@ Μεταφορά Λήψη Μεταφόρτωση + Εξωτερικοί διαμοιρασμοί Προσθήκη ή μεταφόρτωση Αποτυχία διαβίβασης αρχείου στο διαχειριστή λήψεων Απέτυχε να εκτυπώσει το αρχείο @@ -411,6 +416,7 @@ Μεταφόρτωση, επίσης, υπαρχόντων αρχείων Μεταφόρτωση μόνο κατά τη διάρκεια φόρτισης /InstantUpload + Εσωτερικοί διαμοιρασμοί Μη έγκυρη διεύθυνση URL Αόρατος Η ετικέτα δεν μπορεί να είναι κενή @@ -643,6 +649,7 @@ Κατάσταση σε σύνδεση Χρησιμοποίησε την εικόνα ως Διαμοιρασμός + Να επιτρέπεται η λήψη και ο συγχρονισμός Δημιουργία Προσαρμοσμένα δικαιώματα Διαγραφή @@ -667,6 +674,7 @@ Ορισμός ημερομηνίας λήξης Ορισμός κωδικού πρόσβασης Μπορεί να επεξεργαστεί + Αίτημα αρχείου Μόνο προβολή Διαμοιρασμός Ανάγνωση diff --git a/app/src/main/res/values-es-rCR/strings.xml b/app/src/main/res/values-es-rCR/strings.xml deleted file mode 100644 index 9960620..0000000 --- a/app/src/main/res/values-es-rCR/strings.xml +++ /dev/null @@ -1,540 +0,0 @@ - - - %1$s aplicación Android - Acerca de - versión %1$s - Ícono de la cuenta - ¡No se encontró la cuenta! - Editar - Enviar/Compartir - Vista de cuadrícula - Vista de lista - Nueva carpeta - Abrir con - Buscar - Detalles - Enviar - Configuraciones - Ordenar - Usuario activo - Aún no hay actividades - Enviar - Enviar liga a… - Actividad - Agregar a %1$s - Permitir volver a compartir - Todos - Completado - Desconocido - La cuenta aún no ha sido agregada a este dispositivo - Ya existe una cuenta en el dispositivo para el mismo usuario y servidor - El usuario ingresado no corresponde con el usuario de esta cuenta - Versión del servidor no reconocida - Conexión establecida - Dirección del servidor https://… - El formato de dirección para el servidor es erróneo - El servidor no se encontró - No hay conexión de red - Conexión segura no disponible. - La configuración del servidor está mal formada. - Autorización no exitosa - Acceso denegado por el servidor de autorización - La conexión segura se está redirigiendo a través de una ruta insegura. - Conexión segura establecida - Falla en la inicialización de SSL - No fue posible verificar la identidad del servidor SSL - Probando conexión - El servidor tardó demasiado en responder - Intentando iniciar sesión… - Nombre de usuario o contraseña incorrecto - Error desconocido: %1$s - ¡Se presentó un error HTTP desconocido! - ¡Se presentó un error desconocido! - No fue posible encontrar el servidor - %1$s no soporta cuentas múltiples - No fue posible establecer la conexión - Solo cargar sobre una Wi-Fi no tarificada - /CargaAutomática - Crear nueva configuración de carpeta personalizada - Configurar una carpeta personalizada - Avatar - Cerrar - Deshabilitar - Calendario - Se presentó un problema al cargar el certificado. - Casilla de verificación - Elige la carpeta local… - Elige la carpeta remota… - Texto copiado desde %1$s - No se ha recibido texto para copiar al portapapeles - Se presentó un error inesperado al copiar al portapapeles - Atrás - Cancelar - Cancelar sincronización - Selecciona una cuenta - Confirmar - Copiar - Borrar - Error - Memoria insuficiente - Error desconocido - Cargando - Siguiente - No - OK - Pendiente - Eliminar - Renombrar - Guardar - Enviar - Compartir - Omitir - - Probar la versión de desarrollo - Esto incluye todas las últimas funcionalidades y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, por favor repórtanoslo. - foro - Ayuda a otros en - Contribuye activamente - la aplicación - Traducir - Obtén la liberación de desarrollo directamente - Obtén la liberación de desarrollo de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de Google Play - Candidato a lanzamiento - El candidato a lanzamiento (RC) es una foto del lanzamiento más próximo y se espera que sea estable. Hacer preubas en tu configuración individual puede ayudarnos a asegurar ésto. Anótate para probar en la Play store o consulta manualmente la sección de \"Versión\" de F-Droid. - ¿Encontraste una falla? ¿Hay algo raro? - Ayúdanos probando - Reporta un tema en GitHub - ¿Realmente deseas elminiar %1$s? - ¿Realmente deseas borrar los elementos seleccionados? - ¿Realmente quieres eliminar %1$s y sus contenidos? - ¿Reamente deseas eliminar los elementos seleccionados y sus contenidos? - Sólo local - Ícono de usuario para la lista de contactos - No se han otorgado privilegios, nada fue importado. - Contactos - Respaldar ahora - El respaldo está calendarizado y deberá iniciar en breve - La importación está calendarizada y deberá iniciar en breve - No se encontraron archivos - ¡No fue posible encontrar tu último respaldo! - Copiado al portapapeles - Se presentó un error al intentar copiar este archivo o carpeta - No es posible copiar una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta destino - Copiar liga - Copiar/ mover a la carpeta encriptada no se encuentra soportado por el momento. - Crear - No fue posible crear la carpeta - Nuevo - Carpeta nueva - Cerrar sesión - Deseleccionar todo - Nueva versión disponible - No hay información disponible. - No hay una nueva versión disponible. - Cerrar - Este algoritmo de verificación no está disponible en tu teléfono - Deshabilitar - Descartar - Terminado - No fue posible descargar %1$s - La descarga falló, inicia sesión de nuevo - Falla en la descarga - El archivo ya no se encuentra disponible en el servidor - %1$d%% Descargando %2$s - Descargando… - %1$s descargado - Descargado - Aún no ha descargado - Imagen de fondo para el encabezado de la barra de navegación - Actividades - Todos los archivos - Favoritos - Inicio - Notificaciones - Disponibles sin conexión - Modificado recientemente - Compartido - Papelera - Cargas - Cerrar sesión - %1$s de %2$s usados - Carga automática - Hablar - Establecer como encriptado - Configurar la encripción - Desencriptando… - Cerrar - Por favor ingresa la contraseña para desencriptar la llave privada. - Esta carpeta no está vacía. - Generando nuevas llaves… - Las 12 palabras juntas hacer una contraseña muy fuerte, permitiéndote solo a ti ver y hacer uso de tus archivos encriptados. Por favor escríbelo y mantenlo en un lugar seguro. - La encripción de punta-a-punta está dehabilitada en el servidor. - Anota tu contraseña de encripción de 12 palabras - Contraseña… - Recuperando llaves… - Almacenando llaves - Configurar encripción - No se pudieron guardar las llaves, por favor vuelve a intentarlo. - Se presentó un error al desencriptar. ¿Contraseña equivocada? - %1$s no pudo ser copiado a la carpeta local %2$s - Error crítico: No se pueden realizar operaciones - Cuentas - Creado - Usuario - Trabajos en segundo plano - Descargar - Cargar - Agregar a tus favoritos - Hacer favorito - Borrar - Archivo - Carga algún contenido o sincroniza con tus dispositivos. - Aún no hay nada marcado como favorito - No hay archivos aquí - No hay resultados en esta carpeta - No hay resultados - No hay nada aquí. Puedes agregar una carpeta. - No se encontraron archivos modificados dentro de los últimos 7 días - ¿Tal vez está dentro de una carpeta diferente? - Aún no hay nada compartido - carpeta - Cargando… - No se cuenta con una aplicación que maneje este tipo de archivo. - hace algunos segundos - Verificando el destino… - Limpiando… - La carpeta de datos ya existe. Selecciona una de las siguientes: - La carpeta Nextcloud ya existe - Se necesita más espacio - No fue posible leer el archivo fuente - No fue posible escribir al archivo destino - Se presentó una falla durante la migración - Se presentó una falla al actualizar el índice - Moviendo los datos… - Terminado - Reemplazar - Preparando la migración… - Restaurando la configuración de la cuenta… - Guardando la configuración de la cuenta… - ¡No se puede leer la carpeta fuente! - Actualizando índice… - Usar - Aguardando sincronización completa… - Archivo no encontrado - El archivo no pudo ser sincronizado. Mostrando la última versión disponible. - Renombrar - Detalles - Descargar - Exportar - El archivo se renombró com %1$s durante la carga - Sincronizar - No se ha seleccionado algún archivo - El nombre del archivo no puede estar en blanco. - Caracteres inválidos: / \\ < > : \" | ? * - El nombre del archivo contiene al menos un carácter inválido - Nombre del archivo - Crear - No hay carpetas aquí - Seleccionar - Mover - No se te permite %s - para copiar este archivo - para crear este archivo - para borrar este archivo - para mover este archivo - para renombrar este archivo - Cargando archivos… - Algunos archivos no se pudieron mover - Local: %1$s - Mover todos - Remoto: %1$s - Se han movido todos los archivos - Adelante - Nombre - Contraseña - Cargar archivos sólo con el dispositivo conectado a la toma de corriente - /Cargas Automáticas - Invisible - Liga - Permitir carga y edición - Permitir carga - Vista de lista - No hay archivos en esta carpeta - No se encontró el archivo en el sistema de archivos local - No hay más carpetas. -  %1$s bitácora de aplicación Android - Iniciar sesión - Actualizar - Cargando... - Bitácoras - Borrar datos - Las configuraciones, base de datos y certificados del servidor de los datos de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. - Administrar espacio - No fue posible leer el archivo de medios - El archivo de medios tiene una codificación incorrecta - El intento de reproducir el archivo sobrepasó el tiempo de espera - El reproductor de medios integrado es incapaz de reproducir el archivo de medios - Codec no soportado - Botón de avanzar rápido - Reproductor de música %1$s - Botón de reproducir o pausar - Botón de rebobinar - %1$s (reproduciendo) - Más reciente primero - Más antiguo primero - A - Z - Z - A - Más grande primero - Más pequeño primero - Más - Se presentó un error al intentar mover este archivo o carpeta - No es posible mover una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta de destino - Se presentó un error durante la conexión al servidor - foto - Muestra el progreso de la descarga - Descargas - Muestra el progreso de la sincronización de archivos y los resultados - Sincronizar archivo - Progreso del reproductor de música - Reproductor de medios - Mostrar las notificaciones push enviadas por el servidor: Menciones en comentarios, recepción de nuevos elementos compartidos remotos, anuncios publicados por el administrador, etc. - Notificaciones push - Muestra el progreso de la carga - Cargas - No hay notificaciones - Por favor verifica más tarde. - 1 hora - Ingresa tu código de seguridad - El código de seguridad será solicitado cada vez que inicie la aplicación - Por favor ingresa tu código de seguridad - Los códigos de seguridad no son iguales - Por favor reingresa el código de seguridad - Elimina tu código de seguirdad - Código de seguirdad eliminado - Código de seguridad almacenado - Código de seguridad incorrecto - Se requieren permisos adicionales para cargar y descargar archivos. - No se encontró una aplicación con la cual establecer la imagen - 389 KB - marcadordeposición.txt - 12:23:45 - Este es un marcador de posición - 2012/05/18 12:23 PM - Borrado - mantenido en la carpeta original - movido a la carpeta de la aplicación - Agregar cuenta - No ha sido instalado ni F-Droid o Google Play - Acerca de - Detalles - Desarrollo - General - Más - Respaldo diario de tus contactos - GNU Licencia Pública General, versión 2 - Ayuda - Exención de responsabilidad - El archivo original será… - El archivo original será… - Usar sub carpetas - Licencia - Ninguno - Administrar cuentas - Mostrar archivos ocultos - Obtener el código fuente - Carpeta local - Carpeta remota - Tema - Oscuro - Claro - Vista previa de imagen - No existe un archivo local a previsualizar - No es posible mostrar la imagen - Disculpa - Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. - No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. - En este momento las notificaciones push no están disponibles. - ¡Prueba %1$s en tu dispositivo! - Quiero invitarte a usar %1$s en tu dispositivo\nDescárgalo aquí:%2$s - %1$s ó %2$s - Volver a cargar - Falla al eliminar - Eliminar - Eliminado - Ingresa un nombre nuevo - No se pudo renombrar la copia local, intenta con un nombre diferente - No fue posible renombrar, el nombre ya está ocupado - No se permite volver a compartir - No está permitido recompartir - No hay una imagen a escala disponible. ¿Descargar la imagen completa? - Seleccionar todo - Enviar - Ícono de botón de envío - Establecer Como - Usar imagen como - Compartir - Compartiendo - Compartir %1$s - %1$s (grupo) - Compartir liga - Debes ingresar una contraseña - para compartir este archivo - Ingresa una contraseña - Establecer fecha de expiración - Establecer contraseña - Puede editar - %1$s (remoto) - Configuraciones - Compartir liga - Compartir con… - compartido - Ordenar por - Ocultar - Detalles - La identidad del servidor no pudo ser verificada - País: - Nombre común: - Ubicación: - Organización: - Unidad organizacional: - Estado: - Huella digital: - Emitido por: - Firma: - Algoritmo: - Emitido para: - Validez: - De: - Para: - - No hay información acerca del error - No fue posible guardar el certificado - El certificado no puede ser mostrado. - ¿Quieres confiar en este certificado de todas formas? - - El certificado del servidor expiró - - El certificado del servidor no es de confianza - - Las fechas del certificado del servidor están en el futuro - - La URL no corresponde con el nombre del servidor en el certificado - Mensaje de estado - Predeterminado - Descargas - \"%1$s\" ha sido compartido contigo - %1$s ha compartido \"%2$s\" contigo - Se encontraron conflictos - La carpeta %1$s ya no existe - No fue posible sincronizar %1$s - Contraseña equivocada para %1$s - Falla en archivos mantenidos-en-sincronización. - Falla en la sincronización - La sincronización falló, inicia sesión de nuevo - Los contenidos del archivo ya han sido sincronizados - A partir de la versión 1.3.16, los archivos cargados desde este dispositivo serán copiados a la carpeta local %1$s para prevenir pérdidas de datos cuando un archivo se sincroniza entre múltiples cuentas. \n\nDerivado de este cambio, todos los archivos cargados con versiones anteriores de la aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error evitó que se completara esta operación durante la sincronización de la cuenta. Puedes dejar el(los) archivo(s) como está(n) y eliminar la liga a %3$s, o bien, mover el(los) archivo(s) a la carpeta %1$s y mantener la liga a %4$s.\n\nSe enlistan a continuación los archivos locales así como los archivos remotos en %5$s a donde estaban ligados - Algunos archivos locales se han perdido - Obteniendo la versión más reciente del archivo. - Botón de status de sincronización - Archivos - Botón de configuración - Configurar carpetas - Las cargas instantáneas se han mejorado por completo. Re-configura tu carga automática desde el menú principal.\n\nDisfruta la nueva y mejorada carga automática. - Para %1$s - Tipo - Etiquetas - Probar la conexión del servidor - 30 minutos - Esta semana - Miniatura - Hoy - Papelera - No hay archivos borrados - Borrar permanentemente - Desestablecer encripción - para dejar de compartir este archivo - Accede a través de un dominio no de confianza. Por favor consulta la documentación para más información. - para actualizar este recurso compartido - Borrar cargas fallidas - Reintentar cargas fallidas - Cargar forma… - Cargar contenido de otras aplicaciones - Nombre de archivo - Tipo de archivo - Archivo de acceso directo a Google Maps(%s) - Archivo de acceso directo a Internet(%s) - Archivo snippet de texto(.txt) - Ingresa el nombre y el tipo del archivo a cargar - Cargar archivos - Botón de cargar elemento - Borrar - No hay cargas disponibles - Carga algún contenido o activa la carga automática - El espacio insuficiente evita que se copien los archivos seleccionados dentro de la carpeta %1$s. ¿Te gustaría moverlos ahí en su lugar? - Error desconocido - Seleccionar - Cargar - La información recibida no contiene un archivo válido. - %1$s no tiene permitido leer un archivo recibido - No fue posible copiar el archivo a una carpeta temporal. Por favor intenta enviarlo de nuevo. - El archivo seleccionado para cargar no fue encontrado. Por favor verifica si el archivo existe. - No hay un archivo a cargar - Nombre de la carpeta - Selecciona la carpeta de cargas - No fue posible cargar %1$s - La carga falló, inicia sesión de nuevo - Falla en la carga - Opción de carga: - Mover el archivo a la carpeta %1$s - Mantener el archivo en la carpeta de origen - Borrar el archivo de la carpeta de origen - para cargar a esta carpeta - %1$d%% Cargando %2$s - Cargando - %1$s cargado - Salir - Ajustes - No existen cuentas %1$s en tu dispositivo. Por favor configura una cuenta primero. - No se encontró la cuenta - Actual - Fallido/pendiente de reinicio - Cargado - Cancelado - Esperando para cargar - Cargas - Cancelado - Conflicto - Error de conexión - Error de credenciales - Error de archivo - Error de carpeta - No se encontró el archivo local - Error de permisos - El certificado del servidor no es de confianza - La aplicación ha sido terminada - Completado - Error desconocido - Virus detectado. ¡La carga no puede ser completada! - Esperando a salir de modo de conservación de energía - Aguardando la recarga del dispositivo - Usuario - Dirección - Correo electrónico - Número telefónico - Twitter - Sitio web - Error al extraer la información del usuario - No se ha establecido la información personal - Agrega tu nombre, una imagen y detalles de contacto en tu página de perfil. - Usuario - Descargar - Aguarda un momento… - Verificando credenciales almacenadas - Copiando el archivo desde almacenamiento privado - Actualizar - Imagen de qué es nuevo - Omitir - Nuevo en %1$s - Descargando archivos… - Enviar correo electrónico - diff --git a/app/src/main/res/values-es-rDO/strings.xml b/app/src/main/res/values-es-rDO/strings.xml deleted file mode 100644 index 21cab29..0000000 --- a/app/src/main/res/values-es-rDO/strings.xml +++ /dev/null @@ -1,556 +0,0 @@ - - - %1$s aplicación Android - Acerca de - versión %1$s - version %1$s, build #%2$s - Error al crear la cuenta - Ícono de la cuenta - ¡No se encontró la cuenta! - Editar - Borrar todas las notificaciones - Enviar/Compartir - Vista de cuadrícula - Vista de lista - Nueva carpeta - Abrir con - Buscar - Detalles - Enviar - Configuraciones - Ordenar - Usuario activo - Aún no hay actividades - Aún no hay eventos como adiciones, cambios y acciones. - Enviar - Enviar liga a… - Actividad - Añadir otro enlace - Agregar nuevo enlace para compartir público - Agregar a %1$s - Permitir volver a compartir - Buscar en %s - Todos - Completado - Desconocido - ¡Cuenta asociada no encontrada! - Error de acceso: %1$s - La cuenta aún no ha sido agregada a este dispositivo - Ya existe una cuenta en el dispositivo para el mismo usuario y servidor - El usuario ingresado no corresponde con el usuario de esta cuenta - Versión del servidor no reconocida - Conexión establecida - Su servidor no devuelve una identificación de usuario correcta, comuníquese con un administrador. - Dirección del servidor https://… - El formato de dirección para el servidor es erróneo - El servidor no se encontró - No hay conexión de red - Conexión segura no disponible. - La configuración del servidor está mal formada. - Autorización no exitosa - Acceso denegado por el servidor de autorización - La conexión segura se está redirigiendo a través de una ruta insegura. - Conexión segura establecida - Falla en la inicialización de SSL - No fue posible verificar la identidad del servidor SSL - Probando conexión - El servidor tardó demasiado en responder - Intentando iniciar sesión… - Nombre de usuario o contraseña incorrecto - Error desconocido: %1$s - ¡Se presentó un error HTTP desconocido! - ¡Se presentó un error desconocido! - No fue posible encontrar el servidor - %1$s no soporta cuentas múltiples - No fue posible establecer la conexión - Guardado en el carpeta original, ya que es solo lectura - Solo cargar sobre una Wi-Fi no tarificada - /CargaAutomática - Configurar - Crear nueva configuración de carpeta personalizada - Configurar una carpeta personalizada - Ocultar carpeta - Avatar - Lejos - Cerrar - Deshabilitar - Calendario - Se presentó un problema al cargar el certificado. - Casilla de verificación - Elige la carpeta local… - Elige la carpeta remota… - Texto copiado desde %1$s - No se ha recibido texto para copiar al portapapeles - Se presentó un error inesperado al copiar al portapapeles - Atrás - Cancelar - Cancelar sincronización - Selecciona una cuenta - Confirmar - Copiar - Borrar - Error - Memoria insuficiente - Error desconocido - Cargando - Siguiente - No - OK - Pendiente - Eliminar - Renombrar - Guardar - Enviar - Compartir - Omitir - - Probar la versión de desarrollo - Esto incluye todas las últimas funcionalidades y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, por favor repórtanoslo. - foro - Ayuda a otros en - Contribuye activamente - la aplicación - Traducir - Obtén la liberación de desarrollo directamente - Obtén la liberación de desarrollo de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de Google Play - Candidato a lanzamiento - El candidato a lanzamiento (RC) es una foto del lanzamiento más próximo y se espera que sea estable. Hacer preubas en tu configuración individual puede ayudarnos a asegurar ésto. Anótate para probar en la Play store o consulta manualmente la sección de \"Versión\" de F-Droid. - ¿Encontraste una falla? ¿Hay algo raro? - Ayúdanos probando - Reporta un tema en GitHub - Configurar - ¿Realmente deseas elminiar %1$s? - ¿Realmente deseas borrar los elementos seleccionados? - ¿Realmente quieres eliminar %1$s y sus contenidos? - ¿Reamente deseas eliminar los elementos seleccionados y sus contenidos? - Sólo local - Ícono de usuario para la lista de contactos - No se han otorgado privilegios, nada fue importado. - Contactos - Respaldar ahora - El respaldo está calendarizado y deberá iniciar en breve - La importación está calendarizada y deberá iniciar en breve - No se encontraron archivos - ¡No fue posible encontrar tu último respaldo! - Copiado al portapapeles - Se presentó un error al intentar copiar este archivo o carpeta - No es posible copiar una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta destino - Copiar liga - Copiar/ mover a la carpeta encriptada no se encuentra soportado por el momento. - Crear - No fue posible crear la carpeta - Nuevo - Carpeta nueva  - Cerrar sesión - Deseleccionar todo - Nueva versión disponible - No hay información disponible. - No hay una nueva versión disponible. - Cerrar - Este algoritmo de verificación no está disponible en tu teléfono - Deshabilitar - Descartar - Terminado - No fue posible descargar %1$s - La descarga falló, inicia sesión de nuevo - Falla en la descarga - El archivo ya no se encuentra disponible en el servidor - %1$d%% Descargando %2$s - Descargando… - %1$s descargado - Descargado - Aún no ha descargado - Imagen de fondo para el encabezado de la barra de navegación - Actividades - Todos los archivos - Favoritos - Inicio - Notificaciones - Disponibles sin conexión - Modificado recientemente - Compartido - Papelera - Cargas - Cerrar sesión - %1$s de %2$s usados - Carga automática - Hablar - Establecer como encriptado - Configurar la encripción - Desencriptando… - Cerrar - Por favor ingresa la contraseña para desencriptar la llave privada. - Esta carpeta no está vacía. - Generando nuevas llaves… - Las 12 palabras juntas hacer una contraseña muy fuerte, permitiéndote solo a ti ver y hacer uso de tus archivos encriptados. Por favor escríbelo y mantenlo en un lugar seguro. - La encripción de punta-a-punta está dehabilitada en el servidor. - Anota tu contraseña de encripción de 12 palabras - Contraseña… - Recuperando llaves… - Almacenando llaves - Configurar encripción - No se pudieron guardar las llaves, por favor vuelve a intentarlo. - Se presentó un error al desencriptar. ¿Contraseña equivocada? - %1$s no pudo ser copiado a la carpeta local %2$s - Error crítico: No se pueden realizar operaciones - Cuentas - Creado - Usuario - Trabajos en segundo plano - Descargar - Cargar - Agregar a tus favoritos - Hacer favorito - Borrar - Archivo - Carga algún contenido o sincroniza con tus dispositivos. - Aún no hay nada marcado como favorito - No hay archivos aquí - No hay resultados en esta carpeta - No hay resultados - No hay nada aquí. Puedes agregar una carpeta. - No se encontraron archivos modificados dentro de los últimos 7 días - ¿Tal vez está dentro de una carpeta diferente? - Aún no hay nada compartido - carpeta - Cargando… - No se cuenta con una aplicación que maneje este tipo de archivo. - hace algunos segundos - Verificando el destino… - Limpiando… - La carpeta de datos ya existe. Selecciona una de las siguientes: - La carpeta Nextcloud ya existe - Se necesita más espacio - No fue posible leer el archivo fuente - No fue posible escribir al archivo destino - Se presentó una falla durante la migración - Se presentó una falla al actualizar el índice - Moviendo los datos… - Terminado - Reemplazar - Preparando la migración… - Restaurando la configuración de la cuenta… - Guardando la configuración de la cuenta… - ¡No se puede leer la carpeta fuente! - Actualizando índice… - Usar - Aguardando sincronización completa… - Archivo no encontrado - El archivo no pudo ser sincronizado. Mostrando la última versión disponible. - Renombrar - Detalles - Descargar - Exportar - El archivo se renombró com %1$s durante la carga - Sincronizar - No se ha seleccionado algún archivo - El nombre del archivo no puede estar en blanco. - Caracteres inválidos: / \\ < > : \" | ? * - El nombre del archivo contiene al menos un carácter inválido - Nombre del archivo - Crear - No hay carpetas aquí - Seleccionar - Mover - No se te permite %s - para copiar este archivo - para crear este archivo - para borrar este archivo - para mover este archivo - para renombrar este archivo - Cargando archivos… - Algunos archivos no se pudieron mover - Local: %1$s - Mover todos - Remoto: %1$s - Se han movido todos los archivos - Adelante - Nombre - Contraseña - Cargar archivos sólo con el dispositivo conectado a la toma de corriente - /Cargas Automáticas - Invisible - Liga - Permitir carga y edición - Permitir carga - Vista de lista - No hay archivos en esta carpeta - No se encontró el archivo en el sistema de archivos local - No hay más carpetas. -  %1$s bitácora de aplicación Android - Iniciar sesión - Actualizar - Cargando... - Bitácoras - Borrar datos - Las configuraciones, base de datos y certificados del servidor de los datos de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. - Administrar espacio - No fue posible leer el archivo de medios - El archivo de medios tiene una codificación incorrecta - El intento de reproducir el archivo sobrepasó el tiempo de espera - El reproductor de medios integrado es incapaz de reproducir el archivo de medios - Codec no soportado - Botón de avanzar rápido - Reproductor de música %1$s - Botón de reproducir o pausar - Botón de rebobinar - %1$s (reproduciendo) - Más reciente primero - Más antiguo primero - A - Z - Z - A - Más grande primero - Más pequeño primero - Más - Se presentó un error al intentar mover este archivo o carpeta - No es posible mover una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta de destino - Se presentó un error durante la conexión al servidor - foto - Muestra el progreso de la descarga - Descargas - Muestra el progreso de la sincronización de archivos y los resultados - Sincronizar archivo - Progreso del reproductor de música - Reproductor de medios - Mostrar las notificaciones push enviadas por el servidor: Menciones en comentarios, recepción de nuevos elementos compartidos remotos, anuncios publicados por el administrador, etc. - Notificaciones push - Muestra el progreso de la carga - Cargas - No hay notificaciones - Por favor verifica más tarde. - 1 hora - Ingresa tu código de seguridad - El código de seguridad será solicitado cada vez que inicie la aplicación - Por favor ingresa tu código de seguridad - Los códigos de seguridad no son iguales - Por favor reingresa el código de seguridad - Elimina tu código de seguirdad - Código de seguirdad eliminado - Código de seguridad almacenado - Código de seguridad incorrecto - Se requieren permisos adicionales para cargar y descargar archivos. - No se encontró una aplicación con la cual establecer la imagen - 389 KB - marcadordeposición.txt - 12:23:45 - Este es un marcador de posición - 2012/05/18 12:23 PM - Borrado - mantenido en la carpeta original - movido a la carpeta de la aplicación - Agregar cuenta - No ha sido instalado ni F-Droid o Google Play - Acerca de - Detalles - Desarrollo - General - Más - Respaldo diario de tus contactos - GNU Licencia Pública General, versión 2 - Ayuda - Exención de responsabilidad - El archivo original será… - El archivo original será… - Usar sub carpetas - Licencia - Ninguno - Administrar cuentas - Mostrar archivos ocultos - Obtener el código fuente - Carpeta local - Carpeta remota - Tema - Oscuro - Claro - Vista previa de imagen - No existe un archivo local a previsualizar - No es posible mostrar la imagen - Disculpa - Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. - No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. - En este momento las notificaciones push no están disponibles. - ¡Prueba %1$s en tu dispositivo! - Quiero invitarte a usar %1$s en tu dispositivo\nDescárgalo aquí:%2$s - %1$s ó %2$s - Volver a cargar - Falla al eliminar - Eliminar - Eliminado - Ingresa un nombre nuevo - No se pudo renombrar la copia local, intenta con un nombre diferente - No fue posible renombrar, el nombre ya está ocupado - No se permite volver a compartir - No está permitido recompartir - No hay una imagen a escala disponible. ¿Descargar la imagen completa? - Seleccionar todo - Enviar - Ícono de botón de envío - Establecer Como - Usar imagen como - Compartir - Compartiendo - Compartir %1$s - %1$s (grupo) - Compartir liga - Debes ingresar una contraseña - para compartir este archivo - Ingresa una contraseña - Establecer fecha de expiración - Establecer contraseña - Puede editar - %1$s (remoto) - Configuraciones - Compartir liga - Compartir con… - compartido - Ordenar por - Ocultar - Detalles - La identidad del servidor no pudo ser verificada - País: - Nombre común: - Ubicación: - Organización: - Unidad organizacional: - Estado: - Huella digital: - Emitido por: - Firma: - Algoritmo: - Emitido para: - Validez: - De: - Para: - - No hay información acerca del error - No fue posible guardar el certificado - El certificado no puede ser mostrado. - ¿Quieres confiar en este certificado de todas formas? - - El certificado del servidor expiró - - El certificado del servidor no es de confianza - - Las fechas del certificado del servidor están en el futuro - - La URL no corresponde con el nombre del servidor en el certificado - Mensaje de estado - Predeterminado - Descargas - \"%1$s\" ha sido compartido contigo - %1$s ha compartido \"%2$s\" contigo - Se encontraron conflictos - La carpeta %1$s ya no existe - No fue posible sincronizar %1$s - Contraseña equivocada para %1$s - Falla en archivos mantenidos-en-sincronización. - Falla en la sincronización - La sincronización falló, inicia sesión de nuevo - Los contenidos del archivo ya han sido sincronizados - A partir de la versión 1.3.16, los archivos cargados desde este dispositivo serán copiados a la carpeta local %1$s para prevenir pérdidas de datos cuando un archivo se sincroniza entre múltiples cuentas. \n\nDerivado de este cambio, todos los archivos cargados con versiones anteriores de la aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error evitó que se completara esta operación durante la sincronización de la cuenta. Puedes dejar el(los) archivo(s) como está(n) y eliminar la liga a %3$s, o bien, mover el(los) archivo(s) a la carpeta %1$s y mantener la liga a %4$s.\n\nSe enlistan a continuación los archivos locales así como los archivos remotos en %5$s a donde estaban ligados - Algunos archivos locales se han perdido - Obteniendo la versión más reciente del archivo. - Botón de status de sincronización - Archivos - Botón de configuración - Configurar carpetas - Las cargas instantáneas se han mejorado por completo. Re-configura tu carga automática desde el menú principal.\n\nDisfruta la nueva y mejorada carga automática. - Para %1$s - Tipo - Etiquetas - Probar la conexión del servidor - 30 minutos - Esta semana - Miniatura - Hoy - Papelera - No hay archivos borrados - Borrar permanentemente - Desestablecer encripción - para dejar de compartir este archivo - Accede a través de un dominio no de confianza. Por favor consulta la documentación para más información. - para actualizar este recurso compartido - Borrar cargas fallidas - Reintentar cargas fallidas - Cargar forma… - Cargar contenido de otras aplicaciones - Foto - Nombre de archivo - Tipo de archivo - Archivo de acceso directo a Google Maps(%s) - Archivo de acceso directo a Internet(%s) - Archivo snippet de texto(.txt) - Ingresa el nombre y el tipo del archivo a cargar - Cargar archivos - Botón de cargar elemento - Borrar - No hay cargas disponibles - Carga algún contenido o activa la carga automática - El espacio insuficiente evita que se copien los archivos seleccionados dentro de la carpeta %1$s. ¿Te gustaría moverlos ahí en su lugar? - Error desconocido - Seleccionar - Cargar - La información recibida no contiene un archivo válido. - %1$s no tiene permitido leer un archivo recibido - No fue posible copiar el archivo a una carpeta temporal. Por favor intenta enviarlo de nuevo. - El archivo seleccionado para cargar no fue encontrado. Por favor verifica si el archivo existe. - No hay un archivo a cargar - Nombre de la carpeta - Selecciona la carpeta de cargas - No fue posible cargar %1$s - La carga falló, inicia sesión de nuevo - Falla en la carga - Opción de carga: - Mover el archivo a la carpeta %1$s - Mantener el archivo en la carpeta de origen - Borrar el archivo de la carpeta de origen - para cargar a esta carpeta - %1$d%% Cargando %2$s - Cargando - %1$s cargado - Salir - Ajustes - No existen cuentas %1$s en tu dispositivo. Por favor configura una cuenta primero. - No se encontró la cuenta - Actual - Fallido/pendiente de reinicio - Cargado - Cancelado - Esperando para cargar - Cargas - Cancelado - Conflicto - Error de conexión - Error de credenciales - Error de archivo - Error de carpeta - No se encontró el archivo local - Error de permisos - El certificado del servidor no es de confianza - La aplicación ha sido terminada - Completado - Error desconocido - Virus detectado. ¡La carga no puede ser completada! - Esperando a salir de modo de conservación de energía - Aguardando la recarga del dispositivo - Usuario - Dirección - Correo electrónico - Número telefónico - Twitter - Sitio web - Error al extraer la información del usuario - No se ha establecido la información personal - Agrega tu nombre, una imagen y detalles de contacto en tu página de perfil. - Usuario - Descargar - Aguarda un momento… - Verificando credenciales almacenadas - Copiando el archivo desde almacenamiento privado - Actualizar - Imagen de qué es nuevo - Omitir - Nuevo en %1$s - Descargando archivos… - Enviar correo electrónico - diff --git a/app/src/main/res/values-es-rGT/strings.xml b/app/src/main/res/values-es-rGT/strings.xml deleted file mode 100644 index 5308114..0000000 --- a/app/src/main/res/values-es-rGT/strings.xml +++ /dev/null @@ -1,541 +0,0 @@ - - - %1$s aplicación Android - Acerca de - versión %1$s - Ícono de la cuenta - ¡No se encontró la cuenta! - Editar - Enviar/Compartir - Vista de cuadrícula - Vista de lista - Nueva carpeta - Abrir con - Buscar - Detalles - Enviar - Configuraciones - Ordenar - Usuario activo - Aún no hay actividades - Enviar - Enviar liga a… - Actividad - Agregar a %1$s - Permitir volver a compartir - Todos - Completado - Desconocido - La cuenta aún no ha sido agregada a este dispositivo - Ya existe una cuenta en el dispositivo para el mismo usuario y servidor - El usuario ingresado no corresponde con el usuario de esta cuenta - Versión del servidor no reconocida - Conexión establecida - Dirección del servidor https://… - El formato de dirección para el servidor es erróneo - El servidor no se encontró - No hay conexión de red - Conexión segura no disponible. - La configuración del servidor está mal formada. - Autorización no exitosa - Acceso denegado por el servidor de autorización - La conexión segura se está redirigiendo a través de una ruta insegura. - Conexión segura establecida - Falla en la inicialización de SSL - No fue posible verificar la identidad del servidor SSL - Probando conexión - El servidor tardó demasiado en responder - Intentando iniciar sesión… - Nombre de usuario o contraseña incorrecto - Error desconocido: %1$s - ¡Se presentó un error HTTP desconocido! - ¡Se presentó un error desconocido! - No fue posible encontrar el servidor - %1$s no soporta cuentas múltiples - No fue posible establecer la conexión - Solo cargar sobre una Wi-Fi no tarificada - /CargaAutomática - Crear nueva configuración de carpeta personalizada - Configurar una carpeta personalizada - Avatar - Cerrar - Deshabilitar - Calendario - Se presentó un problema al cargar el certificado. - Casilla de verificación - Elige la carpeta local… - Elige la carpeta remota… - Texto copiado desde %1$s - No se ha recibido texto para copiar al portapapeles - Se presentó un error inesperado al copiar al portapapeles - Atrás - Cancelar - Cancelar sincronización - Selecciona una cuenta - Confirmar - Copiar - Borrar - Error - Memoria insuficiente - Error desconocido - Cargando - Siguiente - No - OK - Pendiente - Eliminar - Renombrar - Guardar - Enviar - Compartir - Omitir - - Probar la versión de desarrollo - Esto incluye todas las últimas funcionalidades y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, por favor repórtanoslo. - foro - Ayuda a otros en - Contribuye activamente - la aplicación - Traducir - Obten la liberación de desarrollo directamente - Obten la liberación de desarrollo de la tienda de aplicaciones F-Droid - Obten el candidato a liberación de la tienda de aplicaciones F-Droid - Obten el candidato a liberación de la tienda de Google Play - Candidato a lanzamiento - El candidato a lanzamiento (RC) es una foto del lanzamiento más próximo y se espera que sea estable. Hacer preubas en tu configuración individual puede ayudarnos a asegurar ésto. Anótate para probar en la Play store o consulta manualmente la sección de \"Versión\" de F-Droid. - ¿Encontraste una falla? ¿Hay algo raro? - Ayúdanos probando - Reporta un tema en GitHub - ¿Realmente deseas elminiar %1$s? - ¿Realmente deseas borrar los elementos seleccionados? - ¿Realmente quieres eliminar %1$s y sus contenidos? - ¿Reamente deseas eliminar los elementos seleccionados y sus contenidos? - Sólo local - Ícono de usuario para la lista de contactos - No se han otorgado privilegios, nada fue importado. - Contactos - Respaldar ahora - El respaldo está calendarizado y deberá iniciar en breve - La importación está calendarizada y deberá iniciar en breve - No se encontraron archivos - ¡No fue posible encontrar tu último respaldo! - Copiado al portapapeles - Se presentó un error al intentar copiar este archivo o carpeta - No es posible copiar una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta destino - Copiar liga - Copiar/ mover a la carpeta encriptada no se encuentra soportado por el momento. - Crear - No fue posible crear la carpeta - Nuevo - Carpeta nueva  - Cerrar sesión - Deseleccionar todo - Nueva versión disponible - No hay información disponible. - No hay una nueva versión disponible. - Cerrar - Este algoritmo de verificación no está disponible en tu teléfono - Deshabilitar - Descartar - Terminado - No fue posible descargar %1$s - La descarga falló, inicia sesión de nuevo - Falla en la descarga - El archivo ya no se encuentra disponible en el servidor - %1$d%% Descargando %2$s - Descargando… - %1$s descargado - Descargado - Aún no ha descargado - Imagen de fondo para el encabezado de la barra de navegación - Actividades - Todos los archivos - Favoritos - Inicio - Notificaciones - Disponibles sin conexión - Modificado recientemente - Compartido - Papelera - Cargas - Cerrar sesión - %1$s de %2$s usados - Carga automática - Hablar - Establecer como encriptado - Configurar la encripción - Decriptando… - Cerrar - Por favor ingresa la contraseña para decrpitar la llave privada. - Esta carpeta no está vacía. - Generando nuevas llaves… - Las 12 palabras juntas hacer una contraseña muy fuerte, permitiendote solo a ti ver y hacer uso de tus archivos encriptados. Por favor escríbelo y mantenlo en un lugar seguro. - La encripción de punta-a-punta está dehabilitada en el servidor. - Anota tu contraseña de encripción de 12 palabras - Contraseña… - Recuperando llaves… - Almacenando llaves - Configurar encripción - No se pudieron guardar las llaves, por favor vuelve a intentarlo. - Se presentó un error al decriptar. ¿Contraseña equivocada? - %1$s no pudo ser copiado a la carpeta local %2$s - Error crítico: No se pueden realizar operaciones - Cuentas - Creado - Ususario - Trabajos en segundo plano - Descargar - Cargar - Agregar a tus favoritos - Hacer favorito - Borrar - Archivo - Carga algún contenido o sincroniza con tus dispositivos. - Aún no hay nada marcado como favorito - No hay archivos aquí - No hay resultados en esta carpeta - No hay resultados - No hay nada aquí. Puedes agregar una carpeta. - No se encontraron archivos modificados dentro de los últimos 7 días - ¿Tal vez está dentro de una carpeta diferente? - Aún no hay nada compartido - carpeta - Cargando… - No se cuenta con una aplicación que maneje este tipo de achivo. - hace algunos segundos - Verificando el destino… - Limpiando… - La carpeta de datos ya existe. Selecciona una de las siguientes: - La carpeta Nextcloud ya existe - Se necesita más espacio - No fue posible leer el archivo fuente - No fue posible escribir al archivo destino - Se presentó una falla durante la migración - Se presentó una falla al actualizar el índice - Moviendo los datos… - Terminado - Reemplazar - Preparando la migración… - Restaurando la configuración de la cuenta… - Guardando la configuración de la cuenta… - ¡No se puede leer la carpeta fuente! - Actualizando índice… - Usar - Agurardando sincronización completa… - Archivo no encontrado - El archivo no pudo ser sincronizado. Mostrando la última versión disponible. - Renombrar - Detalles - Descargar - Exportar - El archivo se renombró com %1$s durante la carga - Syncronizar - No se ha seleccionado algún archivo - El nombre del archivo no puede estar en blanco. - Caracteres inválidos: / \\ < > : \" | ? * - El nombre del archivo contiene al menos un carácter inválido - Nombre del archivo - Crear - No hay carpetas aquí - Seleccionar - Mover - No se te permite %s - para copiar este archivo - para crear este archivo - para borrar este archivo - para mover este archivo - para renombrar este archivo - Cargando archivos… - Algunos archivos no se pudieron mover - Local: %1$s - Mover todos - Remoto: %1$s - Se han movido todos los archivos - Adelante - Nombre - Contraseña - Cargar archivos sólo con el dispositivo conectado a la toma de corriente - /Cargas Automáticas - Invisible - Liga - Permitir carga y edición - Permitir carga - Vista de lista - No hay archivos en esta carpeta - No se encontró el archivo en el sistema de archivos local - No hay más carpetas. -  %1$s bitácora de aplicación Android - Iniciar sesión - Actualizar - Cargando... - Bitácoras - Borrar datos - Las configuraciones, base de datos y certificados del servior de los datos de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. - Administrar espacio - No fue posible leer el archivo de medios - El archivo de medios tiene una codificación incorrecta - El intento de reproducir el archivo sobrepasó el tiempo de espera - El reproductor de medios integrado es incapaz de reproducir el archivo de medios - Codec no soportado - Botón de avanzar rápido - Reproductor de músca %1$s - Botón de reproducir o pausar - Botón de rebobinar - %1$s (reproduciendo) - Más reciente primero - Más antiguo primero - A - Z - Z - A - Más grande primero - Más pequeño primero - Más - Se presentó un error al intentar mover este archivo o carpeta - No es posible mover una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta de destino - Se presentó un error durante la conexión al servidor - foto - Muestra el progreso de la descarga - Descargas - Muestra el progreso de la sincronización de archivos y los resultados - Sincronizar archivo - Progreso del reproductor de música - Reproductor de medios - Mostrar las notificaciones push enviadas por el servidor: Menciones en comentarios, recepción de nuevos elementos compartidos remotos, anuncios publicados por el administrador, etc. - Notificaciones push - Muestra el progreso de la carga - Cargas - No hay notificaciones - Por favor verifica más tarde. - 1 hora - Ingresa tu código de seguridad - El código de seguridad será solicitado cada vez que inicie la aplicación - Por favor ingresa tu código de seguridad - Los códigos de seguridad no son iguales - Por favor reingresa el código de seguridad - Elimina tu código de seguirdad - Código de seguirdad eliminado - Código de seguridad almacenado - Código de seguridad incorrecto - Se requieren permisos adicionales para cargar y descargar archivos. - No se encontró una aplicación con la cual establecer la imagen - 389 KB - marcadordeposición.txt - 12:23:45 - Este es un marcador de posición - 2012/05/18 12:23 PM - Borrado - mantenido en la carpeta original - movido a la capreta de la aplicación - Agregar cuenta - No ha sido instalado ni F-Droid o Google Play - Acerca de - Detalles - Desarrollo - General - Más - Respaldo diario de tus contactos - GNU Licencia Pública General, versión 2 - Ayuda - Excención de responsabilidad - El archivo original será… - El archivo original será… - Usar sub carpetas - Licencia - Ninguno - Administrar cuentas - Mostrar archivos ocultos - Obtener el código fuente - Carpeta local - Carpeta remota - Tema - Oscuro - Claro - Vista previa de imagen - No existe un archivo local a previsualizar - No es posible mostrar la imagen - Disculpa - Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. - No hay notificaciones push debido a un incio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. - En este momento las notificaciones push no están disponibles. - ¡Prueba %1$s en tu dispositivo! - Quiero invitarte a usar %1$s en tu dispositivo\nDescargalo aquí:%2$s - %1$s ó %2$s - Volver a cargar - Falla al eliminar - Eliminar - Eliminado - Ingresa un nombre nuevo - No se pudo renombrar la copia local, intenta con un nombre diferente - No fue posible renombrar, el nombre ya esta ocupado - No se permite volver a compartir - No está permitido recompartir - No hay una imagen a escala disponible. ¿Descargar la imagen completa? - Seleccionar todo - Enviar - Ícono de botón de envío - Establecer Como - Usar imagen como - Compartir - Compartiendo - Compartir %1$s - %1$s (grupo) - Compartir liga - Debes ingresar una contraseña - para compartir este archivo - Ingresa una contraseña - Establecer fecha de expiración - Establecer contraseña - Puede editar - %1$s (remoto) - Configuraciones - Compartir liga - Compartir con… - compartido - Ordenar por - Ocultar - Detalles - La identidad del servidor no pudo ser verificada - País: - Nombre común: - Ubicación: - Organización: - Unidad organizacional: - Estado: - Huella digital: - Emitido por: - Firma: - Algoritmo: - Emitido para: - Validez: - De: - Para: - - No hay información acerca del error - No fue posible guardar el certificado - El certificado no puede ser mostrado. - ¿Quieres confiar en este certificado de todas formas? - - El certificado del servidor expiró - - El certificado del servidor no es de confianza - - Las fechas del certificado del servidor están en el futuro - - La URL no corresponde con el nombre del servidor en el certificado - Mensaje de estado - Predeterminado - Descargas - \"%1$s\" ha sido compartido contigo - %1$s ha compartido \"%2$s\" contigo - Se encontraron conflictos - La carpeta %1$s ya no existe - No fue posible sincronizar %1$s - Contraseña equivocada para %1$s - Falla en archivos mantenidos-en-sincronización. - Falla en la sincronización - La sincronización falló, inicia sesión de nuevo - Los contenidos del archivo ya han sido sincronizados - A partir de la versión 1.3.16, los archivos cargados desde este dispositivo serán copiados a la carpeta local %1$spara prevenir perdidas de datos cuando un archivo se sincroniza entre múltiples cuentas. \n\nDerivado de este cambio, todos los archivos cargados con versiones anteriores de la aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error evitó que se completara esta operación durante la sincronizacion de la cuenta. Puedes dejar el(los) archivo(s) como está(n) y eliminar la liga a %3$s, o bien, mover el(los) archivo(s) a la carpeta%1$s y mantener la liga a %4$s.\n\nSe enlistan a continuación los archivos locales así como los archivos remotos en %5$s a donde estaban ligados - Algunos archivos locales se han perdido - Obteniendo la versión más reciente del archivo. - Botón de status de sincronización - Archivos - Botón de configuración - Configurar carpetas - Las cargas instantaneas se han mejorado por completo. Re-configura tu carga automática desde el menú principal.\n\nDisfruta la nueva y mejorada carga automática. - Para %1$s - Tipo - Etiquetas - Probar la conexión del servidor - 30 minutos - Esta semana - Miniatura - Hoy - Papelera - No hay archivos borrados - Borrar permanentemente - Desestablecer encripción - para dejar de compartir este archivo - Accede a través de un dominio no de confianza. Por favor consulta la documentación para más información. - para actualizar este recurso compartido - Borrar cargas fallidas - Reintentar cargas fallidas - Cargar forma… - Cargar contenido de otras aplicaciones - Foto - Nombre de archivo - Tipo de archivo - Archivo de acceso directo a Google Maps(%s) - Archivo de acceso directo a Internet(%s) - Archivo snippet de texto(.txt) - Ingresa el nombre y el tipo del archivo a cargar - Cargar archivos - Botón de cargar elemento - Borrar - No hay cargas disponibles - Carga algún contenido o activa la carga automática - El espacio insuficiente evita que se copien los archivos seleccionados dentro de la carpeta %1$s. ¿Te gustaría moverlos ahí en su lugar? - Error desconocido - Seleccionar - Cargar - La información recibida no contiene un archivo válido. - %1$s no tiene permitido leer un archivo recibido - No fue posible copiar el archivo a una carpeta temporal. Por favor intenta enviarlo de nuevo. - El archivo seleccionado para cargar no fue encontrado. Por favor verifica si el archivo existe. - No hay un archivo a cargar - Nombre de la carpeta - Selecciona la carpeta de cargas - No fue posible cargar %1$s - La carga falló, inicia sesión de nuevo - Falla en la carga - Opción de carga: - Mover el archivo a la carpeta %1$s - Mantener el archivo en la carpeta de origen - Borrar el archivo de la carpeta de origen - para cargar a esta carpeta - %1$d%% Cargando %2$s - Cargando - %1$s cargado - Salir - Ajustes - No existen cuentas %1$s en tu dispositivo. Por favor configura una cuenta primero. - No se encontró la cuenta - Actual - Fallido/pendiente de reinicio - Cargado - Cancelado - Esperando para cargar - Cargas - Cancelado - Conflicto - Error de conexión - Error de credenciales - Error de archivo - Error de carpeta - No se encontró el archivo local - Error de permisos - El certificado del servidor no es de confianza - La aplicación ha sido terminada - Completado - Error desconocido - Virus detectado. ¡La carga no puede ser completada! - Esperando a salir de modo de conservación de energía - Aguardando la recarga del dispositivo - Ususario - Dirección - Correo electrónico - Número telefónico - Twitter - Sitio web - Error al extraer la información del usuario - No se ha establecido la información personal - Agrega tu nombre, una imagen y detalles de contacto en tu página de perfil. - Usuario - Descargar - Agurarda un momento… - Verificando credenciales almacenadas - Copiando el archivo desde almacenamiento privado - Actualizar - Imagen de qué es nuevo - Omitir - Nuevo en %1$s - Descargando archivos… - Enviar correo electrónico - diff --git a/app/src/main/res/values-es-rSV/strings.xml b/app/src/main/res/values-es-rSV/strings.xml deleted file mode 100644 index e250903..0000000 --- a/app/src/main/res/values-es-rSV/strings.xml +++ /dev/null @@ -1,541 +0,0 @@ - - - %1$s aplicación Android - Acerca de - versión %1$s - Ícono de la cuenta - ¡No se encontró la cuenta! - Editar - Enviar/Compartir - Vista de cuadrícula - Vista de lista - Nueva carpeta - Abrir con - Buscar - Detalles - Enviar - Configuraciones - Ordenar - Usuario activo - Aún no hay actividades - Enviar - Enviar liga a… - Actividad - Agregar a %1$s - Permitir volver a compartir - Todos - Completado - Desconocido - La cuenta aún no ha sido agregada a este dispositivo - Ya existe una cuenta en el dispositivo para el mismo usuario y servidor - El usuario ingresado no corresponde con el usuario de esta cuenta - Versión del servidor no reconocida - Conexión establecida - Dirección del servidor https://… - El formato de dirección para el servidor es erróneo - El servidor no se encontró - No hay conexión de red - Conexión segura no disponible. - La configuración del servidor está mal formada. - Autorización no exitosa - Acceso denegado por el servidor de autorización - La conexión segura se está redirigiendo a través de una ruta insegura. - Conexión segura establecida - Falla en la inicialización de SSL - No fue posible verificar la identidad del servidor SSL - Probando conexión - El servidor tardó demasiado en responder - Intentando iniciar sesión… - Nombre de usuario o contraseña incorrecto - Error desconocido: %1$s - ¡Se presentó un error HTTP desconocido! - ¡Se presentó un error desconocido! - No fue posible encontrar el servidor - %1$s no soporta cuentas múltiples - No fue posible establecer la conexión - Solo cargar sobre una Wi-Fi no tarificada - /CargaAutomática - Crear nueva configuración de carpeta personalizada - Configurar una carpeta personalizada - Avatar - Cerrar - Deshabilitar - Calendario - Se presentó un problema al cargar el certificado. - Casilla de verificación - Elige la carpeta local… - Elige la carpeta remota… - Texto copiado desde %1$s - No se ha recibido texto para copiar al portapapeles - Se presentó un error inesperado al copiar al portapapeles - Atrás - Cancelar - Cancelar sincronización - Selecciona una cuenta - Confirmar - Copiar - Borrar - Error - Memoria insuficiente - Error desconocido - Cargando - Siguiente - No - OK - Pendiente - Eliminar - Renombrar - Guardar - Enviar - Compartir - Omitir - - Probar la versión de desarrollo - Esto incluye todas las últimas funcionalidades y es lo más nuevo. Fallas/errores pueden ocurrir y si es el caso, por favor repórtanoslo. - foro - Ayuda a otros en - Contribuye activamente - la aplicación - Traducir - Obtén la liberación de desarrollo directamente - Obtén la liberación de desarrollo de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de aplicaciones F-Droid - Obtén el candidato a liberación de la tienda de Google Play - Candidato a lanzamiento - El candidato a lanzamiento (RC) es una foto del lanzamiento más próximo y se espera que sea estable. Hacer preubas en tu configuración individual puede ayudarnos a asegurar ésto. Anótate para probar en la Play store o consulta manualmente la sección de \"Versión\" de F-Droid. - ¿Encontraste una falla? ¿Hay algo raro? - Ayúdanos probando - Reporta un tema en GitHub - ¿Realmente deseas elminiar %1$s? - ¿Realmente deseas borrar los elementos seleccionados? - ¿Realmente quieres eliminar %1$s y sus contenidos? - ¿Reamente deseas eliminar los elementos seleccionados y sus contenidos? - Sólo local - Ícono de usuario para la lista de contactos - No se han otorgado privilegios, nada fue importado. - Contactos - Respaldar ahora - El respaldo está calendarizado y deberá iniciar en breve - La importación está calendarizada y deberá iniciar en breve - No se encontraron archivos - ¡No fue posible encontrar tu último respaldo! - Copiado al portapapeles - Se presentó un error al intentar copiar este archivo o carpeta - No es posible copiar una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta destino - Copiar liga - Copiar/ mover a la carpeta encriptada no se encuentra soportado por el momento. - Crear - No fue posible crear la carpeta - Nuevo - Carpeta nueva  - Cerrar sesión - Deseleccionar todo - Nueva versión disponible - No hay información disponible. - No hay una nueva versión disponible. - Cerrar - Este algoritmo de verificación no está disponible en tu teléfono - Deshabilitar - Descartar - Terminado - No fue posible descargar %1$s - La descarga falló, inicia sesión de nuevo - Falla en la descarga - El archivo ya no se encuentra disponible en el servidor - %1$d%% Descargando %2$s - Descargando… - %1$s descargado - Descargado - Aún no ha descargado - Imagen de fondo para el encabezado de la barra de navegación - Actividades - Todos los archivos - Favoritos - Inicio - Notificaciones - Disponibles sin conexión - Modificado recientemente - Compartido - Papelera - Cargas - Cerrar sesión - %1$s de %2$s usados - Carga automática - Hablar - Establecer como encriptado - Configurar la encripción - Desencriptando… - Cerrar - Por favor ingresa la contraseña para desencriptar la llave privada. - Esta carpeta no está vacía. - Generando nuevas llaves… - Las 12 palabras juntas hacer una contraseña muy fuerte, permitiéndote solo a ti ver y hacer uso de tus archivos encriptados. Por favor escríbelo y mantenlo en un lugar seguro. - La encripción de punta-a-punta está dehabilitada en el servidor. - Anota tu contraseña de encripción de 12 palabras - Contraseña… - Recuperando llaves… - Almacenando llaves - Configurar encripción - No se pudieron guardar las llaves, por favor vuelve a intentarlo. - Se presentó un error al desencriptar. ¿Contraseña equivocada? - %1$s no pudo ser copiado a la carpeta local %2$s - Error crítico: No se pueden realizar operaciones - Cuentas - Creado - Usuario - Trabajos en segundo plano - Descargar - Cargar - Agregar a tus favoritos - Hacer favorito - Borrar - Archivo - Carga algún contenido o sincroniza con tus dispositivos. - Aún no hay nada marcado como favorito - No hay archivos aquí - No hay resultados en esta carpeta - No hay resultados - No hay nada aquí. Puedes agregar una carpeta. - No se encontraron archivos modificados dentro de los últimos 7 días - ¿Tal vez está dentro de una carpeta diferente? - Aún no hay nada compartido - carpeta - Cargando… - No se cuenta con una aplicación que maneje este tipo de archivo. - hace algunos segundos - Verificando el destino… - Limpiando… - La carpeta de datos ya existe. Selecciona una de las siguientes: - La carpeta Nextcloud ya existe - Se necesita más espacio - No fue posible leer el archivo fuente - No fue posible escribir al archivo destino - Se presentó una falla durante la migración - Se presentó una falla al actualizar el índice - Moviendo los datos… - Terminado - Reemplazar - Preparando la migración… - Restaurando la configuración de la cuenta… - Guardando la configuración de la cuenta… - ¡No se puede leer la carpeta fuente! - Actualizando índice… - Usar - Aguardando sincronización completa… - Archivo no encontrado - El archivo no pudo ser sincronizado. Mostrando la última versión disponible. - Renombrar - Detalles - Descargar - Exportar - El archivo se renombró com %1$s durante la carga - Sincronizar - No se ha seleccionado algún archivo - El nombre del archivo no puede estar en blanco. - Caracteres inválidos: / \\ < > : \" | ? * - El nombre del archivo contiene al menos un carácter inválido - Nombre del archivo - Crear - No hay carpetas aquí - Seleccionar - Mover - No se te permite %s - para copiar este archivo - para crear este archivo - para borrar este archivo - para mover este archivo - para renombrar este archivo - Cargando archivos… - Algunos archivos no se pudieron mover - Local: %1$s - Mover todos - Remoto: %1$s - Se han movido todos los archivos - Adelante - Nombre - Contraseña - Cargar archivos sólo con el dispositivo conectado a la toma de corriente - /Cargas Automáticas - Invisible - Liga - Permitir carga y edición - Permitir carga - Vista de lista - No hay archivos en esta carpeta - No se encontró el archivo en el sistema de archivos local - No hay más carpetas. -  %1$s bitácora de aplicación Android - Iniciar sesión - Actualizar - Cargando... - Bitácoras - Borrar datos - Las configuraciones, base de datos y certificados del servidor de los datos de %1$s serán borrados permanentemente.\n\nLos archivos descargados se mantendrán sin cambios.\n\nEste proceso puede tomar algo de tiempo. - Administrar espacio - No fue posible leer el archivo de medios - El archivo de medios tiene una codificación incorrecta - El intento de reproducir el archivo sobrepasó el tiempo de espera - El reproductor de medios integrado es incapaz de reproducir el archivo de medios - Codec no soportado - Botón de avanzar rápido - Reproductor de música %1$s - Botón de reproducir o pausar - Botón de rebobinar - %1$s (reproduciendo) - Más reciente primero - Más antiguo primero - A - Z - Z - A - Más grande primero - Más pequeño primero - Más - Se presentó un error al intentar mover este archivo o carpeta - No es posible mover una carpeta dentro de una de sus sub carpetas - El archivo ya existe en la carpeta de destino - Se presentó un error durante la conexión al servidor - foto - Muestra el progreso de la descarga - Descargas - Muestra el progreso de la sincronización de archivos y los resultados - Sincronizar archivo - Progreso del reproductor de música - Reproductor de medios - Mostrar las notificaciones push enviadas por el servidor: Menciones en comentarios, recepción de nuevos elementos compartidos remotos, anuncios publicados por el administrador, etc. - Notificaciones push - Muestra el progreso de la carga - Cargas - No hay notificaciones - Por favor verifica más tarde. - 1 hora - Ingresa tu código de seguridad - El código de seguridad será solicitado cada vez que inicie la aplicación - Por favor ingresa tu código de seguridad - Los códigos de seguridad no son iguales - Por favor reingresa el código de seguridad - Elimina tu código de seguirdad - Código de seguirdad eliminado - Código de seguridad almacenado - Código de seguridad incorrecto - Se requieren permisos adicionales para cargar y descargar archivos. - No se encontró una aplicación con la cual establecer la imagen - 389 KB - marcadordeposición.txt - 12:23:45 - Este es un marcador de posición - 2012/05/18 12:23 PM - Borrado - mantenido en la carpeta original - movido a la carpeta de la aplicación - Agregar cuenta - No ha sido instalado ni F-Droid o Google Play - Acerca de - Detalles - Desarrollo - General - Más - Respaldo diario de tus contactos - GNU Licencia Pública General, versión 2 - Ayuda - Exención de responsabilidad - El archivo original será… - El archivo original será… - Usar sub carpetas - Licencia - Ninguno - Administrar cuentas - Mostrar archivos ocultos - Obtener el código fuente - Carpeta local - Carpeta remota - Tema - Oscuro - Claro - Vista previa de imagen - No existe un archivo local a previsualizar - No es posible mostrar la imagen - Disculpa - Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. - No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. - En este momento las notificaciones push no están disponibles. - ¡Prueba %1$s en tu dispositivo! - Quiero invitarte a usar %1$s en tu dispositivo\nDescárgalo aquí:%2$s - %1$s ó %2$s - Volver a cargar - Falla al eliminar - Eliminar - Eliminado - Ingresa un nombre nuevo - No se pudo renombrar la copia local, intenta con un nombre diferente - No fue posible renombrar, el nombre ya está ocupado - No se permite volver a compartir - No está permitido recompartir - No hay una imagen a escala disponible. ¿Descargar la imagen completa? - Seleccionar todo - Enviar - Ícono de botón de envío - Establecer Como - Usar imagen como - Compartir - Compartiendo - Compartir %1$s - %1$s (grupo) - Compartir liga - Debes ingresar una contraseña - para compartir este archivo - Ingresa una contraseña - Establecer fecha de expiración - Establecer contraseña - Puede editar - %1$s (remoto) - Configuraciones - Compartir liga - Compartir con… - compartido - Ordenar por - Ocultar - Detalles - La identidad del servidor no pudo ser verificada - País: - Nombre común: - Ubicación: - Organización: - Unidad organizacional: - Estado: - Huella digital: - Emitido por: - Firma: - Algoritmo: - Emitido para: - Validez: - De: - Para: - - No hay información acerca del error - No fue posible guardar el certificado - El certificado no puede ser mostrado. - ¿Quieres confiar en este certificado de todas formas? - - El certificado del servidor expiró - - El certificado del servidor no es de confianza - - Las fechas del certificado del servidor están en el futuro - - La URL no corresponde con el nombre del servidor en el certificado - Mensaje de estado - Predeterminado - Descargas - \"%1$s\" ha sido compartido contigo - %1$s ha compartido \"%2$s\" contigo - Se encontraron conflictos - La carpeta %1$s ya no existe - No fue posible sincronizar %1$s - Contraseña equivocada para %1$s - Falla en archivos mantenidos-en-sincronización. - Falla en la sincronización - La sincronización falló, inicia sesión de nuevo - Los contenidos del archivo ya han sido sincronizados - A partir de la versión 1.3.16, los archivos cargados desde este dispositivo serán copiados a la carpeta local %1$s para prevenir pérdidas de datos cuando un archivo se sincroniza entre múltiples cuentas. \n\nDerivado de este cambio, todos los archivos cargados con versiones anteriores de la aplicación fueron copiados a la carpeta %2$s. Sin embargo, un error evitó que se completara esta operación durante la sincronización de la cuenta. Puedes dejar el(los) archivo(s) como está(n) y eliminar la liga a %3$s, o bien, mover el(los) archivo(s) a la carpeta %1$s y mantener la liga a %4$s.\n\nSe enlistan a continuación los archivos locales así como los archivos remotos en %5$s a donde estaban ligados - Algunos archivos locales se han perdido - Obteniendo la versión más reciente del archivo. - Botón de status de sincronización - Archivos - Botón de configuración - Configurar carpetas - Las cargas instantáneas se han mejorado por completo. Re-configura tu carga automática desde el menú principal.\n\nDisfruta la nueva y mejorada carga automática. - Para %1$s - Tipo - Etiquetas - Probar la conexión del servidor - 30 minutos - Esta semana - Miniatura - Hoy - Papelera - No hay archivos borrados - Borrar permanentemente - Desestablecer encripción - para dejar de compartir este archivo - Accede a través de un dominio no de confianza. Por favor consulta la documentación para más información. - para actualizar este recurso compartido - Borrar cargas fallidas - Reintentar cargas fallidas - Cargar forma… - Cargar contenido de otras aplicaciones - Foto - Nombre de archivo - Tipo de archivo - Archivo de acceso directo a Google Maps(%s) - Archivo de acceso directo a Internet(%s) - Archivo snippet de texto(.txt) - Ingresa el nombre y el tipo del archivo a cargar - Cargar archivos - Botón de cargar elemento - Borrar - No hay cargas disponibles - Carga algún contenido o activa la carga automática - El espacio insuficiente evita que se copien los archivos seleccionados dentro de la carpeta %1$s. ¿Te gustaría moverlos ahí en su lugar? - Error desconocido - Seleccionar - Cargar - La información recibida no contiene un archivo válido. - %1$s no tiene permitido leer un archivo recibido - No fue posible copiar el archivo a una carpeta temporal. Por favor intenta enviarlo de nuevo. - El archivo seleccionado para cargar no fue encontrado. Por favor verifica si el archivo existe. - No hay un archivo a cargar - Nombre de la carpeta - Selecciona la carpeta de cargas - No fue posible cargar %1$s - La carga falló, inicia sesión de nuevo - Falla en la carga - Opción de carga: - Mover el archivo a la carpeta %1$s - Mantener el archivo en la carpeta de origen - Borrar el archivo de la carpeta de origen - para cargar a esta carpeta - %1$d%% Cargando %2$s - Cargando - %1$s cargado - Salir - Ajustes - No existen cuentas %1$s en tu dispositivo. Por favor configura una cuenta primero. - No se encontró la cuenta - Actual - Fallido/pendiente de reinicio - Cargado - Cancelado - Esperando para cargar - Cargas - Cancelado - Conflicto - Error de conexión - Error de credenciales - Error de archivo - Error de carpeta - No se encontró el archivo local - Error de permisos - El certificado del servidor no es de confianza - La aplicación ha sido terminada - Completado - Error desconocido - Virus detectado. ¡La carga no puede ser completada! - Esperando a salir de modo de conservación de energía - Aguardando la recarga del dispositivo - Usuario - Dirección - Correo electrónico - Número telefónico - Twitter - Sitio web - Error al extraer la información del usuario - No se ha establecido la información personal - Agrega tu nombre, una imagen y detalles de contacto en tu página de perfil. - Usuario - Descargar - Aguarda un momento… - Verificando credenciales almacenadas - Copiando el archivo desde almacenamiento privado - Actualizar - Imagen de qué es nuevo - Omitir - Nuevo en %1$s - Descargando archivos… - Enviar correo electrónico - diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 155fcdd..89d5304 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -93,7 +93,10 @@ %1$s no soporta cuentas múltiples No se ha podido establecer la conexión Cancelar inicio de sesión + Por favor, ingrese una dirección de servidor válida. + No fue posible obtener detalles para el inicio de sesión. Por favor, intente de nuevo. Ha habido un problema al procesar su petición de acceso. Por favor, vuelva a intentarlo más tarde. + No hay un navegador disponible para abrir este enlace. Por favor, complete el proceso de inicio de sesión en su navegador se mantiene en la carpeta original, pues es de solo lectura Subir sólo con conexión Wi-Fi sin límite de datos diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index 8ef8fcb..c589e29 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -93,7 +93,10 @@ %1$s ei toeta mitme konto kasutamist Ühenduse loomine ebaõnnestus Katkesta sisselogimine + Palun sisesta korrektne serveri aadress. + Sisselogimise üksikasjade laadimine ei õnnestu. Palun proovi uuesti. Sinu sisselogimispäringu töötlemisel tekkis viga. Palun proovi hiljem uuesti. + Selle lingi avamiseks ei leidu ühtegi brauserit. Palun lõpeta sisselogimisprotsess oma veebibrauseris säilitatud lugemisõigustega algkaustas Laadi üles ainult mahupiiranguta WiFi võrgus diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index dcf8a31..0919afa 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -93,7 +93,10 @@ %1$s non admite contas múltipes Non foi posíbel estabelecer a conexión Cancelar o acceso + Introduza un enderezo de servidor válido. + Non foi posíbel obter os datos do acceso. Ténteo de novo. Houbo un problema ao procesar a súa solicitude de acceso. Ténteo de novo máis tarde. + Non hai ningún navegador dispoñíbel para abrir esta ligazón. Complete o proceso de acceso no seu navegador mantense no cartafol orixinal, xa que é de só lectura Enviar só con wifi sen límite de datos @@ -581,7 +584,7 @@ Non é posíbel mover un cartafol cara a un dos seus propios subcartafoles Este ficheiro xa existe no cartafol de destino Non é posíbel mover o ficheiro. Comprobe que existe. - Enmudecer todas as notificacións + Silenciar todas as notificacións Produciuse un erro agardando a resposta do servidor. Non foi posíbel completar a operación. Produciuse un erro durante a conexión co servidor Produciuse un erro agardando a resposta do servidor. Non foi posíbel completar a operación. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ba283ab..fa9886a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -554,6 +554,7 @@ Impossibile spostare una cartella in una delle sue cartelle sottostanti Il file è già presente nella cartella di destinazione Impossibile spostare il file. Controlla che esista. + Muta tutte le notifiche Si è verificato un errore in attesa della risposta del server. Impossibile completare l\'operazione. Si è verificato un errore durante la connessione al server Si è verificato un errore in attesa della risposta del server. Impossibile completare l\'operazione. diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 2949d02..2ecc71d 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -641,6 +641,7 @@ %1$sを開く .txt 389 KB + プレースホルダー 12:23:45 最近編集したもの これはプレースホルダです @@ -784,6 +785,7 @@ 送信ボタンアイコン として設定され ノート + オンラインステータス 画像を使用する End-to-End 暗号化の設定中に、12語のランダムなニーモニックが表示されます。これは他のデバイスでファイルを開くために必要です。この情報はこのデバイスにのみ保存され、この画面で再表示することができます。安全な場所にメモしておいてください! 共有 @@ -1098,6 +1100,15 @@ %d 分 + + %d 秒前 + + + %d 分前 + + + %d 時間前 + %1$d 個のファイルを同期出ません (コンフリクト: %2$d) diff --git a/app/src/main/res/values-ka-rGE/strings.xml b/app/src/main/res/values-ka-rGE/strings.xml deleted file mode 100644 index 01b6281..0000000 --- a/app/src/main/res/values-ka-rGE/strings.xml +++ /dev/null @@ -1,506 +0,0 @@ - - - %1$s Android აპლიკაცია - ჩვენს შესახებ - ვერსია %1$s - ანგარიშის პიქტოგრამა - ანგარიში ვერ იქნა ნაპოვნი! - წარუმატებლად დასრულებული ატვირთების გასუფთავება - ცვლილება - გაგზავნა/გაზიარება - ბადისებური ხედი - ჩამონათვლისებური ხედი - ახალი დირექტორია - გახსნა - ძიება - დეტალები - გაგზავნა - პარამეტრები - განლაგება - აქტიური მომხმარებელი - აქტოვობა ჯერ არაა - გაგზავნა - გააგზავნეთ ბმული… - აქტივობა - ხელახალი გაზიარების დაშვება - ყველა - ანგარიში ამ მოწყობილობაზე ჯერ არაა დამატებული - მოწყობილობაზე ანგარიში ამ მომხმარებლით და სერვერით უკვე არსებობს - შეყვანილი მომხმარებელი არ ემთხვევა ამ ანგარიშის მომხმარებელს - სერვერის ამოუცნობი ვერსია - კავშირი დამყარდა - სერვერის მისამართი https://... - სერვერისთვის არასწორი მისამსამართის ფორმატი - სერვერი ვერ მოიძებნა - ქსელთან კავშირი არ არის - დაცული კავშირი არაა ხელმისაწვდომი. - არასწორი სერვერის კონფიგურაცია - წარუმატებელი ავტორიზაცია - წვდომა ავტორიზაციის სერვერის მიერ აიკრძალა - დაცული კავშირი გადამისამართდა დაუცველი მარშრუტით. - დაცული კავშირი დამყარდა - SSL ინიციალიზაცია ვერ მოხერხდა - SSL სერვერის იდენტობა ვერ დამოწმდა - კავშირის შემოწმება - სერვერმა პასუხი დააგვიანია - არასწორი მომხმარებელი ან პაროლი - წარმოიშვა უცნობი შეცდომა! - ჰოსტი ვერ მოიძებნა - %1$s არ უჭერს მხარს მრავალი ანგარიშის არსებობას - კავშირი ვერ დამყარდა - ატვირთვა მხოლოდ შეუზღუდავ Wi-Fi-ზე - /ავტომატური_ატვირთვა - შექმენით ახალი სპეციფიური დირექტორია - დააყენეთ სპეციფიური დირექტორია - ავატარი - დახურვა - გამორთვა - კალენდარი - სერტიპიკატის ჩატვირთვასთან პრობლემაა. - ჩექბოქსი - ტექსტი %1$s-იდან დაკოპირდა - ბუფერში გადასატანად ტექსტი მიღებული არაა - ბუფერში გადატანისას წარმოშვა მოულოდნელი შეცდომა - უკან - გაუქმება - სინქრონიზაციის შეჩერება - აირჩიეთ ანგარიში - დადასტურება - კოპირება - გაუქმება - შეცდომა - არასაკმარისი მეხსიერება - უცნობი შეცდომა - იტვირთება… - შემდეგი - არა - კარგი - მოლოდინშია - გაუქმება - გადარქმევა - შენახვა - გაგზავნა - გაზიარება - გამოტოვება - კი - დევ. ვერსიის შემოწმება - იმყოფება სისხლდენის ზღვარზე და მოიცავს ყველა დამდეგ ფუნქციას. შეიძლება გამოჩნდეს შეცდომები, ასეთი შემთხვევისას გთხოვთ გვამცნობოთ რეპორტით. - ფურუმი - დაეხმარეთ სხვებს - აქტიურად შეიტანეთ წვლილი - აპლიკაცია - გადათარგმნეთ - დეველოპმენტ რელიზის პირდაპირი ჩამოტვირთვა - მიიღეთ დეველოპმენტ რელიზი F-Droid აპლიკაციიდან - მიიღეთ რელიზ კანდიდატი F-Droid აპლიკაციიდან - მიიღეთ რელიზ კანდიდატი Google Play-დან - რელიზის კანდიდატი - ეს რელიზის კანდიდატი (რკ) დამდეგი რელიზის კადრია და მოსალოდნელია მისი სტაბილურობა. ამის დამოწმებაში დაგვეხმარება ინდივიდუალური მოწყობილობის შემოწმება. შემოწმებისთვის დარეგისტრირდით Play-ზე ან გადახედეთ \"ვერსიის\" სექციას F-Droid-ში. - იპოვეთ შეცდომა? უცნაურობა? - დაგვეხმარეთ შემოწმებით - დაამატეთ მოხსენიება GitHub-ზე - ნამდვილად გსურთ %1$s-ის გაუქმება? - დარწმუნებული ხართ, რომ გსურთ არჩეული ჩანაწერების გაუქმება? - ნამდვილად გსურთ %1$s-ის და შემცველობის გაუქმება? - დარწმუნებული ხართ, რომ გსურთ არჩეული ჩანაწერებისა და მათი შემცველობის გაუქმება? - მხოლოდ ლოკალური - მომხმარებლის პიქტოგრამა კონტაქტების სიისთვის - უფლებები არაა მოცემული, არაფერი არ იქნა იმპორტირებული. - კონტაქტები - ახალი ბექაფი - ბექაფი დაინიშნა და მალე დაიწყება - იმპორტი დაინიშნა და მალე დაიწყება - ფაილი ვერ იქნა ნაპოვნი - თქვენი ბოლო ბექაფი ვერ იქნა ნაპოვნი! - კოპირებულია კლიპბორდში - ამ ფაილისა თუ დირექტორიის კოპირებისას წარმოიშვა შეცდომა - დირექტორიის კოპირება მასში არსებულ დირექტორიაში შეუძლებელია - ფაილი დანიშნულ დირექტორიაში უკვე არსებობს - ბმულის კოპირება - ამჟამად კოპირება/გადატანა დაშიფრულ დირექტორიაში არაა მხარდაჭერილი. - შექმნა - დირექტორია ვერ შეიქმნა - ანგარიშის გაუქმება - ყველას წაშლა - ხელმისაწვდომია ახალი ვერსია - ახალი ვერსია არაა ხელმისაწვდომი. - დახურვა - თქვენს ტელეფონს ამ ალგორითმის დაიჯესტის მხარდაჭერა არ აქვს. - გამორთვა - დათხოვნა - დასრულებულია - ვერ ჩამოიტვირთა %1$s - ჩამოტვირთვა ვერ მოხერხდა, ახლიდან გაიარეთ ავტორიზაცია - ჩამოტვირთვა ვერ განხორციელდა - ფაილი სერვერზე ხელმისაწვდომი აღარაა - %1$d%% ჩამოტვირთვა %2$s - %1$s ჩამოტვირთლია - ჩამოტვირთულია - ჯერ ვერ ჩამოიტვირთა - მხაზველი დასათაურების ფონური სურათი - აქტივობები - ყველა ფაილი - რჩეულები - სახლი - შეტყობინებები - მოწყობილობაზე - ახლად შეცვლილი - გაზიარებული - გაუქმებული ფაილები - ატვირთვები - გასვლა - გამოყენებულია %1$s სულ %2$s-იდან  - ავტო-ატვირთვა - უფრო მეტი - ჩანაწერები - საუბარი - დააყენეთ როგორც დაშიფრული - შიფრაციის დაყენება - დახურვა - პირადი გასაღების დეშიფრაციისთვის გთხოვთ შეიყვანოთ პაროლი. - ეს დირექტორია არაა ცარიელი - 12 სიტყვა ერთად წარმოქმნის ძალიან ძლიერ პაროლს, იძლევა თქვენი დაშიფრული ფაილების ჩვენებისა და მოხმარების უფლებას. გთხოვთ ჩაიწეროთ და შეინახოთ დაცულ ადგილას. - შენიშნეთ თქვენი 12 სიტყვიანი შიფრაციის პაროლი - გასაღებების შენახვა - შიფრაციის დაყენება - გასაღებების შენახვა ვერ მოხერხდა, გთხოვთ სცადოთ ახლიდან. - შეცდომა დეშიფრაციისას. არასწორი პაროლი? - %1$s ვერ კოპირდება %2$s ლოკალურ დირექტორიაში - კრიტიკული შეცდომა: ოპერაციების განხორციელება შეუძლებელია - ანგარიშები - შექმნილია - მომხმარებელი - ფონური საქმეები - ჩამოტვირთვა - ატვირთვა - რჩეულებში დამატება - რჩეული - წაშლა - ფაილი - ატვირთეთ რამე ან გაუწიეთ თქვნს მოწყობილობას სინქრონიზაცია. - რჩეულებში ჯერ არაფერი დამატებულია - აქ ფაილები არაა - ამ დირექტორიაში შედეგები არაა - შედეგები არაა - აქ არაფერია. შეგიძლიათ დაამატოთ დირექტორია. - გასული 7 დღის განმავლობაში შეცვლილი ფაილ(ებ)ი ვერ იქნა ნაპოვნი - იქნებ სხვა დირექტორიაშია? - ჯერ არაფერი გაზიარებულა - დირექტორია - იტვირთება… - ამ ფაილთან სამუშაოდ არც ერთი აპლიკაცია არაა დაყანებული. - წამის წინ - მონაცემების დირექტორია უკვე არსებობს. აირჩიეთ ერთ-ერთი შემდეგიდან: - Nextcloud დირექტორია უკვე არსებობს - საჭიროა მეტი სივრცე - წყარო-ფაილის წაკითხვა ვერ მოხერხდა - სამიზნე ფაილში ჩაწერა ვერ მოხერხდა - მიგრაციისას წარმოიქმნა შეცდომა - ინდექსის განახლება ვერ მოხერხდა - დასრულებულია - ჩანაცვლება - წყარო-დირექტორია ვერ იკითხება! - მოხმარება - ფაილი ვერ იქნა ნაპოვნი - ფაილის სინქ ვერ მოხერხდა. ნაჩვენებია ბოლო ხელმისაწვდომი ვარიანტი. - სახელის შეცვლა - დეტალები - ჩამოტვირთვა - ექსპორტი - ატვირთვისას ფაილს სახელი შეეცვალა %1$s-ზე - სინქ - ფაილი არაა არჩეული - ფაილის სახელი ვერ იქნება ცარიელი - აკრძალული ნიშნები: / \\ < > : \" | ? * - ფაილის სახელი შეიცავს მინ. 1 არასწორ ნიშანს - ფაილის სახელი - შექმნა - აქ დირექტორიები არაა - აირჩიეთ - გადატანა - თქვენ არ გაქვთ უფლება, %s - რომ დააკოპიროთ ეს ფაილი - შექმნათ ეს ფაილი - გააუქმოთ ეს ფაილი - რომ გადაიტანოთ ეს ფაილი - შეუცვალოთ ამ ფაილს სახელი - ფაილების ატვირთვა... - გარკვეული ფაილების გადატანა ვერ მოხერხდა - ლოკალური: %1$s - ყველას გადატანა - დისტანციური: %1$s - ყველა ფაილი გადატანილია - წინ - 4 საათი - სახელი - პაროლი - ატვირთვა მხოლოდ დატენვისას - /მყისიერი_ატვირთვა - უჩინარი - ბმული - ატვირთვისა და ცვლილების უფლებების მინიჭება - ფაილის ჩაგდება (მხოლოდ ატვირთვა) - ჩამოწერილი მაკეტი - ამ დირექტორიაში ფაილები არაა. - ლოკალურ ფაილ-სისტემაში ფაილი ვერ მოიძებნა - მომდევნო დირექტორიები არაა. - %1$s Android აპლიკაციის ლოგები. - ლოგინი - განახლება - იტვირთება… - ლოგები - მონაცემების გასუფთავება -  %1$s-ის მონაცემებიდან პარამეტრები, მონაცემთა ბაზა და სერტიფიკატები სამუდამოდ წაიშლება.\n\nგადმოწერილი ფაილები დარჩება ხელუხლებელი.\n\nეს პროცესი გასტანს გარკვეულ დროს. - მოცულობის მენეჯმენტი - მედია ფაილის წაკითხვა ვერ მოხერხდა - მედია ფაილს გააჩნია არასწორი კოდირება - ფაილის დაკვრის მცდელობის დრო ამოიწურა - ჩაშენებული მედია დამკვრელი ვერ უკრავს მედია ფაილს - მედია კოდეკი მხარდაუჭერელია - სწრაფი გადახვევის ღილაკი - %1$s მუსიკის დამკვრელი - დაკვრის ან პაუზის ღილაკი - გადახვევის ღილაკი - %1$s (იკვრება) - ჯერ ახალი - ჯერ ძველი - ა - ჰ - ჰ - ა - ჯერ დიდი - ჯერ პატარა - მეტი - ამ ფაილისა თუ დირექტორიის გადატანისას წარმოიშვა შეცდომა - დირექტორიის გადატანა მასში არსებულ დირექტორიაში შეუძლებელია - ფაილი დანიშნულ დირექტორიაში უკვე არსებობს - სერვერთან დაკავშირებისას წარმოიქმნა შეცდომა - ფოტო - აჩვენებს გადმოწერის პროგრესს - ჩამოტვირთვები - აჩვენებს ფაილების სინქ. პროგრესს და შედეგებს - ფაილების სინქ. - მუსიკის დამკვრელის პროგრესი - მედია დამკვრელი - აჩვენებს ატვირთვის პროგრესს - ატვირთვები - შეტყობინებები არაა - გთხოვთ დაბრუნდეთ მოგვინაებით. - 1 საათი - შეიყვანეთ თქვენი პასკოდი - პასკოდი მოთხოვნილ იქნება აპლიკაციის ყოველი გაშვებისას - გთხოვთ შეიყვანოთ თქვენი პასკოდი - პასკოდები ერთმანეთს არ ემთხვევა - გთხოვთ თქვენი პასკოდი შეიყვანოთ ახლიდან - თქვენი პასკოდის გაუქმება - პასკოდი გაუქმდა - პასკოდი შენახულია - არასწორი პასკოდი - ფაილების ატვირთვისა და გადმოწერისათვის საჭიროა დამატებითი უფლებები. - სურათის დასაყენებლად ვერც ერთი აპლიკაცია ვერ იქნა ნაპოვნი - 389 კბ - ადგილი.txt - 12:23:45 - ეს არის ადგილი - 18/05/2012 12:23 - გაუქმებულია - დარჩა ორიგინალ დირექტორიაში - გადატანილია აპლიკაციის დირექტორიაში - ანგარიშის დამატება - არც Google Play-ა დაყენებული, არც F-Droid-ი - ჩვენს შესახებ - დეტალები - დევ. - ზოგადი - მეტი - კონტაქტების ყოველდღიური ბექაფი - GNU ზოგადი ღია ლიცენზია, ვერსია 2 - დახმარება - ბეჭედი - ქვე-დირექტორიების მოხმარება - ლიცენზია - არც ერთი - ანგარიშების მართვა - დამალული ფაილების ჩვენება - მიიღეთ კოდი - ლოკალური დირექტორია - დისტანციური დირექტორია - ვიზუალური თემა - მუქი - ღია - სურათის წინასწარი ჩვენება - წინასწარი ჩვენებისთვის ლოკალური ფაილი არაა - სურათის ჩვენება შეუძლებელია - ბოდიში - კონფიდენციალურობა - Google Play სერვისების მესაკუთრეობრივი დამოკიდებულებების გამო, ფუშ შეტყობინებები გათიშულია. - ვადაგასული აუტენტიფიკაციის გამო ფუშ შეტყობინებები არაა. გთხოვთ გაითვალისწინოთ თქვენი ანგარიშის თავიდან დამატება. - ფუშ შეტყობინებები ამჟამად ხელმიუწვდომელია. - სცდეთ %1$s თქვენს მოწყობილობაზე! - გიწვევთ გამოიყენოთ %1$s თქვენს მოწყობილობაზე.\nჩამოტვირთეთ აქედან: %2$s - %1$s ან %2$s - გადატვირთვა - გაუქმება ვერ მოხერხდა - გაუქმება - გაუქმდა - შეიყვანეთ ახალი სახელი - ლოკალური ასლის სახელის გადარქმევა ვერ მოხერხდა, სცადეთ სხვა სახელი - გადარქმევა შეუძლებელია, სახელი უკვე დაკავებულია - ხელახალი გაზიარება არაა დაშვებული - ხელახალი გაზიარება არაა ნებადართული - ზომა-შეცვლილი სურათი არაა ხელმისაწვდომი. გადმოვწეროთ მთლიანი სურათი? - ყველას მონიშვნა - გაგზავნა - დააყენეთ როგორც - გამოიყენეთ სურათი როგორც - გაზიარება - გაზიარება - %1$s-ის გაზიარება - %1$s (ჯგუფი) - ბმულის გაზიარება - უნდა შეიყვანოთ პაროლი - გააზიაროთ ეს ფაილი - შეიყვანეთ პაროლი - მიუთითეთ ვადის გასვლის დრო - პაროლის დაყენება - შეუძლია შეცვალოს - %1$s (დისტანციური) - პარამეტრები - ბმულის გაზიარება - გაზიარებული - დაასორტირე - დამალვა - დეტალები - სერვერის იდენტურობა ვერ დამოწმდა - ქვეყანა: - ზოგადი სახელი: - ადგილმდებარეობა: - ორგანიზაცია: - ორგანიზაციის განყოფილება: - შტატი: - თითის ანაბეჭდი: - გაცემულია მიერ: - ხელმოწერა: - ალგორითმი: - გაცემულია: - მოქმედების ვადა: - ვისგან: - ვის: - - ამ შეცდომაზე ინფორმაცია არაა - სერტიფიკატის შენახვა ვერ მოხერხდა - სერტიფიკატის ჩვენება შეუძლებელია. - გსურთ მაინც ენდოთ ამ სერტიფიკატს? - - სერვერის სერტიფიკატი ვადაგასულია - - სერვერის სერტიფიკატი არ არის სანდო - - სერვერის სერტიფიკატის თარიღები მომავალშია - - URL არ ემთხვევა სერტიფიკატში არსებულ ჰოსტნეიმს - საწყისი - ჩამოტვირთვები - გაგიზიარდათ \"%1$s\" - %1$s-სგან გაგიზიარდათ \"%2$s\" - წარმოიშვა კონფლიქტი - დირექტორია %1$s აღარ არსებობს - %1$s სინქ ვერ მოხერხდა - %1$s რესურსის არასწორი პაროლი - Kept-in-sync ფაილების შეცდომა - სინქრონიზაცია დასრუდლა წარუმატებლად - სინქ ვერ მოხერხდა, ახლიდან გაიარეთ ავტორიზაცია - ფაილების შემცველობა სინქრონიზირებულია - როდესაც ერთი ფაილი სინქრონიზირებულია რამოდენიმე ანგარიშთან, 1.3.16 ვერსიაში მონაცემების დაკარგვისგან თავის ასარიდებლად, ამ მოწყობილობით ატვირთული ფაილ(ებ)ი კოპირდება %1$s დირექტორიაში.\n\nამ ცვლილების გამო, აპლიკაციის ძველი ვერსიით ატვირთული ყველა ფაილი დაკოპირდა %2$s დირექტორიაში. თუმცა, შეცდომის გამო სინქრონიზაციისას მოხდა ამ ოპერაციის შეჩერება. შეგიძლიათ ფაილ(ებ)ი დატოვოთ ისე როგორც არის და წაშალოთ ბმული %3$s-სთან, ან გადაიტანოთ ფაილ(ებ)ი %1$s დირექტორიაში და შეინარჩუნოთ ბმული %4$s-ისთვის.\n\nქვემოთ ჩამოწერილია ლოკალური და %5$s-ში არსებული დისტანციური ფაილ(ებ)ი. - რამოდენიმე ლოკალური ფაილი გამორჩენილია - ამოღებულია ფაილის უახლესი ვერსია. - სინქ. სტატუსის ღილაკი - ფაილები - პარამეტრების ღილაკი - დირექტორიების კონფიგურაცია - მყისიერი ატვირთვა სრულიად გამოსწორდა. ავტო-ატვირთვას რეკონფიგურაცია გაუწიეთ მთავარი მენიუდან.\n\nისიამოვნეთ ახალი და გაუმჯობესებული ავტო-ატვირთვით. - %1$s-ისთვის - სახეობა - ტეგები - სერვერთან კავშირის შემოწმება - 30 წუთი - ამ კვირაში - მინიატურა - დღეს - გაუქმებული ფაილები - წაშლილი ფაილები ვერ მოიძებნა - სამუდამოდ წაშლა - შიფრაციის გაუქმება - შეწყვიტოთ ამ ფაილის გაზიარება - წვდომა არასანდო დომენით. დამატებითი ინფორმაციისთვის გთხოვთ იხილოთ დოკუმენტაცია. - განაახლოთ ეს გაზიარება - წარუმატებლად დასრულებული ატვირთების გასუფთავება - წარუმატებლად დასრულებული ატვირთების ხელახლა გაშვება - ფაილის სახელი - ფაილის სახეობა - Google Maps იარლიყის ფაილი(%s) - ინტერნეტ იარლიყის ფაილი(%s) - ტექსტ ფაილის ჩამონაჭერი(.txt) - ატვირთვისთვის შეიყვანეთ ფაილის სახელი და სახეობა - ფაილების ატვირთვა - ელემენტის ატვირთვის ქმედების ღილაკი - წაშლა - არც ერთი ატვირთვა არაა ხელმისაწვდომი. - ატვირთეთ რაიმე ან გაააქტიურეთ ავტო-ატვირთვა. - არასაკმარისი ადგილი აფერხებს არჩეული ფაილების კოპირებას %1$s დირექტორიაში. გსურთ სანაცვლოდ მათი გადატანა? - უცნობი შეცდომა - აირჩიეთ - ატვირთვა - მიღებული მონაცემები არ მოიცავდნენ სწორ ფაილს. - %1$s მომხმარებელს არ აქვს უფლება წაიკითხოს ფაილი. - ფაილის ასლი დროებით დირექტორიაში ვერ შეიქმნა. სცადეთ მისი ახლიდან გაგზავნა. - ატვირთვისთვის არჩეული ფაილი ვერ იქნა ნაპოვნი. გთხოვთ დაამოწმოთ ფაილის არსებობა. - ფაილი ატვირთვისთვის არაა - დირექტორიის სახელი - აირჩიეთ ატვირთვის დირექტორია - %1$s ვერ აიტვირთა - ატვირთვა ვერ მოხერხდა, ახლიდან გაიარეთ ავტორიზაცია - ატვირთვა ვერ განხორციელდა - ატვირთვის ოპციონი: - ფაილის საწყის დირექტორიაში დატოვება - ფაილის საწყისი დირექტორიიდან გაუქმება - ატვირთოთ ამ დირექტორიაში - %1$d%% ატვირთვა %2$s - იტვირთება... - ატვირთულია %1$s - გამოსვლა - დაყენება - ანგარიშები %1$s თქვენს მოწყობილობაზე არაა. გთხოვთ დააყენოთ ანგარიში. - ანგარიში ვერ მოიძებნა - მიმდინარე - ვერ მოხერხებული/მიმდინარე რესტარტი - ატვირთულია - უარყოფილია - ველოდებით ატვირთვას - ატვირთვები - უარყოფილია - კონფლიქტი - კავშირის პრობლემა - შეცდომა უფლებამოსილებებში - ფაილის შეცდომა - დირექტორიის შეცდომა - ლოკალური ფაილი ვერ იქნა ნაპოვნი - შეცდომა უფლებებში - სერვერის არასანდო სერტიფიკატი - აპლიკაცია შეჩერდა - დასრულებულია - უცნობი შეცდომა - ველოდებით ეკონომიური რეჟიმიდან გამოსვლას - გადახდის მოლოდინშია - მომხმარებელი - მისამართი - ელ-ფოსტა - ტელეფონის ნომერი - Twitter-ი - ვებ-საიტი - მოხმარებლის ინფორმაციის მიღებისას წარმოიშვა შეცდომა - პირადი ინფორმაციის კომპლექტი არაა - დაამატეთ სახელი, ფოტო და საკონტაქტო დეტალები თქვენს პროფილის გვერდზე. - მომხმარებლის სახელი - ჩამოტვირთვა - მოწმდება შენახული უფლებამოსილებანი - ფაილის კოპირება პირადი საცავიდან - განახლება - რა არის ახალი სურათი - გამოტოვება - ახალი %1$s-ში - ელ-წერილის გაგზავნა - diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b1b9c93..ad4280f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -128,7 +128,7 @@ Escolha um modelo e insira um nome de arquivo. Escolha qual arquivo manter! Escolher widget - Apagar + Limpar Erro ao limpar as notificações. Limpar status após Texto copiado de %1$s diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 0a01427..09bc76f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -93,7 +93,10 @@ %1$s не подржава вишеструке налоге Не могу да успоставим везу Откажи пријављивање + Унесите поново исправну адресу сервера. + Није успело преузимање детаља за пријаву. Молимо вас да покушате поново. Дошло је до проблема при обради вашег захтева за пријаву. Молимо вас да касније покушате поново. + Ниједан прегледач не може да отвори овај линк. Молимо вас да довршите процес пријаве у интернет прегледачу остављен у оригиналној фасцикли јер је само за читање Отпремај само на бежичним мрежама без ограничења diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3c1f174..713f6d6 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -814,6 +814,7 @@ Den här enheten är troligen inte ansluten till internet Sätt som Det gick inte att ange nedladdningsgräns. Kontrollera tillgängliga funktioner. + Ange meddelande Ange anteckning Online-status Använd bild som diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml deleted file mode 100644 index 5f4c5fc..0000000 --- a/app/src/main/res/values-v27/styles.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a7e1dda..a80fb6d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -93,7 +93,10 @@ %1$s 不支援多重帳號 無法建立連線 取消登入 + 請輸入有效的伺服器地址。 + 無法擷取登入詳細資訊。請再試一次。 處理您的登入請求時出現問題。請稍後再試。 + 沒有瀏覽器可以開啟此連結。 請在瀏覽器中完成登入流程 以唯讀模式保留在原本的資料夾 只在非計量收費的 Wi-Fi 上傳 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml deleted file mode 100644 index 15d52a5..0000000 --- a/app/src/main/res/values/arrays.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - doc - dot - docx - dotx - docm - dotm - xls - xlt - xla - xlsx - xltx - xlsm - xltm - xlam - xlsb - ppt - pot - pps - ppa - pptx - potx - ppsx - ppam - pptm - potm - ppsm - mdb - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e69937..bc542e1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -389,6 +389,9 @@ The account is not added on this device yet Access failed: %1$s + Unable to fetch login details. Please try again. + Please enter a valid server address. + No browser is available to open this link. Cancel Login Please complete login process in your browser There was an issue processing your login request. Please try again later. diff --git a/appscan/.gitignore b/appscan/.gitignore deleted file mode 100644 index 2b6a58e..0000000 --- a/appscan/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later -/build \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4dd29d2..39f8610 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ */ buildscript { ext { - androidLibraryVersion = "c6eac2850079c82b80a8b2a71d9a2cf353f118a5" + androidLibraryVersion = "2.22.0" androidCommonLibraryVersion = "0.28.0" androidPluginVersion = '8.13.0' androidxMediaVersion = "1.5.1" @@ -27,7 +27,7 @@ buildscript { mockitoKotlinVersion = "4.1.0" mockkVersion = "1.14.5" prismVersion = "2.0.0" - roomVersion = "2.8.0" + roomVersion = "2.7.2" workRuntime = "2.10.3" ciBuild = System.getenv("CI") == "true" diff --git a/drawable_resources/audio.svg b/drawable_resources/audio.svg deleted file mode 100644 index 7c9befc..0000000 --- a/drawable_resources/audio.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/drawable_resources/audio.svg.license b/drawable_resources/audio.svg.license deleted file mode 100644 index 44627ac..0000000 --- a/drawable_resources/audio.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/dashboard.svg b/drawable_resources/dashboard.svg deleted file mode 100644 index 655c57b..0000000 --- a/drawable_resources/dashboard.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - diff --git a/drawable_resources/dashboard.svg.license b/drawable_resources/dashboard.svg.license deleted file mode 100644 index 44627ac..0000000 --- a/drawable_resources/dashboard.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/ic_activity.svg b/drawable_resources/ic_activity.svg deleted file mode 100644 index e4800e5..0000000 --- a/drawable_resources/ic_activity.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/drawable_resources/ic_activity.svg.license b/drawable_resources/ic_activity.svg.license deleted file mode 100644 index 740613b..0000000 --- a/drawable_resources/ic_activity.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/ic_activity_light_grey.svg b/drawable_resources/ic_activity_light_grey.svg deleted file mode 100644 index 22bb5ca..0000000 --- a/drawable_resources/ic_activity_light_grey.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/drawable_resources/ic_activity_light_grey.svg.license b/drawable_resources/ic_activity_light_grey.svg.license deleted file mode 100644 index 740613b..0000000 --- a/drawable_resources/ic_activity_light_grey.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/ic_file.svg b/drawable_resources/ic_file.svg deleted file mode 100644 index d159f03..0000000 --- a/drawable_resources/ic_file.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/drawable_resources/ic_file.svg.license b/drawable_resources/ic_file.svg.license deleted file mode 100644 index 231b16c..0000000 --- a/drawable_resources/ic_file.svg.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2024 Andy Scherzinger -SPDX-FileCopyrightText: 2018-2024 Google LLC -SPDX-License-Identifier: Apache-2.0 diff --git a/drawable_resources/ic_home.svg b/drawable_resources/ic_home.svg deleted file mode 100644 index ec9eecc..0000000 --- a/drawable_resources/ic_home.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/drawable_resources/ic_home.svg.license b/drawable_resources/ic_home.svg.license deleted file mode 100644 index 740613b..0000000 --- a/drawable_resources/ic_home.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/ic_list_empty_home.svg b/drawable_resources/ic_list_empty_home.svg deleted file mode 100644 index aa11e74..0000000 --- a/drawable_resources/ic_list_empty_home.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/drawable_resources/ic_list_empty_home.svg.license b/drawable_resources/ic_list_empty_home.svg.license deleted file mode 100644 index 740613b..0000000 --- a/drawable_resources/ic_list_empty_home.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH, all rights reserved -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/drawable_resources/shared_via_link.svg b/drawable_resources/shared_via_link.svg deleted file mode 100644 index 51ea807..0000000 --- a/drawable_resources/shared_via_link.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/drawable_resources/shared_via_link.svg.license b/drawable_resources/shared_via_link.svg.license deleted file mode 100644 index a08772a..0000000 --- a/drawable_resources/shared_via_link.svg.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/CHANGELOG.md b/fastlane/CHANGELOG.md deleted file mode 100644 index 9500d40..0000000 --- a/fastlane/CHANGELOG.md +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/30290051.txt b/fastlane/metadata/android/en-US/changelogs/30290051.txt deleted file mode 100644 index f18c0c9..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290051.txt +++ /dev/null @@ -1,18 +0,0 @@ -# -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-FileCopyrightText: 2024 Tobias Kaminsky -# SPDX-License-Identifier: AGPL-3.0-or-later -# - -## 3.29.0 RC1 (April 17, 2024) - -- NC Assistant -- Client certificates -- Personal files view -- REUSE compliance -- Bugfixes - - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/89 diff --git a/fastlane/metadata/android/en-US/changelogs/30290090.txt b/fastlane/metadata/android/en-US/changelogs/30290090.txt deleted file mode 100644 index d2ba929..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290090.txt +++ /dev/null @@ -1,18 +0,0 @@ -# -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-FileCopyrightText: 2024 Tobias Kaminsky -# SPDX-License-Identifier: AGPL-3.0-or-later -# - -## 3.29.0 (April 24, 2024) - -- NC Assistant -- Client certificates -- Personal files view -- REUSE compliance -- Bugfixes - - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/89 diff --git a/fastlane/metadata/android/en-US/changelogs/30290151.txt b/fastlane/metadata/android/en-US/changelogs/30290151.txt deleted file mode 100644 index 83aa890..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290151.txt +++ /dev/null @@ -1,7 +0,0 @@ -## 3.29.1 RC1 (June 14, 2024) - -- Bugfixes - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/93 diff --git a/fastlane/metadata/android/en-US/changelogs/30290151.txt.license b/fastlane/metadata/android/en-US/changelogs/30290151.txt.license deleted file mode 100644 index d8ed7fc..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290151.txt.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/metadata/android/en-US/changelogs/30290190.txt b/fastlane/metadata/android/en-US/changelogs/30290190.txt deleted file mode 100644 index dd6898b..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290190.txt +++ /dev/null @@ -1,7 +0,0 @@ -## 3.29.1 (June 27, 2024) - -- Bugfixes - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/93 diff --git a/fastlane/metadata/android/en-US/changelogs/30290190.txt.license b/fastlane/metadata/android/en-US/changelogs/30290190.txt.license deleted file mode 100644 index d8ed7fc..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290190.txt.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/metadata/android/en-US/changelogs/30290290.txt b/fastlane/metadata/android/en-US/changelogs/30290290.txt deleted file mode 100644 index 7188b12..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290290.txt +++ /dev/null @@ -1,7 +0,0 @@ -## 3.29.2 (July 10, 2024) - -- Bugfixes - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/93 diff --git a/fastlane/metadata/android/en-US/changelogs/30290290.txt.license b/fastlane/metadata/android/en-US/changelogs/30290290.txt.license deleted file mode 100644 index d8ed7fc..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290290.txt.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/metadata/android/en-US/changelogs/30290351.txt b/fastlane/metadata/android/en-US/changelogs/30290351.txt deleted file mode 100644 index a7fb20a..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290351.txt +++ /dev/null @@ -1,7 +0,0 @@ -## 3.29.3 RC1 (August 9, 2024) - -- Bugfixes - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/93 diff --git a/fastlane/metadata/android/en-US/changelogs/30290351.txt.license b/fastlane/metadata/android/en-US/changelogs/30290351.txt.license deleted file mode 100644 index d8ed7fc..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290351.txt.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/metadata/android/en-US/changelogs/30290390.txt b/fastlane/metadata/android/en-US/changelogs/30290390.txt deleted file mode 100644 index c16054b..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290390.txt +++ /dev/null @@ -1,7 +0,0 @@ -## 3.29.3 (August 26, 2024) - -- Bugfixes - -Minimum: NC 16 Server, Android 7.0 Nougat - -For a full list, please see https://github.com/nextcloud/android/milestone/98 diff --git a/fastlane/metadata/android/en-US/changelogs/30290390.txt.license b/fastlane/metadata/android/en-US/changelogs/30290390.txt.license deleted file mode 100644 index d8ed7fc..0000000 --- a/fastlane/metadata/android/en-US/changelogs/30290390.txt.license +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/fastlane/metadata/android/en-US/changelogs/30340051.txt b/fastlane/metadata/android/en-US/changelogs/30340051.txt new file mode 100644 index 0000000..58d4fb8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340051.txt @@ -0,0 +1,9 @@ +## 3.34.0 RC1 (September 12, 2025) + +- Enhanced recommended file list +- Performance improvements +- Bugfixes + +Minimum: NC 18 Server, Android 8.1 Nougat + +For a full list, please see https://github.com/nextcloud/android/milestone/117 \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/30340051.txt.license b/fastlane/metadata/android/en-US/changelogs/30340051.txt.license new file mode 100644 index 0000000..3804756 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340051.txt.license @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/30340052.txt b/fastlane/metadata/android/en-US/changelogs/30340052.txt new file mode 100644 index 0000000..4288547 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340052.txt @@ -0,0 +1,9 @@ +## 3.34.0 RC2 (September 23, 2025) + +- Enhanced recommended file list +- Performance improvements +- Bugfixes + +Minimum: NC 18 Server, Android 8.1 Nougat + +For a full list, please see https://github.com/nextcloud/android/milestone/117 diff --git a/fastlane/metadata/android/en-US/changelogs/30340052.txt.license b/fastlane/metadata/android/en-US/changelogs/30340052.txt.license new file mode 100644 index 0000000..3804756 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340052.txt.license @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/30340090.txt b/fastlane/metadata/android/en-US/changelogs/30340090.txt new file mode 100644 index 0000000..bdaabe6 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340090.txt @@ -0,0 +1,7 @@ +## 3.34.0 (September 25, 2025) + +- Bugfixes + +Minimum: NC 18 Server, Android 8.1 Nougat + +For a full list, please see https://github.com/nextcloud/android/milestone/117 diff --git a/fastlane/metadata/android/en-US/changelogs/30340090.txt.license b/fastlane/metadata/android/en-US/changelogs/30340090.txt.license new file mode 100644 index 0000000..3804756 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/30340090.txt.license @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 56d9f27..8c5ed14 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,8 +32,8 @@ findsecbugsPluginVersion = "1.14.0" firebaseMessagingVersion = "25.0.0" flexboxVersion = "3.0.0" fragmentKtxVersion = "1.8.9" -glide = "5.0.5" -gsonVersion = "2.13.2" +glide = "5.0.4" +gsonVersion = "2.13.1" ical4jVersion = "3.2.19" jackrabbitWebdavVersion = "2.13.5" jsonVersion = "20250517" @@ -42,7 +42,7 @@ junitVersion = "1.3.0" juniversalchardetVersion = "2.5.0" legacySupportV4Version = "1.0.0" libraryVersion = "1.3.0" -lifecycleViewmodelKtxVersion = "2.9.4" +lifecycleViewmodelKtxVersion = "2.9.3" loaderviewlibraryVersion = "3.0.0" markwonVersion = "4.6.2" materialVersion = "1.13.0" @@ -55,25 +55,25 @@ orchestratorVersion = "1.6.1" orgJbundleUtilOsgiWrappedOrgApacheHttpClientVersion = "4.1.2" osmdroidAndroidVersion = "6.1.20" photoviewVersion = "2.3.0" -playServicesBaseVersion = "18.8.0" +playServicesBaseVersion = "18.7.2" prismVersion = "2.0.0" qrcodescannerVersion = "0.1.2.4" reviewKtxVersion = "2.0.2" -roomVersion = "2.8.0" +roomVersion = "2.7.2" screengrabVersion = "2.1.1" sectionedRecyclerviewVersion = "0.6.1" shotVersion = "6.1.0" splash-screen = "1.0.1" -composeBom = "2025.09.00" -spotbugsGradlePlugin = "6.4.2" +composeBom = "2025.08.01" +spotbugsGradlePlugin = "6.3.0" detektGradlePlugin = "1.23.8" spotless = "7.2.1" stateless4jVersion = "2.6.0" webkitVersion = "1.14.0" -workRuntime = "2.10.4" +workRuntime = "2.10.3" kotlin = "2.2.20" -ksp = "2.2.20-2.0.3" +ksp = "2.2.20-2.0.2" [libraries] diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 7cf76a5..ea57934 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -42,7 +42,6 @@ - @@ -1356,11 +1355,6 @@ - - - - - @@ -3451,7 +3445,7 @@ - + @@ -5259,11 +5253,6 @@ - - - - - @@ -15974,6 +15963,14 @@ + + + + + + + + @@ -16494,14 +16491,6 @@ - - - - - - - - @@ -16718,6 +16707,14 @@ + + + + + + + + @@ -29445,11 +29442,6 @@ - - - - - diff --git a/scripts/QA_keystore.jks b/scripts/QA_keystore.jks deleted file mode 100644 index 2b8fb9b..0000000 Binary files a/scripts/QA_keystore.jks and /dev/null differ diff --git a/scripts/QA_keystore.jks.license b/scripts/QA_keystore.jks.license deleted file mode 100644 index f070b8a..0000000 --- a/scripts/QA_keystore.jks.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/scripts/uploadArtifact.sh b/scripts/uploadArtifact.sh deleted file mode 100755 index 718e293..0000000 --- a/scripts/uploadArtifact.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -# -# SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-FileCopyrightText: 2019-2022 Tobias Kaminsky -# SPDX-License-Identifier: AGPL-3.0-or-later -# - -#1: LOG_USERNAME -#2: LOG_PASSWORD -#3: DRONE_BUILD_NUMBER -#4: DRONE_PULL_REQUEST - -DAV_URL=https://nextcloud.kaminsky.me/remote.php/webdav/android-artifacts/ -PUBLIC_URL=https://www.kaminsky.me/nc-dev/android-artifacts -USER=$1 -PASS=$2 -BUILD=$3 -PR=$4 - -source scripts/lib.sh - -if ! test -e app/build/outputs/apk/qa/debug/qa-debug-*.apk ; then - exit 1 -fi -echo "Uploaded artifact to $DAV_URL/$BUILD.apk" - -# delete all old comments, starting with "APK file:" -oldComments=$(curl_gh -X GET https://api.github.com/repos/nextcloud/android/issues/$PR/comments | jq '.[] | (.id |tostring) + "|" + (.user.login | test("github-actions") | tostring) + "|" + (.body | test("APK file:.*") | tostring)' | grep "true|true" | tr -d "\"" | cut -f1 -d"|") - -echo $oldComments | while read comment ; do - curl_gh -X DELETE https://api.github.com/repos/nextcloud/android/issues/comments/$comment -done - -sudo apt-get -y install qrencode - -qrencode -o $PR.png "$PUBLIC_URL/$BUILD.apk" - -curl -u $USER:$PASS -X PUT $DAV_URL/$BUILD.apk --upload-file app/build/outputs/apk/qa/debug/qa-debug-*.apk -curl -u $USER:$PASS -X PUT $DAV_URL/$BUILD.png --upload-file $PR.png -curl_gh -X POST https://api.github.com/repos/nextcloud/android/issues/$PR/comments -d "{ \"body\" : \"APK file: $PUBLIC_URL/$BUILD.apk

![qrcode]($PUBLIC_URL/$BUILD.png)

To test this change/fix you can simply download above APK file and install and test it in parallel to your existing Nextcloud app. \" }"