Skip to content

Commit 52fe81b

Browse files
committed
Updated empty state view icons for light and dark mode with test cases.
1 parent 2e55cc5 commit 52fe81b

34 files changed

+550
-81
lines changed
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package com.nmc.android.ui
2+
3+
import androidx.test.core.app.ActivityScenario
4+
import androidx.test.espresso.Espresso.onView
5+
import androidx.test.espresso.assertion.ViewAssertions.matches
6+
import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
7+
import androidx.test.espresso.matcher.ViewMatchers.withId
8+
import androidx.test.espresso.matcher.ViewMatchers.withText
9+
import androidx.test.ext.junit.rules.ActivityScenarioRule
10+
import com.nextcloud.test.TestActivity
11+
import com.owncloud.android.AbstractIT
12+
import com.owncloud.android.R
13+
import com.owncloud.android.lib.resources.notifications.models.Notification
14+
import com.owncloud.android.ui.activity.FolderPickerActivity
15+
import com.owncloud.android.ui.activity.NotificationsActivity
16+
import com.owncloud.android.ui.activity.ReceiveExternalFilesActivity
17+
import com.owncloud.android.ui.activity.UploadListActivity
18+
import com.owncloud.android.ui.fragment.GalleryFragment
19+
import com.owncloud.android.ui.fragment.OCFileListFragment
20+
import com.owncloud.android.ui.fragment.SearchType
21+
import com.owncloud.android.ui.trashbin.TrashbinActivity
22+
import org.junit.Rule
23+
import org.junit.Test
24+
25+
/**
26+
* test to validate empty state on different screens
27+
*/
28+
class EmptyStateViewIT : AbstractIT() {
29+
30+
@get:Rule
31+
val testActivityRule = ActivityScenarioRule(TestActivity::class.java)
32+
33+
@Test
34+
fun validate_emptyState_NoSearch() {
35+
loadOCFileListFragmentWithSearchType(SearchType.NO_SEARCH)
36+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
37+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
38+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No files here")))
39+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
40+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Upload some content or sync with your devices.")))
41+
}
42+
43+
@Test
44+
fun validate_emptyState_FileSearch() {
45+
loadOCFileListFragmentWithSearchType(SearchType.FILE_SEARCH)
46+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
47+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
48+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No results")))
49+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
50+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Search for a file (at least 2 characters)")))
51+
}
52+
53+
@Test
54+
fun validate_emptyState_FavoriteSearch() {
55+
loadOCFileListFragmentWithSearchType(SearchType.FAVORITE_SEARCH)
56+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
57+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
58+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("Nothing favorited yet")))
59+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
60+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Files and folders you mark as favorites will show up here.")))
61+
}
62+
63+
@Test
64+
fun validate_emptyState_RecentSearch() {
65+
loadOCFileListFragmentWithSearchType(SearchType.RECENTLY_MODIFIED_SEARCH)
66+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
67+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
68+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No results")))
69+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
70+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Found no files modified within the last 7 days")))
71+
}
72+
73+
@Test
74+
fun validate_emptyState_SharedSearch() {
75+
loadOCFileListFragmentWithSearchType(SearchType.SHARED_FILTER)
76+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
77+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
78+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("Nothing shared yet")))
79+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
80+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Files and folders you share will show up here.")))
81+
}
82+
83+
@Test
84+
fun validate_emptyState_GallerySearch() {
85+
loadGalleryFragment()
86+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
87+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
88+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No files here")))
89+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
90+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("No photos or videos uploaded yet")))
91+
}
92+
93+
@Test
94+
fun validate_emptyState_Notification() {
95+
val activityScenario = ActivityScenario.launch(NotificationsActivity::class.java)
96+
waitForIdleSync()
97+
activityScenario.onActivity {
98+
it.runOnUiThread { it.populateList(ArrayList<Notification>()) }
99+
}
100+
101+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
102+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
103+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No notifications")))
104+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
105+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Please check back later.")))
106+
}
107+
108+
@Test
109+
fun validate_errorState_Trashbin() {
110+
ActivityScenario.launch(TrashbinActivity::class.java)
111+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
112+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
113+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("Error")))
114+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
115+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Loading trash bin failed!")))
116+
}
117+
118+
@Test
119+
fun validate_emptyState_Trashbin() {
120+
val activityScenario = ActivityScenario.launch(TrashbinActivity::class.java)
121+
activityScenario.onActivity {
122+
it.showTrashbinFolder(emptyList())
123+
}
124+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
125+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
126+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No deleted files")))
127+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
128+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("You will be able to recover deleted files from here.")))
129+
}
130+
131+
@Test
132+
fun validate_emptyState_FolderPicker() {
133+
ActivityScenario.launch(FolderPickerActivity::class.java)
134+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
135+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
136+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No files here")))
137+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
138+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Upload some content or sync with your devices.")))
139+
}
140+
141+
@Test
142+
fun validate_emptyState_ReceivedExternalFiles() {
143+
ActivityScenario.launch(ReceiveExternalFilesActivity::class.java)
144+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
145+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
146+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No files here")))
147+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
148+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("")))
149+
}
150+
151+
@Test
152+
fun validate_emptyState_UploadList() {
153+
ActivityScenario.launch(UploadListActivity::class.java)
154+
onView(withId(R.id.empty_list_icon)).check(matches(isCompletelyDisplayed()))
155+
onView(withId(R.id.empty_list_view_headline)).check(matches(isCompletelyDisplayed()))
156+
onView(withId(R.id.empty_list_view_headline)).check(matches(withText("No uploads available")))
157+
onView(withId(R.id.empty_list_view_text)).check(matches(isCompletelyDisplayed()))
158+
onView(withId(R.id.empty_list_view_text)).check(matches(withText("Upload some content or activate auto upload.")))
159+
}
160+
161+
private fun loadOCFileListFragmentWithSearchType(searchType: SearchType) {
162+
testActivityRule.scenario.onActivity {
163+
it.addFragment(OCFileListFragment())
164+
}
165+
166+
waitForIdleSync()
167+
168+
testActivityRule.scenario.onActivity {
169+
val fragment = (it.fragment as OCFileListFragment)
170+
fragment.setEmptyListMessage(searchType)
171+
}
172+
}
173+
174+
private fun loadGalleryFragment() {
175+
testActivityRule.scenario.onActivity {
176+
it.addFragment(GalleryFragment())
177+
}
178+
179+
waitForIdleSync()
180+
181+
testActivityRule.scenario.onActivity {
182+
val fragment = (it.fragment as GalleryFragment)
183+
fragment.setEmptyListMessage(SearchType.GALLERY_SEARCH)
184+
}
185+
}
186+
}

