Skip to content

Commit aef9e83

Browse files
committed
Updated empty state view icons for light and dark mode with test cases.
1 parent 91e2440 commit aef9e83

34 files changed

+527
-51
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
@@ -225,7 +225,7 @@ open class FolderPickerActivity :
225225
it.setMessageForEmptyList(
226226
R.string.folder_list_empty_headline,
227227
R.string.file_list_empty_moving,
228-
R.drawable.ic_list_empty_create_folder,
228+
R.drawable.ic_list_empty_folder,
229229
true
230230
)
231231
} 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
@@ -221,7 +221,7 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I
221221
* sets up the UI elements and loads all notification items.
222222
*/
223223
private fun setupContent() {
224-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification)
224+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification)
225225
setLoadingMessageEmpty()
226226
val layoutManager = LinearLayoutManager(this)
227227
binding.list.layoutManager = layoutManager
@@ -336,7 +336,7 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I
336336
binding.emptyList.emptyListView.visibility = View.VISIBLE
337337
binding.emptyList.emptyListViewHeadline.text = headline
338338
binding.emptyList.emptyListViewText.text = message
339-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_notification)
339+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_notification)
340340
binding.emptyList.emptyListViewText.visibility = View.VISIBLE
341341
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
342342
}

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
@@ -773,7 +773,7 @@ private void populateDirectoryList(OCFile file) {
773773

774774
if (files.isEmpty()) {
775775
setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty,
776-
R.drawable.uploads);
776+
R.drawable.ic_list_empty_uploads);
777777
mEmptyListContainer.setVisibility(View.VISIBLE);
778778
binding.list.setVisibility(View.GONE);
779779
} else {
@@ -827,7 +827,7 @@ public void setMessageForEmptyList(@StringRes final int headline, @StringRes fin
827827
if (mEmptyListContainer != null && mEmptyListMessage != null) {
828828
mEmptyListHeadline.setText(headline);
829829
mEmptyListMessage.setText(message);
830-
mEmptyListIcon.setImageDrawable(viewThemeUtils.platform.tintPrimaryDrawable(this, icon));
830+
mEmptyListIcon.setImageResource(icon);
831831
mEmptyListIcon.setVisibility(View.VISIBLE);
832832
mEmptyListMessage.setVisibility(View.VISIBLE);
833833
}

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
@@ -256,6 +256,8 @@ class SyncedFoldersActivity :
256256
binding.list.layoutManager = lm
257257
binding.list.adapter = adapter
258258
load(getItemsDisplayedPerFolder(), false)
259+
//NMC customization
260+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_synced_folders)
259261
}
260262

261263
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.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -585,14 +585,8 @@ open class ExtendedListFragment :
585585
mEmptyListHeadline?.setText(headline)
586586
mEmptyListMessage?.setText(message)
587587

588-
if (tintIcon) {
589-
context?.let {
590-
val drawable = viewThemeUtils.platform.tintDrawable(it, icon, ColorRole.PRIMARY)
591-
mEmptyListIcon?.setImageDrawable(drawable)
592-
}
593-
} else {
594-
mEmptyListIcon?.setImageResource(icon)
595-
}
588+
// tinting is not required in NMC
589+
mEmptyListIcon?.setImageResource(icon)
596590

597591
mEmptyListIcon?.setVisibility(View.VISIBLE)
598592
mEmptyListMessage?.visibility = View.VISIBLE

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
@@ -142,7 +142,7 @@ class TrashbinActivity :
142142
recyclerView.setEmptyView(binding.emptyList.emptyListView)
143143

144144
binding.emptyList.emptyListView.visibility = View.GONE
145-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete)
145+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin)
146146
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
147147
binding.emptyList.emptyListViewHeadline.text = getString(R.string.trashbin_empty_headline)
148148
binding.emptyList.emptyListViewText.text = getString(R.string.trashbin_empty_message)
@@ -310,7 +310,7 @@ class TrashbinActivity :
310310
trashbinListAdapter?.setTrashbinFiles(trashbinFiles, true)
311311
binding.swipeContainingList.isRefreshing = false
312312
binding.loadingContent.visibility = View.GONE
313-
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_delete)
313+
binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_list_empty_trashbin)
314314
binding.emptyList.emptyListViewHeadline.text = getString(R.string.trashbin_empty_headline)
315315
binding.emptyList.emptyListViewText.text = getString(R.string.trashbin_empty_message)
316316
binding.list.visibility = 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)