Quellcode durchsuchen

Merge pull request #9043 from nextcloud/updateScreenshotsTests

Update screenshots tests
Tobias Kaminsky vor 3 Jahren
Ursprung
Commit
a639e8441c
93 geänderte Dateien mit 471 neuen und 315 gelöschten Zeilen
  1. 36 36
      .github/workflows/command-rebase.yml
  2. 45 6
      .github/workflows/screenShotTest.yml
  3. 3 0
      build.gradle
  4. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty.png
  5. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty_light_white.png
  6. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error.png
  7. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error_light_white.png
  8. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_loading.png
  9. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png
  10. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities.png
  11. BIN
      screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities_light_white.png
  12. BIN
      screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png
  13. BIN
      screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png
  14. BIN
      screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open.png
  15. BIN
      screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open.png
  16. BIN
      screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error.png
  17. BIN
      screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open.png
  18. BIN
      screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png
  19. BIN
      screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_preferences.png
  20. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth.png
  21. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting.png
  22. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew.png
  23. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles.png
  24. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference.png
  25. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF.png
  26. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open.png
  27. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open.png
  28. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail.png
  29. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png
  30. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png
  31. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading.png
  32. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_black.png
  33. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_blue.png
  34. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_white.png
  35. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_light_black.png
  36. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_light_white.png
  37. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png
  38. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check.png
  39. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete.png
  40. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request.png
  41. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail.png
  42. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog.png
  43. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled.png
  44. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away.png
  45. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd.png
  46. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun.png
  47. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline.png
  48. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online.png
  49. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet.png
  50. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog.png
  51. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog.png
  52. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error.png
  53. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars.png
  54. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities.png
  55. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError.png
  56. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone.png
  57. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing.png
  58. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png
  59. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes.png
  60. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png
  61. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace.png
  62. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty.png
  63. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error.png
  64. BIN
      screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files.png
  65. 0 69
      src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java
  66. 188 0
      src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.kt
  67. 4 1
      src/androidTest/java/com/nextcloud/client/AuthenticatorActivityIT.java
  68. 0 4
      src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java
  69. 0 114
      src/androidTest/java/com/nextcloud/client/FileDisplayActivityScreenshotIT.java
  70. 116 0
      src/androidTest/java/com/nextcloud/client/FileDisplayActivityScreenshotIT.kt
  71. 0 4
      src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java
  72. 0 4
      src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java
  73. 0 4
      src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java
  74. 0 15
      src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt
  75. 3 0
      src/androidTest/java/com/owncloud/android/AbstractIT.java
  76. 0 6
      src/androidTest/java/com/owncloud/android/ScreenshotsIT.java
  77. 0 4
      src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java
  78. 0 5
      src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java
  79. 17 1
      src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java
  80. 0 12
      src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt
  81. 4 3
      src/androidTest/java/com/owncloud/android/ui/activity/PassCodeActivityIT.kt
  82. 20 5
      src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java
  83. 7 4
      src/androidTest/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragmentIT.kt
  84. 2 2
      src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt
  85. 0 5
      src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt
  86. 0 2
      src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt
  87. 0 5
      src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java
  88. 2 0
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  89. 14 1
      src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
  90. 3 1
      src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
  91. 1 1
      src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
  92. 1 0
      src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java
  93. 5 1
      src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

+ 36 - 36
.github/workflows/command-rebase.yml

@@ -6,41 +6,41 @@
 name: Rebase command
 
 on:
-  issue_comment:
-    types: created
+    issue_comment:
+        types: created
 
 jobs:
-  rebase:
-    runs-on: ubuntu-latest
-
-    # On pull requests and if the comment starts with `/rebase`
-    if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
-
-    steps:
-      - name: Add reaction on start
-        uses: peter-evans/create-or-update-comment@v1
-        with:
-          token: ${{ secrets.COMMAND_BOT_PAT }}
-          repository: ${{ github.event.repository.full_name }}
-          comment-id: ${{ github.event.comment.id }}
-          reaction-type: "+1"
-
-      - name: Checkout the latest code
-        uses: actions/checkout@v2
-        with:
-          fetch-depth: 0
-          token: ${{ secrets.COMMAND_BOT_PAT }}
-
-      - name: Automatic Rebase
-        uses: cirrus-actions/rebase@1.5
-        env:
-          GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
-
-      - name: Add reaction on failure
-        uses: peter-evans/create-or-update-comment@v1
-        if: failure()
-        with:
-          token: ${{ secrets.COMMAND_BOT_PAT }}
-          repository: ${{ github.event.repository.full_name }}
-          comment-id: ${{ github.event.comment.id }}
-          reaction-type: "-1"
+    rebase:
+        runs-on: ubuntu-latest
+
+        # On pull requests and if the comment starts with `/rebase`
+        if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
+
+        steps:
+            -   name: Add reaction on start
+                uses: peter-evans/create-or-update-comment@v1
+                with:
+                    token: ${{ secrets.COMMAND_BOT_PAT }}
+                    repository: ${{ github.event.repository.full_name }}
+                    comment-id: ${{ github.event.comment.id }}
+                    reaction-type: "+1"
+
+            -   name: Checkout the latest code
+                uses: actions/checkout@v2
+                with:
+                    fetch-depth: 0
+                    token: ${{ secrets.COMMAND_BOT_PAT }}
+
+            -   name: Automatic Rebase
+                uses: cirrus-actions/rebase@1.5
+                env:
+                    GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
+
+            -   name: Add reaction on failure
+                uses: peter-evans/create-or-update-comment@v1
+                if: failure()
+                with:
+                    token: ${{ secrets.COMMAND_BOT_PAT }}
+                    repository: ${{ github.event.repository.full_name }}
+                    comment-id: ${{ github.event.comment.id }}
+                    reaction-type: "-1"

