diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png new file mode 100644 index 0000000000..0e75397427 Binary files /dev/null and b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_empty.png differ diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png new file mode 100644 index 0000000000..405e21cdfc Binary files /dev/null and b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_error.png differ diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading.png b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading.png new file mode 100644 index 0000000000..8cd5338a09 Binary files /dev/null and b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_loading.png differ diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png new file mode 100644 index 0000000000..51e910857f Binary files /dev/null and b/screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png differ diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 79434a37bf..89df7437f0 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 83 warnings + Lint Report: 81 warnings diff --git a/scripts/androidScreenshotTest b/scripts/androidScreenshotTest index b4810b1137..25673116f0 100755 --- a/scripts/androidScreenshotTest +++ b/scripts/androidScreenshotTest @@ -8,13 +8,14 @@ if [ $# -lt 2 ]; then exit fi -sed -i s'#false#true#'g src/main/res/values/setup.xml - -emulator -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 & - cd src/androidTest/java -class=$(find | grep $2 | grep java | head -n1|sed s'/\//\./'g | sed s'#^\.\.##' | sed s'#\.java##') +class=$(find | grep $2 | grep -E "java$|kt$" | head -n1|sed s'/\//\./'g | sed s'#^\.\.##' | sed s'#\.java##'| sed s'#\.kt##') + +if [[ -z $class ]]; then + echo "Class not found!" + exit 1 +fi cd ../../../ @@ -28,6 +29,12 @@ if [ -e $3 ] ; then method="" else method="#$3" + + # check if method exists + if [[ $(grep -c $3 $(find | grep $2 | grep -E "java$|kt$" | head -n1)) -eq 0 ]]; then + echo "Method not found!" + exit 1 + fi fi ./gradlew gplayDebugExecuteScreenshotTests $record \ diff --git a/src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt b/src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt new file mode 100644 index 0000000000..1bbf2fdeaa --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt @@ -0,0 +1,131 @@ +/* + * + * 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 . + */ +package com.owncloud.android.ui.activity + +import androidx.test.espresso.intent.rule.IntentsTestRule +import com.facebook.testing.screenshot.Screenshot +import com.owncloud.android.AbstractIT +import com.owncloud.android.lib.resources.notifications.models.Action +import com.owncloud.android.lib.resources.notifications.models.Notification +import com.owncloud.android.lib.resources.notifications.models.RichObject +import com.owncloud.android.utils.ScreenshotTest +import org.junit.Rule +import org.junit.Test +import java.util.GregorianCalendar + +class NotificationsActivityIT : AbstractIT() { + @get:Rule + var activityRule = IntentsTestRule(NotificationsActivity::class.java, true, false) + + @Test + @ScreenshotTest + fun loading() { + val sut: NotificationsActivity = activityRule.launchActivity(null) + + Screenshot.snapActivity(sut).record() + } + + @Test + @ScreenshotTest + fun empty() { + val sut: NotificationsActivity = activityRule.launchActivity(null) + + sut.runOnUiThread { sut.populateList(ArrayList()) } + + shortSleep() + + Screenshot.snapActivity(sut).record() + } + + @Test + @ScreenshotTest + fun showNotifications() { + val sut: NotificationsActivity = activityRule.launchActivity(null) + + val date = GregorianCalendar() + date.set(2005, 4, 17, 10, 35, 30) + + val notifications = ArrayList() + notifications.add( + Notification( + 1, + "files", + "user", + date.time, + "objectType", + "objectId", + "App recommendation: Tasks", + "SubjectRich", + HashMap(), + "Sync tasks from various devices with your Nextcloud and edit them online.", + "MessageRich", + HashMap(), + "link", + "icon", + ArrayList() + ) + ) + + val actions = ArrayList() + actions.add(Action("Send usage", "link", "url", true)) + actions.add(Action("Not now", "link", "url", false)) + + notifications.add( + Notification( + 1, + "files", + "user", + date.time, + "objectType", + "objectId", + "Help improve Nextcloud", + "SubjectRich", + HashMap(), + "Do you want to help us to improve Nextcloud" + + " by providing some anonymize data about your setup and usage?", + "MessageRich", + HashMap(), + "link", + "icon", + actions + ) + ) + + sut.runOnUiThread { sut.populateList(notifications) } + + shortSleep() + + Screenshot.snapActivity(sut).record() + } + + @Test + @ScreenshotTest + fun error() { + val sut: NotificationsActivity = activityRule.launchActivity(null) + + shortSleep() + + sut.runOnUiThread { sut.setEmptyContent("Error", "Error! Please try again later!") } + + Screenshot.snapActivity(sut).record() + } +} diff --git a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java index 4d6cd415cd..ead43be630 100644 --- a/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java @@ -60,6 +60,7 @@ import java.util.List; import javax.inject.Inject; +import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -239,7 +240,7 @@ public class NotificationsActivity extends FileActivity implements Notifications private void setupContent() { emptyContentIcon.setImageResource(R.drawable.ic_notification); emptyContentProgressBar.getIndeterminateDrawable().setColorFilter(ThemeUtils.primaryAccentColor(this), - PorterDuff.Mode.SRC_IN); + PorterDuff.Mode.SRC_IN); setLoadingMessage(); LinearLayoutManager layoutManager = new LinearLayoutManager(this); @@ -249,8 +250,18 @@ public class NotificationsActivity extends FileActivity implements Notifications fetchAndSetData(); } - private void populateList(List notifications) { + @VisibleForTesting + public void populateList(List notifications) { adapter.setNotificationItems(notifications); + + if (notifications.size() > 0) { + swipeEmptyListRefreshLayout.setVisibility(View.GONE); + swipeListRefreshLayout.setVisibility(View.VISIBLE); + } else { + setEmptyContent(noResultsHeadline, noResultsMessage); + swipeListRefreshLayout.setVisibility(View.GONE); + swipeEmptyListRefreshLayout.setVisibility(View.VISIBLE); + } } private void fetchAndSetData() { @@ -275,17 +286,7 @@ public class NotificationsActivity extends FileActivity implements Notifications if (result.isSuccess() && result.getNotificationData() != null) { final List notifications = result.getNotificationData(); - runOnUiThread(() -> { - populateList(notifications); - if (notifications.size() > 0) { - swipeEmptyListRefreshLayout.setVisibility(View.GONE); - swipeListRefreshLayout.setVisibility(View.VISIBLE); - } else { - setEmptyContent(noResultsHeadline, noResultsMessage); - swipeListRefreshLayout.setVisibility(View.GONE); - swipeEmptyListRefreshLayout.setVisibility(View.VISIBLE); - } - }); + runOnUiThread(() -> populateList(notifications)); } else { Log_OC.d(TAG, result.getLogMessage()); // show error @@ -344,7 +345,8 @@ public class NotificationsActivity extends FileActivity implements Notifications emptyContentProgressBar.setVisibility(View.VISIBLE); } - private void setEmptyContent(String headline, String message) { + @VisibleForTesting + public void setEmptyContent(String headline, String message) { if (emptyContentContainer != null && emptyContentMessage != null) { emptyContentHeadline.setText(headline); emptyContentMessage.setText(message); diff --git a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java index 8a5eb7b8f5..add6f08053 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -20,8 +20,10 @@ package com.owncloud.android.ui.adapter; import android.content.Intent; -import android.content.res.ColorStateList; +import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.PictureDrawable; import android.net.Uri; @@ -136,11 +138,17 @@ public class NotificationListAdapter extends RecyclerView.Adapter new DeleteNotificationTask(client, notification, holder, @@ -154,8 +162,13 @@ public class NotificationListAdapter extends RecyclerView.Adapter { setButtonEnabled(holder, false); diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 5cf01dd4ab..72b153b61b 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -655,13 +655,13 @@ public class PreviewImageFragment extends FileFragment implements Injectable { } private LayerDrawable generateCheckerboardLayeredDrawable(LoadImage result, Bitmap bitmap) { - Resources r = getResources(); + Resources resources = getResources(); Drawable[] layers = new Drawable[2]; - layers[0] = r.getDrawable(R.color.bg_default); + layers[0] = ResourcesCompat.getDrawable(resources, R.color.bg_default, null); Drawable bitmapDrawable; if (MIME_TYPE_PNG.equalsIgnoreCase(result.ocFile.getMimeType())) { - bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + 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())) { @@ -671,7 +671,7 @@ public class PreviewImageFragment extends FileFragment implements Injectable { bitmapDrawable = result.drawable; } } else { - bitmapDrawable = new BitmapDrawable(getResources(), bitmap); + bitmapDrawable = new BitmapDrawable(resources, bitmap); } layers[1] = bitmapDrawable; diff --git a/src/main/res/drawable/round_bgnd_icons.xml b/src/main/res/drawable/round_bgnd_icons.xml deleted file mode 100644 index f4f807528d..0000000000 --- a/src/main/res/drawable/round_bgnd_icons.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/src/main/res/layout/notification_list_item.xml b/src/main/res/layout/notification_list_item.xml index 0cf57b9ce3..55b2394f1a 100644 --- a/src/main/res/layout/notification_list_item.xml +++ b/src/main/res/layout/notification_list_item.xml @@ -38,7 +38,6 @@ android:layout_marginEnd="@dimen/notification_icon_layout_right_end_margin" android:padding="2dp" android:alpha="0.5" - android:background="@drawable/round_bgnd_icons" android:contentDescription="@string/notification_icon" android:src="@drawable/ic_notification" /> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index c48693fe8a..d493407a43 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -61,13 +61,11 @@ Follow system Theme - Try %1$s on your device! I want to invite you to use %1$s on your device.\nDownload here: %2$s %1$s or %2$s Server address https://… - Username Files Upload Choose