Skip to content

Commit 3b356ad

Browse files
committed
Updated empty state view icons for light and dark mode with test cases.
1 parent b11ea53 commit 3b356ad

34 files changed

+553
-68
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
@@ -218,7 +218,7 @@ open class FolderPickerActivity :
218218
it.setMessageForEmptyList(
219219
R.string.folder_list_empty_headline,
220220
R.string.file_list_empty_moving,
221-
R.drawable.ic_list_empty_create_folder,
221+
R.drawable.ic_list_empty_folder,
222222
true
223223
)
224224
} else {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I
220220
* sets up the UI elements and loads all notification items.
221221
*/
222222
private fun setupContent() {
223-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification)
223+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification)
224224
setLoadingMessageEmpty()
225225
val layoutManager = LinearLayoutManager(this)
226226
binding.list.layoutManager = layoutManager
@@ -335,7 +335,7 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I
335335
binding.emptyList.emptyListView.visibility = View.VISIBLE
336336
binding.emptyList.emptyListViewHeadline.text = headline
337337
binding.emptyList.emptyListViewText.text = message
338-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification)
338+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification)
339339
binding.emptyList.emptyListViewText.visibility = View.VISIBLE
340340
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
341341
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -766,16 +766,16 @@ private void populateDirectoryList(OCFile file) {
766766

767767
List<OCFile> files = getStorageManager().getFolderContent(mFile, false);
768768

769-
if (files.isEmpty()) {
770-
setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty,
771-
R.drawable.uploads);
772-
mEmptyListContainer.setVisibility(View.VISIBLE);
773-
binding.list.setVisibility(View.GONE);
774-
} else {
775-
mEmptyListContainer.setVisibility(View.GONE);
776-
files = sortFileList(files);
777-
setupReceiveExternalFilesAdapter(files);
778-
}
769+
if (files.isEmpty()) {
770+
setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty,
771+
R.drawable.ic_list_empty_uploads);
772+
mEmptyListContainer.setVisibility(View.VISIBLE);
773+
binding.list.setVisibility(View.GONE);
774+
} else {
775+
mEmptyListContainer.setVisibility(View.GONE);
776+
files = sortFileList(files);
777+
setupReceiveExternalFilesAdapter(files);
778+
}
779779

780780
MaterialButton btnChooseFolder = binding.uploaderChooseFolder;
781781
viewThemeUtils.material.colorMaterialButtonPrimaryFilled(btnChooseFolder);
@@ -822,7 +822,7 @@ public void setMessageForEmptyList(@StringRes final int headline, @StringRes fin
822822
if (mEmptyListContainer != null && mEmptyListMessage != null) {
823823
mEmptyListHeadline.setText(headline);
824824
mEmptyListMessage.setText(message);
825-
mEmptyListIcon.setImageDrawable(viewThemeUtils.platform.tintPrimaryDrawable(this, icon));
825+
mEmptyListIcon.setImageResource(icon);
826826
mEmptyListIcon.setVisibility(View.VISIBLE);
827827
mEmptyListMessage.setVisibility(View.VISIBLE);
828828
}

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
@@ -254,6 +254,8 @@ class SyncedFoldersActivity :
254254
binding.list.layoutManager = lm
255255
binding.list.adapter = adapter
256256
load(getItemsDisplayedPerFolder(), false)
257+
//NMC customization
258+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_synced_folders)
257259
}
258260