+ 45 - 6
.github/workflows/screenShotTest.yml

@@ -12,25 +12,64 @@ jobs:
             matrix:
                 scheme: [ Light ]
                 color: [ blue ]
+                api-level: [ 27 ]
         steps:
             -   uses: actions/checkout@v2
-            -   name: set up JDK 11
-                uses: actions/setup-java@v2
+
+            -   name: Gradle cache
+                uses: actions/cache@v2
+                with:
+                    path: |
+                        ~/.gradle/caches
+                        ~/.gradle/wrapper
+                    key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
+            -   name: AVD cache
+                uses: actions/cache@v2
+                id: avd-cache
+                with:
+                    path: |
+                        ~/.android/avd/*
+                        ~/.android/adb*
+                    key: avd-${{ matrix.api-level }}
+
+            -   uses: actions/setup-java@v2
                 with:
                     distribution: "adopt"
                     java-version: 11
-            -   name: Build gplay
+
+            -   name: create AVD and generate snapshot for caching
+                if: steps.avd-cache.outputs.cache-hit != 'true'
+                uses: reactivecircus/android-emulator-runner@v2
+                with:
+                    api-level: ${{ matrix.api-level }}
+                    force-avd-creation: false
+                    arch: x86
+                    sdcard-path-or-size: 100M
+                    target: google_apis
+                    emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -skin 500x833
+                    script: echo "Generated AVD snapshot for caching."
+
+            -   name: Configure gradle daemon
                 run: |
                     mkdir -p $HOME/.gradle
                     echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > $HOME/.gradle/gradle.properties
-                    ./gradlew assembleGplayDebug
+                    echo "org.gradle.caching=true" >> $HOME/.gradle/gradle.properties
+
+            -   name: Build gplay
+                run: ./gradlew assembleGplayDebug
+
             -   name: Delete old comments
                 if: ${{ always() }}
                 run: scripts/deleteOldComments.sh "${{ matrix.color }}-${{ matrix.scheme }}" "Screenshot" ${{github.event.number}} ${{ secrets.GITHUB_TOKEN }}
-            -   name: run tests
+
+            -   name: Run screenshot tests
                 uses: reactivecircus/android-emulator-runner@v2
                 with:
-                    api-level: 27
+                    api-level: ${{ matrix.api-level }}
+                    force-avd-creation: false
+                    arch: x86
+                    sdcard-path-or-size: 100M
+                    target: google_apis
                     emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -skin 500x833
                     script: ./gradlew gplayDebugExecuteScreenshotTests -Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotTest -Pandroid.testInstrumentationRunnerArguments.COLOR=${{ matrix.color }} -Pandroid.testInstrumentationRunnerArguments.DARKMODE=${{ matrix.scheme }}
             -   name: upload failing results

+ 3 - 0
build.gradle

@@ -456,6 +456,9 @@ detekt {
 
 shot {
     showOnlyFailingTestsInReports = ciBuild
+    // CI environment renders some shadows slightly different from local VMs
+    // Add a 0.5% tolerance to account for that
+    tolerance = ciBuild ? 0.5: 0
 }
 
 jacoco {

BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_empty_light_white.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_error_light_white.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_loading.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities.png


BIN
screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_showActivities_light_white.png


BIN
screenshots/gplay/debug/com.nextcloud.client.AuthenticatorActivityIT_login.png


BIN
screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png


BIN
screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_open.png


BIN
screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_open.png


BIN
screenshots/gplay/debug/com.nextcloud.client.SettingsActivityIT_showMnemonic_Error.png


BIN
screenshots/gplay/debug/com.nextcloud.client.SyncedFoldersActivityIT_open.png


BIN
screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png


BIN
screenshots/gplay/debug/com.nextcloud.client.etm.EtmActivityTest_preferences.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepBoth.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepExisting.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_keepNew.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ConflictsResolveActivityIT_screenshotTextFiles.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openContactsPreference.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ContactsPreferenceActivityIT_openVCF.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.FolderPickerActivityIT_open.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_open.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.ManageAccountsActivityIT_userInfoDetail.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_black.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_blue.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_dark_white.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_light_black.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading_light_white.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_check.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_delete.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.PassCodeActivityIT_request.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.UserInfoActivityIT_fullUserInfoDetail.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialogWithStatusDisabled.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_away.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_dnd.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_fun.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_offline.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testAccountChooserDialog_online.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.DialogFragmentIT_testBottomSheet.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendFilesDialogTest_showDialog.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.SendShareDialogTest_showDialog.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.dialog.SetupEncryptionDialogFragmentIT_error.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.AvatarIT_showAvatars.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivities.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesError.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsActivitiesNone.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetailsSharing.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailSharingFragmentIT_listSharesFileAllShareTypes.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showRichWorkspace.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_empty.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_error.png


BIN
screenshots/gplay/debug/com.owncloud.android.ui.trashbin.TrashbinActivityIT_files.png


+ 0 - 69
src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java

@@ -1,69 +0,0 @@
-/*
- *
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * Copyright (C) 2020 Tobias Kaminsky
- * Copyright (C) 2020 Nextcloud GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package com.nextcloud.client;
-
-import android.view.View;
-
-import com.owncloud.android.AbstractIT;
-import com.owncloud.android.R;
-import com.owncloud.android.ui.activities.ActivitiesActivity;
-import com.owncloud.android.utils.ScreenshotTest;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-
-import androidx.test.espresso.contrib.DrawerActions;
-import androidx.test.espresso.intent.rule.IntentsTestRule;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-
-
-public class ActivitiesActivityIT extends AbstractIT {
-    @Rule public IntentsTestRule<ActivitiesActivity> activityRule = new IntentsTestRule<>(ActivitiesActivity.class,
-                                                                                          true,
-                                                                                          false);
-
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
-    @Test
-    @ScreenshotTest
-    public void openDrawer() {
-        ActivitiesActivity sut = activityRule.launchActivity(null);
-
-        shortSleep();
-
-        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
-
-        sut.runOnUiThread(() -> {
-            sut.getBinding().emptyList.emptyListView.setVisibility(View.VISIBLE);
-            sut.getBinding().list.setVisibility(View.INVISIBLE);
-        });
-
-        waitForIdleSync();
-
-        screenshot(sut);
-    }
-}

+ 188 - 0
src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.kt

@@ -0,0 +1,188 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2020 Tobias Kaminsky
+ * Copyright (C) 2020 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.client
+
+import android.view.View
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.contrib.DrawerActions
+import androidx.test.espresso.intent.rule.IntentsTestRule
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import com.facebook.testing.screenshot.Screenshot
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.R
+import com.owncloud.android.lib.resources.activities.model.Activity
+import com.owncloud.android.lib.resources.activities.model.RichElement
+import com.owncloud.android.lib.resources.activities.model.RichObject
+import com.owncloud.android.lib.resources.activities.models.PreviewObject
+import com.owncloud.android.lib.resources.status.OCCapability
+import com.owncloud.android.ui.activities.ActivitiesActivity
+import com.owncloud.android.utils.ScreenshotTest
+import org.junit.Rule
+import org.junit.Test
+import java.util.GregorianCalendar
+
+class ActivitiesActivityIT : AbstractIT() {
+    @get:Rule
+    var activityRule = IntentsTestRule(ActivitiesActivity::class.java, true, false)
+
+    @Test
+    @ScreenshotTest
+    fun openDrawer() {
+        val sut = activityRule.launchActivity(null)
+        shortSleep()
+        Espresso.onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        sut.runOnUiThread {
+            sut.binding.emptyList.emptyListView.visibility = View.VISIBLE
+            sut.binding.list.visibility = View.INVISIBLE
+        }
+        waitForIdleSync()
+        screenshot(sut)
+    }
+
+    @Test
+    @ScreenshotTest
+    fun loading() {
+        val sut: ActivitiesActivity = activityRule.launchActivity(null)
+
+        Screenshot.snapActivity(sut).record()
+    }
+
+    @Test
+    @ScreenshotTest
+    fun empty() {
+        val sut: ActivitiesActivity = activityRule.launchActivity(null)
+
+        sut.runOnUiThread {
+            sut.showActivities(mutableListOf(), nextcloudClient, -1)
+            sut.setProgressIndicatorState(false)
+        }
+
+        shortSleep()
+
+        screenshot(sut)
+    }
+
+    @Test
+    @ScreenshotTest
+    @SuppressWarnings("MagicNumber")
+    fun showActivities() {
+        val capability = OCCapability()
+        capability.versionMayor = 20
+        fileDataStorageManager.saveCapabilities(capability)
+
+        val sut: ActivitiesActivity = activityRule.launchActivity(null)
+
+        val date = GregorianCalendar()
+        date.set(2005, 4, 17, 10, 35, 30) // random date
+
+        val richObjectList: ArrayList<RichObject> = ArrayList()
+        richObjectList.add(RichObject("file", "abc", "text.txt", "/text.txt", "link", "tag"))
+        richObjectList.add(RichObject("file", "1", "text.txt", "/text.txt", "link", "tag"))
+
+        val previewObjectList1: ArrayList<PreviewObject> = ArrayList()
+        previewObjectList1.add(PreviewObject(1, "source", "link", true, "text/plain", "view", "test1.txt"))
+
+        val previewObjectList3: ArrayList<PreviewObject> = ArrayList()
+        previewObjectList3.add(PreviewObject(1, "source", "link", true, "image/jpg", "view", "test1.jpg"))
+
+        val activities = mutableListOf(
+            Activity(
+                1,
+                date.time,
+                date.time,
+                "files",
+                "file_changed",
+                "user1",
+                "user1",
+                "You changed text.txt",
+                "",
+                "icon",
+                "link",
+                "files",
+                "1",
+                "/text.txt",
+                previewObjectList1,
+                RichElement("", richObjectList)
+            ),
+            Activity(
+                1,
+                date.time,
+                date.time,
+                "dav",
+                "calendar_event",
+                "user1",
+                "user1",
+                "You have deleted calendar entry Appointment",
+                "",
+                "icon",
+                "link",
+                "calendar",
+                "35",
+                "",
+                ArrayList<PreviewObject>(),
+                RichElement()
+            ),
+            Activity(
+                1,
+                date.time,
+                date.time,
+                "files",
+                "file_changed",
+                "user1",
+                "user1",
+                "You changed image.jpg",
+                "",
+                "icon",
+                "link",
+                "files",
+                "1",
+                "/image.jpg",
+                previewObjectList3,
+                RichElement("", richObjectList)
+            )
+        )
+
+        sut.runOnUiThread {
+            sut.showActivities(activities as List<Any>?, nextcloudClient, -1)
+            sut.setProgressIndicatorState(false)
+        }
+
+        shortSleep()
+
+        screenshot(sut)
+    }
+
+    @Test
+    @ScreenshotTest
+    fun error() {
+        val sut: ActivitiesActivity = activityRule.launchActivity(null)
+
+        sut.runOnUiThread {
+            sut.showEmptyContent("Error", "Error! Please try again later!")
+            sut.setProgressIndicatorState(false)
+        }
+
+        shortSleep()
+
+        screenshot(sut)
+    }
+}

+ 4 - 1
src/androidTest/java/com/nextcloud/client/AuthenticatorActivityIT.java

@@ -20,6 +20,9 @@
 
 package com.nextcloud.client;
 
+import android.Manifest;
+import android.widget.TextView;
+
 import com.owncloud.android.AbstractIT;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
@@ -49,7 +52,7 @@ public class AuthenticatorActivityIT extends AbstractIT {
     @ScreenshotTest
     public void login() {
         AuthenticatorActivity sut = activityRule.launchActivity(null);
-        onView(withId(R.id.host_url_input)).perform(typeText(URL));
+        ((TextView) sut.findViewById(R.id.host_url_input)).setText(URL);
         sut.runOnUiThread(() -> sut.getAccountSetupBinding().hostUrlInput.clearFocus());
         screenshot(sut);
     }

+ 0 - 4
src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java

@@ -41,7 +41,6 @@ import org.greenrobot.eventbus.EventBus;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.contrib.DrawerActions;
@@ -60,9 +59,6 @@ public class FileDisplayActivityIT extends AbstractOnServerIT {
                                                                                            true,
                                                                                            false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     // @ScreenshotTest // todo run without real server
     public void showShares() {

+ 0 - 114
src/androidTest/java/com/nextcloud/client/FileDisplayActivityScreenshotIT.java

@@ -1,114 +0,0 @@
-/*
- *
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * Copyright (C) 2019 Tobias Kaminsky
- * Copyright (C) 2019 Nextcloud GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package com.nextcloud.client;
-
-import com.owncloud.android.AbstractIT;
-import com.owncloud.android.R;
-import com.owncloud.android.ui.activity.FileDisplayActivity;
-import com.owncloud.android.ui.fragment.OCFileListFragment;
-import com.owncloud.android.utils.ScreenshotTest;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-
-import androidx.test.espresso.contrib.DrawerActions;
-import androidx.test.espresso.contrib.NavigationViewActions;
-import androidx.test.espresso.intent.rule.IntentsTestRule;
-
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static org.junit.Assert.assertNotNull;
-
-public class FileDisplayActivityScreenshotIT extends AbstractIT {
-    @Rule public IntentsTestRule<FileDisplayActivity> activityRule = new IntentsTestRule<>(FileDisplayActivity.class,
-                                                                                           true,
-                                                                                           false);
-
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
-    @Test
-    @ScreenshotTest
-    public void open() {
-        FileDisplayActivity sut = activityRule.launchActivity(null);
-
-        sut.getListOfFilesFragment().setFabEnabled(false);
-        sut.getListOfFilesFragment().setEmptyListLoadingMessage();
-        sut.getListOfFilesFragment().setLoading(false);
-        waitForIdleSync();
-
-        shortSleep();
-
-        screenshot(sut);
-    }
-
-    //@Test
-    //@ScreenshotTest
-    public void showMediaThenAllFiles() {
-        FileDisplayActivity fileDisplayActivity = activityRule.launchActivity(null);
-        OCFileListFragment sut = fileDisplayActivity.getListOfFilesFragment();
-        assertNotNull(sut);
-
-        sut.setFabEnabled(false);
-        sut.setEmptyListLoadingMessage();
-        sut.setLoading(false);
-
-        // open drawer
-        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
-
-        // click "all files"
-        onView(withId(R.id.nav_view))
-            .perform(NavigationViewActions.navigateTo(R.id.nav_gallery));
-
-        // wait
-        shortSleep();
-
-        // click "all files"
-        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
-        onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.nav_all_files));
-
-        // then compare screenshot
-        shortSleep();
-        sut.setFabEnabled(false);
-        sut.setEmptyListLoadingMessage();
-        sut.setLoading(false);
-        shortSleep();
-        screenshot(fileDisplayActivity);
-    }
-
-    @Test
-    @ScreenshotTest
-    public void drawer() {
-        FileDisplayActivity sut = activityRule.launchActivity(null);
-
-        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
-
-        sut.getListOfFilesFragment().setFabEnabled(false);
-        sut.getListOfFilesFragment().setEmptyListLoadingMessage();
-        sut.getListOfFilesFragment().setLoading(false);
-        waitForIdleSync();
-
-        screenshot(sut);
-    }
-}

+ 116 - 0
src/androidTest/java/com/nextcloud/client/FileDisplayActivityScreenshotIT.kt

@@ -0,0 +1,116 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2019 Tobias Kaminsky
+ * Copyright (C) 2019 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.client
+
+import android.Manifest
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.contrib.DrawerActions
+import androidx.test.espresso.contrib.NavigationViewActions
+import androidx.test.espresso.intent.rule.IntentsTestRule
+import androidx.test.espresso.matcher.ViewMatchers
+import androidx.test.rule.GrantPermissionRule
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.R
+import com.owncloud.android.ui.activity.FileDisplayActivity
+import com.owncloud.android.utils.ScreenshotTest
+import org.junit.Assert
+import org.junit.Rule
+import org.junit.Test
+
+class FileDisplayActivityScreenshotIT : AbstractIT() {
+    @get:Rule
+    val activityRule = IntentsTestRule(
+        FileDisplayActivity::class.java,
+        true,
+        false
+    )
+
+    @get:Rule
+    val permissionRule = GrantPermissionRule.grant(
+        Manifest.permission.WRITE_EXTERNAL_STORAGE
+    )
+
+    @Test
+    @ScreenshotTest
+    fun open() {
+        val sut = activityRule.launchActivity(null)
+        sut.listOfFilesFragment!!.setFabEnabled(false)
+        sut.runOnUiThread {
+            sut.listOfFilesFragment!!.setEmptyListLoadingMessage()
+            sut.listOfFilesFragment!!.isLoading = false
+        }
+
+        shortSleep()
+        waitForIdleSync()
+        screenshot(sut)
+    }
+
+    // @Test
+    // @ScreenshotTest
+    fun showMediaThenAllFiles() {
+        val fileDisplayActivity = activityRule.launchActivity(null)
+        val sut = fileDisplayActivity.listOfFilesFragment
+        Assert.assertNotNull(sut)
+        sut!!.setFabEnabled(false)
+        sut.setEmptyListLoadingMessage()
+        sut.isLoading = false
+
+        // open drawer
+        Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
+
+        // click "all files"
+        Espresso.onView(ViewMatchers.withId(R.id.nav_view))
+            .perform(NavigationViewActions.navigateTo(R.id.nav_gallery))
+
+        // wait
+        shortSleep()
+
+        // click "all files"
+        Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        Espresso.onView(ViewMatchers.withId(R.id.nav_view))
+            .perform(NavigationViewActions.navigateTo(R.id.nav_all_files))
+
+        // then compare screenshot
+        shortSleep()
+        sut.setFabEnabled(false)
+        sut.setEmptyListLoadingMessage()
+        sut.isLoading = false
+        shortSleep()
+        screenshot(fileDisplayActivity)
+    }
+
+    @Test
+    @ScreenshotTest
+    fun drawer() {
+        val sut = activityRule.launchActivity(null)
+        Espresso.onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
+        sut.listOfFilesFragment!!.setFabEnabled(false)
+        sut.listOfFilesFragment!!.setEmptyListLoadingMessage()
+        sut.listOfFilesFragment!!.isLoading = false
+        sut.runOnUiThread {
+            sut.hideInfoBox()
+        }
+
+        waitForIdleSync()
+        screenshot(sut)
+    }
+}

+ 0 - 4
src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java

@@ -30,7 +30,6 @@ 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;
 
@@ -40,9 +39,6 @@ public class FirstRunActivityIT extends AbstractIT {
                                                                                         true,
                                                                                         false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     @ScreenshotTest
     public void open() {

+ 0 - 4
src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java

@@ -34,7 +34,6 @@ import com.owncloud.android.utils.ScreenshotTest;
 
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 
 import java.util.Objects;
 
@@ -48,9 +47,6 @@ public class SyncedFoldersActivityIT extends AbstractIT {
                                                                                              true,
                                                                                              false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     @ScreenshotTest
     public void open() {

+ 0 - 4
src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java

@@ -28,7 +28,6 @@ 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;
 
@@ -38,9 +37,6 @@ public class UploadListActivityActivityIT extends AbstractIT {
                                                                                           true,
                                                                                           false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     @ScreenshotTest
     public void openDrawer() {

+ 0 - 15
src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt

@@ -25,7 +25,6 @@ package com.nextcloud.client.etm
 import android.app.Activity
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.internal.runner.junit4.statement.UiThreadStatement
-import com.nextcloud.client.preferences.AppPreferencesImpl
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.utils.ScreenshotTest
 import org.junit.Rule
@@ -45,20 +44,6 @@ class EtmActivityTest : AbstractIT() {
         screenshot(sut)
     }
 
-    @Test
-    @ScreenshotTest
-    fun preferences() {
-        val sut: EtmActivity = activityRule.launchActivity(null)
-
-        UiThreadStatement.runOnUiThread {
-            val preferences = AppPreferencesImpl.fromContext(targetContext)
-            preferences.pushToken = "Push token"
-            sut.vm.onPageSelected(0)
-        }
-
-        screenshot(sut)
-    }
-
     @Test
     @ScreenshotTest
     fun accounts() {

+ 3 - 0
src/androidTest/java/com/owncloud/android/AbstractIT.java

@@ -24,6 +24,7 @@ import com.nextcloud.client.network.Connectivity;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.nextcloud.client.preferences.DarkMode;
+import com.nextcloud.common.NextcloudClient;
 import com.nextcloud.java.util.Optional;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
@@ -79,6 +80,7 @@ public abstract class AbstractIT {
     public final TestRule permissionRule = GrantStoragePermissionRule.grant();
 
     protected static OwnCloudClient client;
+    protected static NextcloudClient nextcloudClient;
     protected static Account account;
     protected static User user;
     protected static Context targetContext;
@@ -119,6 +121,7 @@ public abstract class AbstractIT {
             user = optionalUser.orElseThrow(IllegalAccessError::new);
 
             client = OwnCloudClientFactory.createOwnCloudClient(account, targetContext);
+            nextcloudClient = OwnCloudClientFactory.createNextcloudClient(account, targetContext);
         } catch (OperationCanceledException e) {
             e.printStackTrace();
         } catch (AuthenticatorException e) {

+ 0 - 6
src/androidTest/java/com/owncloud/android/ScreenshotsIT.java

@@ -1,6 +1,5 @@
 package com.owncloud.android;
 
-import com.nextcloud.client.GrantStoragePermissionRule;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.common.SyncOperation;
@@ -11,9 +10,7 @@ import com.owncloud.android.ui.activity.SyncedFoldersActivity;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
@@ -42,9 +39,6 @@ public class ScreenshotsIT extends AbstractOnServerIT {
     @ClassRule
     public static final LocaleTestRule localeTestRule = new LocaleTestRule();
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @BeforeClass
     public static void beforeScreenshot() {
         Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());

+ 0 - 4
src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java

@@ -27,7 +27,6 @@ import android.accounts.AccountManager;
 import android.net.Uri;
 import android.os.Bundle;
 
-import com.nextcloud.client.GrantStoragePermissionRule;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;
@@ -39,7 +38,6 @@ import com.owncloud.android.lib.common.accounts.AccountUtils;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 
 import androidx.test.espresso.intent.rule.IntentsTestRule;
 
@@ -55,8 +53,6 @@ public class DrawerActivityIT extends AbstractIT {
                                                                                            true,
                                                                                            false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
     private static Account account1;
     private static User user1;
     private static Account account2;

+ 0 - 5
src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java

@@ -6,7 +6,6 @@ import com.nextcloud.client.GrantStoragePermissionRule;
 import com.nextcloud.client.onboarding.WhatsNewActivity;
 import com.owncloud.android.AbstractIT;
 
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
 
@@ -17,10 +16,6 @@ import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
 import static androidx.test.runner.lifecycle.Stage.RESUMED;
 
 public class FileDisplayActivityTest extends AbstractIT {
-
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     public void testSetupToolbar() {
         try (ActivityScenario<FileDisplayActivity> scenario = ActivityScenario.launch(FileDisplayActivity.class)) {

+ 17 - 1
src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java

@@ -26,11 +26,15 @@ 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 {
@@ -55,7 +59,19 @@ public class ManageAccountsActivityIT extends AbstractIT {
         ManageAccountsActivity sut = activityRule.launchActivity(null);
 
         User user = sut.accountManager.getUser();
-        sut.onAccountClicked(user);
+
+        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();

+ 0 - 12
src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt

@@ -35,18 +35,6 @@ class NotificationsActivityIT : AbstractIT() {
     @get:Rule
     var activityRule = IntentsTestRule(NotificationsActivity::class.java, true, false)
 
-    @Test
-    @ScreenshotTest
-    fun loading() {
-        val sut: NotificationsActivity = activityRule.launchActivity(null)
-
-        waitForIdleSync()
-
-        sut.runOnUiThread { sut.setLoadingMessageEmpty() }
-
-        screenshot(sut)
-    }
-
     @Test
     @ScreenshotTest
     fun empty() {

+ 4 - 3
src/androidTest/java/com/owncloud/android/ui/activity/PassCodeActivityIT.kt

@@ -22,6 +22,7 @@
 package com.owncloud.android.ui.activity
 
 import android.content.Intent
+import androidx.test.espresso.Espresso
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.utils.ScreenshotTest
@@ -40,8 +41,8 @@ class PassCodeActivityIT : AbstractIT() {
         waitForIdleSync()
 
         sut.runOnUiThread { sut.binding.txt0.clearFocus() }
+        Espresso.closeSoftKeyboard()
 
-        shortSleep()
         screenshot(sut)
     }
 
@@ -53,8 +54,8 @@ class PassCodeActivityIT : AbstractIT() {
         waitForIdleSync()
 
         sut.runOnUiThread { sut.binding.txt0.clearFocus() }
+        Espresso.closeSoftKeyboard()
 
-        shortSleep()
         screenshot(sut)
     }
 
@@ -66,8 +67,8 @@ class PassCodeActivityIT : AbstractIT() {
         waitForIdleSync()
 
         sut.runOnUiThread { sut.binding.txt0.clearFocus() }
+        Espresso.closeSoftKeyboard()
 
-        shortSleep()
         screenshot(sut)
     }
 }

+ 20 - 5
src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java

@@ -84,6 +84,12 @@ public class DialogFragmentIT extends AbstractIT {
     @Rule public IntentsTestRule<FileDisplayActivity> 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) {
@@ -177,7 +183,7 @@ public class DialogFragmentIT extends AbstractIT {
     @Test
     @ScreenshotTest
     public void testAccountChooserDialog() throws AccountUtils.AccountNotFoundException {
-        FileDisplayActivity activity = activityRule.launchActivity(null);
+        FileDisplayActivity activity = getFileDisplayActivity();
         UserAccountManager userAccountManager = activity.getUserAccountManager();
         AccountManager accountManager = AccountManager.get(targetContext);
         for (Account account : accountManager.getAccountsByType(MainApp.getAccountType(targetContext))) {
@@ -211,13 +217,14 @@ public class DialogFragmentIT extends AbstractIT {
                                                                        new OwnCloudAccount(newAccount, targetContext),
                                                                        new Server(URI.create(SERVER_URL),
                                                                                   OwnCloudVersion.nextcloud_20)));
-        activity = showDialog(sut);
+        showDialog(activity, sut);
 
         activity.runOnUiThread(() -> sut.setStatus(new Status(StatusType.DND,
                                                               "Busy fixing 🐛…",
                                                               "",
                                                               -1),
                                                    targetContext));
+        waitForIdleSync();
         shortSleep();
         screenshot(sut, "dnd");
 
@@ -226,6 +233,7 @@ public class DialogFragmentIT extends AbstractIT {
                                                               "",
                                                               -1),
                                                    targetContext));
+        waitForIdleSync();
         shortSleep();
         screenshot(sut, "online");
 
@@ -234,14 +242,17 @@ public class DialogFragmentIT extends AbstractIT {
                                                               "🎉",
                                                               -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");
     }
@@ -249,7 +260,6 @@ public class DialogFragmentIT extends AbstractIT {
     @Test
     @ScreenshotTest
     public void testAccountChooserDialogWithStatusDisabled() throws AccountUtils.AccountNotFoundException {
-        FileDisplayActivity activity = activityRule.launchActivity(null);
         AccountManager accountManager = AccountManager.get(targetContext);
         for (Account account : accountManager.getAccounts()) {
             accountManager.removeAccountExplicitly(account);
@@ -261,7 +271,8 @@ public class DialogFragmentIT extends AbstractIT {
         accountManager.setUserData(newAccount, AccountUtils.Constants.KEY_USER_ID, "test");
         accountManager.setAuthToken(newAccount, AccountTypeUtils.getAuthTokenTypePass(newAccount.type), "password");
 
-        UserAccountManager userAccountManager = activity.getUserAccountManager();
+        FileDisplayActivity fda = getFileDisplayActivity();
+        UserAccountManager userAccountManager = fda.getUserAccountManager();
         User newUser = userAccountManager.getUser(newAccount.name).get();
         FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(newUser,
                                                                                    targetContext.getContentResolver());
@@ -276,7 +287,7 @@ public class DialogFragmentIT extends AbstractIT {
                                                                        new OwnCloudAccount(newAccount, targetContext),
                                                                        new Server(URI.create(SERVER_URL),
                                                                                   OwnCloudVersion.nextcloud_20)));
-        showDialog(sut);
+        showDialog(fda, sut);
     }
 
     @Test
@@ -438,6 +449,10 @@ public class DialogFragmentIT extends AbstractIT {
             sut = activityRule.launchActivity(intent);
         }
 
+        return showDialog(sut, dialog);
+    }
+
+    private FileDisplayActivity showDialog(FileDisplayActivity sut, DialogFragment dialog) {
         dialog.show(sut.getSupportFragmentManager(), "");
 
         getInstrumentation().waitForIdleSync();

+ 7 - 4
src/androidTest/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragmentIT.kt

@@ -23,7 +23,7 @@ package com.owncloud.android.ui.dialog
 
 import android.view.Window
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import androidx.test.internal.runner.junit4.statement.UiThreadStatement
+import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
 import com.nextcloud.client.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.utils.ScreenshotTest
@@ -60,9 +60,10 @@ class SetupEncryptionDialogFragmentIT : AbstractIT() {
             "accuse"
         )
 
-        sut.setMnemonic(keyWords)
+        shortSleep()
 
-        UiThreadStatement.runOnUiThread {
+        runOnUiThread {
+            sut.setMnemonic(keyWords)
             sut.showMnemonicInfo()
         }
 
@@ -80,7 +81,9 @@ class SetupEncryptionDialogFragmentIT : AbstractIT() {
 
         sut.show(activity.supportFragmentManager, "1")
 
-        UiThreadStatement.runOnUiThread {
+        shortSleep()
+
+        runOnUiThread {
             sut.errorSavingKeys()
         }
 

+ 2 - 2
src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt

@@ -137,8 +137,8 @@ class FileDetailFragmentStaticServerIT : AbstractIT() {
         screenshot(activity)
     }
 
-    @Test
-    @ScreenshotTest
+    // @Test
+    // @ScreenshotTest
     fun showDetailsActivitiesNone() {
         val activity = testActivityRule.launchActivity(null)
         val sut = FileDetailFragment.newInstance(file, user, 0)

+ 0 - 5
src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt

@@ -41,11 +41,6 @@ import org.junit.rules.TestRule
 import java.io.File
 
 class OCFileListFragmentIT : AbstractOnServerIT() {
-    companion object {
-        val SECOND_IN_MILLIS = 1000L
-        val RESULT_PER_PAGE = 50
-    }
-
     @get:Rule
     val activityRule = IntentsTestRule(FileDisplayActivity::class.java, true, false)
 

+ 0 - 2
src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt

@@ -77,8 +77,6 @@ class OCFileListFragmentStaticServerIT : AbstractIT() {
         screenshot(sut)
     }
 
-    @Test
-    @ScreenshotTest
     /**
      * Use same values as {@link FileDetailSharingFragmentIT listSharesFileAllShareTypes }
      */