app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ open class FolderPickerActivity :
171171
listFragment.setMessageForEmptyList(
172172
R.string.folder_list_empty_headline,
173173
R.string.file_list_empty_moving,
174-
R.drawable.ic_list_empty_create_folder,
174+
R.drawable.ic_list_empty_folder,
175175
true
176176
)
177177
} else {

app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public void closeDrawer() {
192192
* sets up the UI elements and loads all notification items.
193193
*/
194194
private void setupContent() {
195-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification);
195+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification);
196196
setLoadingMessageEmpty();
197197

198198
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
@@ -314,7 +314,7 @@ public void setEmptyContent(String headline, String message) {
314314

315315
binding.emptyList.emptyListViewHeadline.setText(headline);
316316
binding.emptyList.emptyListViewText.setText(message);
317-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification);
317+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification);
318318

319319
binding.emptyList.emptyListViewText.setVisibility(View.VISIBLE);
320320
binding.emptyList.emptyListIcon.setVisibility(View.VISIBLE);

app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ private void populateDirectoryList() {
735735

736736
if (files.isEmpty()) {
737737
setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty,
738-
R.drawable.uploads);
738+
R.drawable.ic_list_empty_uploads);
739739
mEmptyListContainer.setVisibility(View.VISIBLE);
740740
binding.list.setVisibility(View.GONE);
741741
} else {
@@ -796,7 +796,7 @@ public void setMessageForEmptyList(@StringRes final int headline, @StringRes fin
796796
if (mEmptyListContainer != null && mEmptyListMessage != null) {
797797
mEmptyListHeadline.setText(headline);
798798
mEmptyListMessage.setText(message);
799-
mEmptyListIcon.setImageDrawable(viewThemeUtils.platform.tintPrimaryDrawable(this, icon));
799+
mEmptyListIcon.setImageResource(icon);
800800
mEmptyListIcon.setVisibility(View.VISIBLE);
801801
mEmptyListMessage.setVisibility(View.VISIBLE);
802802
}

app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ class SyncedFoldersActivity :
268268
binding.list.layoutManager = lm
269269
binding.list.adapter = adapter
270270
load(getItemsDisplayedPerFolder(), false)
271+
//NMC customization
272+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_synced_folders)
271273
}
272274