259261
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
@@ -145,9 +145,7 @@ private void handleUploadWorkerState() {
145145
private void setupContent() {
146146
binding.list.setEmptyView(binding.emptyList.getRoot());
147147
binding.emptyList.getRoot().setVisibility(View.GONE);
148-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.uploads);
149-
binding.emptyList.emptyListIcon.getDrawable().mutate();
150-
binding.emptyList.emptyListIcon.setAlpha(0.5f);
148+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_uploads);
151149
binding.emptyList.emptyListIcon.setVisibility(View.VISIBLE);
152150
binding.emptyList.emptyListViewHeadline.setText(getString(R.string.upload_list_empty_headline));
153151
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: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -586,22 +586,14 @@ public void setMessageForEmptyList(@StringRes final int headline, @StringRes fin
586586
@DrawableRes final int icon, final boolean tintIcon) {
587587
new Handler(Looper.getMainLooper()).post(() -> {
588588

589-
if (mEmptyListContainer != null && mEmptyListMessage != null) {
590-
mEmptyListHeadline.setText(headline);
591-
mEmptyListMessage.setText(message);
592-
593-
if (tintIcon) {
594-
if (getContext() != null) {
595-
mEmptyListIcon.setImageDrawable(
596-
viewThemeUtils.platform.tintPrimaryDrawable(getContext(), icon));
597-
}
598-
} else {
589+
if (mEmptyListContainer != null && mEmptyListMessage != null) {
590+
mEmptyListHeadline.setText(headline);
591+
mEmptyListMessage.setText(message);
592+
//tinting is not required in NMC
599593
mEmptyListIcon.setImageResource(icon);
594+
mEmptyListIcon.setVisibility(View.VISIBLE);
595+
mEmptyListMessage.setVisibility(View.VISIBLE);
600596
}
601-
602-
mEmptyListIcon.setVisibility(View.VISIBLE);
603-
mEmptyListMessage.setVisibility(View.VISIBLE);
604-
}
605597
});
606598
}
607599

@@ -619,8 +611,8 @@ public void setEmptyListMessage(final SearchType searchType) {
619611
true);
620612
} else if (searchType == SearchType.FILE_SEARCH) {
621613
setMessageForEmptyList(R.string.file_list_empty_headline_server_search,
622-
R.string.file_list_empty,
623-
R.drawable.ic_search_light_grey);
614+
R.string.search_result_empty,
615+
R.drawable.ic_search_empty);
624616
} else if (searchType == SearchType.FAVORITE_SEARCH) {
625617
setMessageForEmptyList(R.string.file_list_empty_favorite_headline,
626618
R.string.file_list_empty_favorites_filter_list,
@@ -632,15 +624,15 @@ public void setEmptyListMessage(final SearchType searchType) {
632624
} else if (searchType == SearchType.REGULAR_FILTER) {
633625
setMessageForEmptyList(R.string.file_list_empty_headline_search,
634626
R.string.file_list_empty_search,
635-
R.drawable.ic_search_light_grey);
627+
R.drawable.ic_search_empty);
636628
} else if (searchType == SearchType.SHARED_FILTER) {
637629
setMessageForEmptyList(R.string.file_list_empty_shared_headline,
638630
R.string.file_list_empty_shared,
639631
R.drawable.ic_list_empty_shared);
640632
} else if (searchType == SearchType.GALLERY_SEARCH) {
641-
setMessageForEmptyList(R.string.file_list_empty_headline_server_search,
642-
R.string.file_list_empty_gallery,
643-
R.drawable.file_image);
633+
setMessageForEmptyList(R.string.file_list_empty_headline,
634+
R.string.gallery_list_empty,
635+
R.drawable.ic_list_empty_media);
644636
} else if (searchType == SearchType.LOCAL_SEARCH) {
645637
setMessageForEmptyList(R.string.file_list_empty_headline_server_search,
646638
R.string.file_list_empty_local_search,

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
@@ -208,9 +208,8 @@ class UnifiedSearchFragment :
208208
requireContext().getString(R.string.file_list_empty_headline_server_search)
209209
binding.emptyList.emptyListViewText.text =
210210
requireContext().getString(R.string.file_list_empty_unified_search_no_results)
211-
binding.emptyList.emptyListIcon.setImageDrawable(
212-
viewThemeUtils.platform.tintDrawable(requireContext(), R.drawable.ic_search_grey)
213-
)
211+
//NMC Customization
212+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_search_empty)
214213
}
215214
}
216215
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class TrashbinActivity :
138138
recyclerView.setEmptyView(binding.emptyList.emptyListView)
139139

140140
binding.emptyList.emptyListView.visibility = View.GONE
141-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete)
141+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin)
142142
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
143143
binding.emptyList.emptyListViewHeadline.text = getString(R.string.trashbin_empty_headline)
144144
binding.emptyList.emptyListViewText.text = getString(R.string.trashbin_empty_message)
@@ -306,7 +306,7 @@ class TrashbinActivity :
306306
trashbinListAdapter?.setTrashbinFiles(trashbinFiles, true)
307307
binding.swipeContainingList.isRefreshing = false
308308
binding.loadingContent.visibility = View.GONE
309-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete)
309+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin)
310310
binding.emptyList.emptyListViewHeadline.text = getString(R.string.trashbin_empty_headline)
311311
binding.emptyList.emptyListViewText.text = getString(R.string.trashbin_empty_message)
312312
binding.list.visibility = View.VISIBLE

0 commit comments

Comments
 (0)