+ 0 - 5
src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java

@@ -22,7 +22,6 @@
 
 package com.owncloud.android.ui.preview;
 
-import com.nextcloud.client.GrantStoragePermissionRule;
 import com.owncloud.android.AbstractIT;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
@@ -30,7 +29,6 @@ import com.owncloud.android.utils.MimeTypeUtil;
 
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 
 import java.io.File;
 import java.io.IOException;
@@ -42,9 +40,6 @@ public class PreviewTextFileFragmentTest extends AbstractIT {
                                                                                            true,
                                                                                            false);
 
-    @Rule
-    public final TestRule permissionRule = GrantStoragePermissionRule.grant();
-
     @Test
     // @ScreenshotTest // todo run without real server
     public void displaySimpleTextFile() throws IOException {

+ 2 - 0
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -26,6 +26,7 @@
 package com.owncloud.android.ui.activity;
 
 import android.accounts.AuthenticatorException;
+import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -1276,6 +1277,7 @@ public class FileDisplayActivity extends FileActivity
         /**
          * {@link BroadcastReceiver} to enable syncing feedback in UI
          */
+        @SuppressLint("VisibleForTests")
         @Override
         public void onReceive(Context context, Intent intent) {
             try {

+ 14 - 1
src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java

@@ -50,6 +50,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileUploader;
 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.services.OperationsService;
 import com.owncloud.android.ui.adapter.UserListAdapter;
@@ -71,12 +72,14 @@ 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;
 
@@ -468,13 +471,23 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
         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, Parcels.wrap(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)) {
+            if (accountManager.getUser().equals(user)) {
                 popup.getMenu().findItem(R.id.action_open_account).setVisible(false);
             }
             popup.setOnMenuItemClickListener(item -> {

+ 3 - 1
src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

@@ -48,6 +48,7 @@ import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 import com.owncloud.android.utils.theme.ThemeUtils;
 
 import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.widget.AppCompatSpinner;
 import androidx.appcompat.widget.Toolbar;
@@ -219,7 +220,8 @@ public abstract class ToolbarActivity extends BaseActivity {
     /**
      * Hides the toolbar's info box.
      */
-    protected final void hideInfoBox() {
+    @VisibleForTesting
+    public final void hideInfoBox() {
         mInfoBox.setVisibility(View.GONE);
     }
 

+ 1 - 1
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -272,7 +272,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
             Glide.with(context).using(new CustomGlideStreamLoader(currentAccountProvider.getUser(), clientFactory))
                 .load(previewObject.getSource())
                 .placeholder(placeholder)
-                .error(android.R.color.holo_red_light)
+                .error(placeholder)
                 .diskCacheStrategy(DiskCacheStrategy.NONE)
                 .skipMemoryCache(true)
                 .into(imageView);

+ 1 - 0
src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java

@@ -448,6 +448,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
 
         requireDialog().setTitle(R.string.common_error);
         textView.setText(R.string.end_to_end_encryption_unsuccessful);
+        passphraseTextView.setVisibility(View.GONE);
         positiveButton.setText(R.string.end_to_end_encryption_dialog_close);
         positiveButton.setVisibility(View.VISIBLE);
         positiveButton.setTextColor(ThemeColorUtils.primaryAccentColor(getContext()));

+ 5 - 1
src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

@@ -260,6 +260,9 @@ public class TrashbinActivity extends DrawerActivity implements
             trashbinListAdapter.setTrashbinFiles(trashbinFiles, true);
             binding.swipeContainingList.setRefreshing(false);
             binding.loadingContent.setVisibility(View.GONE);
+            binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete);
+            binding.emptyList.emptyListViewHeadline.setText(getString(R.string.trashbin_empty_headline));
+            binding.emptyList.emptyListViewText.setText(getString(R.string.trashbin_empty_message));
             binding.list.setVisibility(View.VISIBLE);
         }
     }
@@ -288,8 +291,9 @@ public class TrashbinActivity extends DrawerActivity implements
 
     @VisibleForTesting
     public void showInitialLoading() {
-        binding.loadingContent.setVisibility(View.VISIBLE);
+        binding.emptyList.emptyListView.setVisibility(View.GONE);
         binding.list.setVisibility(View.GONE);
+        binding.loadingContent.setVisibility(View.VISIBLE);
     }
 
     @VisibleForTesting