273275
private fun showHiddenItems() {

app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,7 @@ protected void onCreate(Bundle savedInstanceState) {
149149
private void setupContent() {
150150
binding.list.setEmptyView(binding.emptyList.getRoot());
151151
binding.emptyList.getRoot().setVisibility(View.GONE);
152-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.uploads);
153-
binding.emptyList.emptyListIcon.getDrawable().mutate();
154-
binding.emptyList.emptyListIcon.setAlpha(0.5f);
152+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_uploads);
155153
binding.emptyList.emptyListIcon.setVisibility(View.VISIBLE);
156154
binding.emptyList.emptyListViewHeadline.setText(getString(R.string.upload_list_empty_headline));
157155
binding.emptyList.emptyListViewText.setText(getString(R.string.upload_list_empty_text_auto_upload));

app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -581,16 +581,8 @@ public void run() {
581581
if (mEmptyListContainer != null && mEmptyListMessage != null) {
582582
mEmptyListHeadline.setText(headline);
583583
mEmptyListMessage.setText(message);
584-
585-
if (tintIcon) {
586-
if (getContext() != null) {
587-
mEmptyListIcon.setImageDrawable(
588-
viewThemeUtils.platform.tintPrimaryDrawable(getContext(), icon));
589-
}
590-
} else {
591-
mEmptyListIcon.setImageResource(icon);
592-
}
593-
584+
//tinting is not required in NMC
585+
mEmptyListIcon.setImageResource(icon);
594586
mEmptyListIcon.setVisibility(View.VISIBLE);
595587
mEmptyListMessage.setVisibility(View.VISIBLE);
596588
}
@@ -610,8 +602,8 @@ public void run() {
610602
true);
611603
} else if (searchType == SearchType.FILE_SEARCH) {
612604
setMessageForEmptyList(R.string.file_list_empty_headline_server_search,
613-
R.string.file_list_empty,
614-
R.drawable.ic_search_light_grey);
605+
R.string.search_result_empty,
606+
R.drawable.ic_search_empty);
615607
} else if (searchType == SearchType.FAVORITE_SEARCH) {
616608
setMessageForEmptyList(R.string.file_list_empty_favorite_headline,
617609
R.string.file_list_empty_favorites_filter_list,
@@ -623,15 +615,15 @@ public void run() {
623615
} else if (searchType == SearchType.REGULAR_FILTER) {
624616
setMessageForEmptyList(R.string.file_list_empty_headline_search,
625617
R.string.file_list_empty_search,
626-
R.drawable.ic_search_light_grey);
618+
R.drawable.ic_search_empty);
627619
} else if (searchType == SearchType.SHARED_FILTER) {
628620
setMessageForEmptyList(R.string.file_list_empty_shared_headline,
629621
R.string.file_list_empty_shared,
630622
R.drawable.ic_list_empty_shared);
631623
} else if (searchType == SearchType.GALLERY_SEARCH) {
632-
setMessageForEmptyList(R.string.file_list_empty_headline_server_search,
633-
R.string.file_list_empty_gallery,
634-
R.drawable.file_image);
624+
setMessageForEmptyList(R.string.file_list_empty_headline,
625+
R.string.gallery_list_empty,
626+
R.drawable.ic_list_empty_media);
635627
}
636628
}
637629
});

app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,8 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
123123
requireContext().getString(R.string.file_list_empty_headline_server_search)
124124
binding.emptyList.emptyListViewText.text =
125125
requireContext().getString(R.string.file_list_empty_unified_search_no_results)
126-
binding.emptyList.emptyListIcon.setImageDrawable(
127-
viewThemeUtils.platform.tintDrawable(requireContext(), R.drawable.ic_search_grey)
128-
)
126+
//NMC Customization
127+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_search_empty)
129128
}
130129
}
131130
}

app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private void setupContent() {
132132
EmptyRecyclerView recyclerView = binding.list;
133133
recyclerView.setEmptyView(binding.emptyList.emptyListView);
134134
binding.emptyList.emptyListView.setVisibility(View.GONE);
135-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete);
135+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin);
136136
binding.emptyList.emptyListIcon.setVisibility(View.VISIBLE);
137137
binding.emptyList.emptyListViewHeadline.setText(getString(R.string.trashbin_empty_headline));
138138
binding.emptyList.emptyListViewText.setText(getString(R.string.trashbin_empty_message));
@@ -265,7 +265,7 @@ public void showTrashbinFolder(List<TrashbinFile> trashbinFiles) {
265265
trashbinListAdapter.setTrashbinFiles(trashbinFiles, true);
266266
binding.swipeContainingList.setRefreshing(false);
267267
binding.loadingContent.setVisibility(View.GONE);
268-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete);
268+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin);
269269
binding.emptyList.emptyListViewHeadline.setText(getString(R.string.trashbin_empty_headline));
270270
binding.emptyList.emptyListViewText.setText(getString(R.string.trashbin_empty_message));
271271
binding.list.setVisibility(View.VISIBLE);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:tint="@color/empty_list_icon_color_dark"
5+
android:viewportWidth="24"
6+
android:viewportHeight="24">
7+
<path
8+
android:pathData="M12,1C5.9249,1 1,5.9249 1,12C1,18.0751 5.9249,23 12,23C18.0751,23 23,18.0751 23,12C23,9.0826 21.8411,6.2847 19.7782,4.2218C17.7153,2.1589 14.9174,1 12,1ZM11,6.75L13,6.75L13,13.25L11,13.25L11,6.75ZM12,17.25C11.3096,17.25 10.75,16.6904 10.75,16C10.75,15.3096 11.3096,14.75 12,14.75C12.6904,14.75 13.25,15.3096 13.25,16C13.25,16.6904 12.6904,17.25 12,17.25L12,17.25Z"
9+
android:strokeWidth="1"
10+
android:fillColor="#262626"
11+
android:fillType="evenOdd"
12+
android:strokeColor="#00000000"/>
13+
</vector>

0 commit comments

Comments
 (0)