Skip to content

Commit 89e0823

Browse files
committed
Albums ui empty state updated
1 parent 0bb8034 commit 89e0823

8 files changed

Lines changed: 145 additions & 101 deletions

File tree

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

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,6 @@ class AlbumItemsFragment : Fragment(), OCFileListFragmentInterface, Injectable {
156156
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
157157
super.onViewCreated(view, savedInstanceState)
158158
optionalUser = Optional.of(accountManager.user)
159-
if (optionalUser?.isPresent == false) {
160-
showError()
161-
}
162159
createMenu()
163160
setupContainingList()
164161
setupContent()
@@ -267,15 +264,6 @@ class AlbumItemsFragment : Fragment(), OCFileListFragmentInterface, Injectable {
267264
}
268265
}
269266

270-
private fun showError() {
271-
setMessageForEmptyList(
272-
R.string.albums_no_results_headline,
273-
resources.getString(R.string.account_not_found),
274-
R.drawable.ic_notification,
275-
false
276-
)
277-
}
278-
279267
private fun setupContent() {
280268
binding.listRoot.setEmptyView(binding.emptyList.emptyListView)
281269
val layoutManager = GridLayoutManager(requireContext(), 1)
@@ -314,9 +302,9 @@ class AlbumItemsFragment : Fragment(), OCFileListFragmentInterface, Injectable {
314302
if (result?.isSuccess == true && result.resultData != null) {
315303
if (result.resultData.isEmpty()) {
316304
setMessageForEmptyList(
317-
R.string.albums_no_results_headline,
318-
resources.getString(R.string.albums_no_results_message),
319-
R.drawable.ic_notification,
305+
R.string.file_list_empty_headline_server_search,
306+
resources.getString(R.string.file_list_empty_gallery),
307+
R.drawable.file_image,
320308
false
321309
)
322310
}
@@ -325,10 +313,9 @@ class AlbumItemsFragment : Fragment(), OCFileListFragmentInterface, Injectable {
325313
Log_OC.d(TAG, result?.logMessage)
326314
// show error
327315
setMessageForEmptyList(
328-
R.string.albums_no_results_headline,
329-
result?.getLogMessage(requireContext())
330-
?: resources.getString(R.string.albums_no_results_message),
331-
R.drawable.ic_notification,
316+
R.string.file_list_empty_headline_server_search,
317+
resources.getString(R.string.file_list_empty_gallery),
318+
R.drawable.file_image,
332319
false
333320
)
334321
}

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

Lines changed: 20 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import android.view.MenuInflater
1818
import android.view.MenuItem
1919
import android.view.View
2020
import android.view.ViewGroup
21-
import androidx.annotation.DrawableRes
22-
import androidx.annotation.StringRes
2321
import androidx.annotation.VisibleForTesting
2422
import androidx.core.content.res.ResourcesCompat
2523
import androidx.core.view.MenuHost
@@ -35,15 +33,13 @@ import com.nextcloud.client.di.Injectable
3533
import com.nextcloud.client.network.ClientFactory
3634
import com.nextcloud.client.network.ClientFactory.CreationException
3735
import com.nextcloud.client.preferences.AppPreferences
38-
import com.nextcloud.utils.extensions.getTypedActivity
3936
import com.owncloud.android.R
40-
import com.owncloud.android.databinding.ListFragmentBinding
37+
import com.owncloud.android.databinding.AlbumsFragmentBinding
4138
import com.owncloud.android.datamodel.SyncedFolderProvider
4239
import com.owncloud.android.lib.common.OwnCloudClient
4340
import com.owncloud.android.lib.common.utils.Log_OC
4441
import com.owncloud.android.operations.albums.ReadAlbumsOperation
4542
import com.owncloud.android.operations.albums.ReadAlbumsOperation.PhotoAlbumEntry
46-
import com.owncloud.android.ui.activity.FileActivity
4743
import com.owncloud.android.ui.activity.FileDisplayActivity
4844
import com.owncloud.android.ui.adapter.albums.AlbumFragmentInterface
4945
import com.owncloud.android.ui.adapter.albums.AlbumsAdapter
@@ -62,7 +58,7 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
6258
private var client: OwnCloudClient? = null
6359
private var optionalUser: Optional<User>? = null
6460

65-
private lateinit var binding: ListFragmentBinding
61+
private lateinit var binding: AlbumsFragmentBinding
6662

6763
@Inject
6864
lateinit var viewThemeUtils: ViewThemeUtils
@@ -118,19 +114,19 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
118114
}
119115

120116
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
121-
binding = ListFragmentBinding.inflate(inflater, container, false)
117+
binding = AlbumsFragmentBinding.inflate(inflater, container, false)
122118
return binding.root
123119
}
124120

125121
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
126122
super.onViewCreated(view, savedInstanceState)
127123
optionalUser = Optional.of(accountManager.user)
128-
if (optionalUser?.isPresent == false) {
129-
showError()
130-
}
131124
createMenu()
132125
setupContainingList()
133126
setupContent()
127+
binding.createAlbum.setOnClickListener {
128+
showCreateAlbumDialog()
129+
}
134130
}
135131

136132
private fun createMenu() {
@@ -144,11 +140,7 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
144140
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
145141
return when (menuItem.itemId) {
146142
R.id.action_create_new_album -> {
147-
CreateAlbumDialogFragment.newInstance()
148-
.show(
149-
requireActivity().supportFragmentManager,
150-
CreateAlbumDialogFragment.TAG
151-
)
143+
showCreateAlbumDialog()
152144
true
153145
}
154146

@@ -158,17 +150,15 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
158150
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
159151
}
160152

161-
private fun showError() {
162-
setMessageForEmptyList(
163-
R.string.albums_no_results_headline,
164-
resources.getString(R.string.account_not_found),
165-
R.drawable.ic_notification,
166-
false
167-
)
153+
private fun showCreateAlbumDialog() {
154+
CreateAlbumDialogFragment.newInstance()
155+
.show(
156+
requireActivity().supportFragmentManager,
157+
CreateAlbumDialogFragment.TAG
158+
)
168159
}
169160

170161
private fun setupContent() {
171-
binding.listRoot.setEmptyView(binding.emptyList.emptyListView)
172162
binding.listRoot.setHasFixedSize(true)
173163
if (isGridView) {
174164
val layoutManager = GridLayoutManager(requireContext(), maxColumnSize)
@@ -183,7 +173,6 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
183173
private fun setupContainingList() {
184174
viewThemeUtils.androidx.themeSwipeRefreshLayout(binding.swipeContainingList)
185175
binding.swipeContainingList.setOnRefreshListener {
186-
binding.swipeContainingList.isRefreshing = true
187176
fetchAndSetData()
188177
}
189178
}
@@ -198,32 +187,22 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
198187
}
199188

200189
private fun fetchAndSetData() {
190+
binding.swipeContainingList.isRefreshing = true
201191
initializeAdapter()
202-
setEmptyListLoadingMessage()
192+
updateEmptyView(false)
203193
lifecycleScope.launch(Dispatchers.IO) {
204194
val getRemoteNotificationOperation = ReadAlbumsOperation()
205195
val result = client?.let { getRemoteNotificationOperation.execute(it) }
206196
withContext(Dispatchers.Main) {
207197
if (result?.isSuccess == true && result.resultData != null) {
208198
if (result.resultData.isEmpty()) {
209-
setMessageForEmptyList(
210-
R.string.albums_no_results_headline,
211-
resources.getString(R.string.albums_no_results_message),
212-
R.drawable.ic_notification,
213-
false
214-
)
199+
updateEmptyView(true)
215200
}
216201
populateList(result.resultData)
217202
} else {
218203
Log_OC.d(TAG, result?.logMessage)
219204
// show error
220-
setMessageForEmptyList(
221-
R.string.albums_no_results_headline,
222-
result?.getLogMessage(requireContext())
223-
?: resources.getString(R.string.albums_no_results_message),
224-
R.drawable.ic_notification,
225-
false
226-
)
205+
updateEmptyView(true)
227206
}
228207
hideRefreshLayoutLoader()
229208
}
@@ -262,35 +241,9 @@ class AlbumsFragment : Fragment(), AlbumFragmentInterface, Injectable {
262241
binding.listRoot.adapter = adapter
263242
}
264243

265-
private fun setMessageForEmptyList(
266-
@StringRes headline: Int, message: String,
267-
@DrawableRes icon: Int, tintIcon: Boolean
268-
) {
269-
binding.emptyList.emptyListViewHeadline.setText(headline)
270-
binding.emptyList.emptyListViewText.text = message
271-
272-
if (tintIcon) {
273-
if (context != null) {
274-
binding.emptyList.emptyListIcon.setImageDrawable(
275-
viewThemeUtils.platform.tintPrimaryDrawable(requireContext(), icon)
276-
)
277-
}
278-
} else {
279-
binding.emptyList.emptyListIcon.setImageResource(icon)
280-
}
281-
282-
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
283-
binding.emptyList.emptyListViewText.visibility = View.VISIBLE
284-
}
285-
286-
private fun setEmptyListLoadingMessage() {
287-
val fileActivity = this.getTypedActivity(FileActivity::class.java)
288-
fileActivity?.connectivityService?.isNetworkAndServerAvailable { result: Boolean? ->
289-
if (!result!!) return@isNetworkAndServerAvailable
290-
binding.emptyList.emptyListViewHeadline.setText(R.string.file_list_loading)
291-
binding.emptyList.emptyListViewText.text = ""
292-
binding.emptyList.emptyListIcon.visibility = View.GONE
293-
}
244+
private fun updateEmptyView(isEmpty: Boolean) {
245+
binding.emptyViewLayout.visibility = if (isEmpty) View.VISIBLE else View.GONE
246+
binding.listRoot.visibility = if (isEmpty) View.GONE else View.VISIBLE
294247
}
295248

296249
override fun onResume() {
905 KB
Loading
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
~ Nextcloud - Android Client
3+
~
4+
~ SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
5+
~ SPDX-FileCopyrightText: 2014-2020 Tobias Kaminsky <tobias@kaminsky.me>
6+
~ SPDX-FileCopyrightText: 2020 Boris Bodin <joris.bodin@infomaniak.com>
7+
~ SPDX-FileCopyrightText: 2015 Andy Scherzinger <info@andy-scherzinger.de>
8+
~ SPDX-FileCopyrightText: 2015 ownCloud Inc.
9+
~ SPDX-FileCopyrightText: 2012 David A. Velasco <dvelasco@solidgear.es>
10+
~ SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only)
11+
-->
12+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
13+
xmlns:app="http://schemas.android.com/apk/res-auto"
14+
xmlns:tools="http://schemas.android.com/tools"
15+
android:id="@+id/list_fragment_layout"
16+
android:layout_width="match_parent"
17+
android:layout_height="match_parent">
18+
19+
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
20+
android:id="@+id/swipe_containing_list"
21+
android:layout_width="match_parent"
22+
android:layout_height="match_parent"
23+
android:footerDividersEnabled="false"
24+
android:visibility="visible"
25+
app:layout_behavior="@string/appbar_scrolling_view_behavior">
26+
27+
<androidx.recyclerview.widget.RecyclerView
28+
android:id="@+id/list_root"
29+
android:layout_width="match_parent"
30+
android:layout_height="match_parent" />
31+
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
32+
33+
<androidx.constraintlayout.widget.ConstraintLayout
34+
android:id="@+id/empty_view_layout"
35+
android:layout_width="match_parent"
36+
android:layout_height="match_parent"
37+
android:background="@color/bg_default"
38+
android:visibility="gone"
39+
tools:visibility="visible">
40+
41+
<ImageView
42+
android:id="@+id/albums_bg_image"
43+
android:layout_width="match_parent"
44+
android:layout_height="0dp"
45+
android:scaleType="centerCrop"
46+
android:src="@drawable/bg_image_albums"
47+
app:layout_constraintBottom_toTopOf="@+id/empty_album_label"
48+
app:layout_constraintEnd_toEndOf="parent"
49+
app:layout_constraintStart_toStartOf="parent"
50+
app:layout_constraintTop_toTopOf="parent" />
51+
52+
<TextView
53+
android:id="@+id/empty_album_label"
54+
android:layout_width="0dp"
55+
android:layout_height="wrap_content"
56+
android:paddingStart="@dimen/standard_double_padding"
57+
android:paddingEnd="@dimen/standard_double_padding"
58+
android:text="@string/empty_albums_title"
59+
android:textColor="@color/text_color"
60+
android:textSize="48sp"
61+
android:textStyle="bold"
62+
app:layout_constraintBottom_toTopOf="@+id/empty_album_message_label"
63+
app:layout_constraintEnd_toEndOf="parent"
64+
app:layout_constraintStart_toStartOf="parent" />
65+
66+
<TextView
67+
android:id="@+id/empty_album_message_label"
68+
android:layout_width="0dp"
69+
android:layout_height="wrap_content"
70+
android:paddingStart="@dimen/standard_double_padding"
71+
android:paddingTop="@dimen/standard_padding"
72+
android:paddingEnd="@dimen/standard_double_padding"
73+
android:text="@string/empty_albums_message"
74+
android:textColor="@color/secondary_text_color"
75+
android:textSize="15sp"
76+
app:layout_constraintBottom_toTopOf="@+id/create_album"
77+
app:layout_constraintEnd_toEndOf="parent"
78+
app:layout_constraintStart_toStartOf="parent" />
79+
80+
<com.google.android.material.button.MaterialButton
81+
android:id="@+id/create_album"
82+
style="@style/Nextcloud.Material.TextButton"
83+
android:layout_width="wrap_content"
84+
android:layout_height="@dimen/account_action_button_height"
85+
android:layout_marginStart="@dimen/standard_margin"
86+
android:layout_marginEnd="@dimen/standard_double_margin"
87+
android:layout_marginBottom="@dimen/bottom_navigation_view_margin"
88+
android:text="@string/create_album"
89+
android:textAlignment="textStart"
90+
android:textAllCaps="false"
91+
android:textColor="@color/primary"
92+
android:textSize="15sp"
93+
app:icon="@drawable/ic_plus"
94+
app:iconGravity="start"
95+
app:iconPadding="4dp"
96+
app:iconTint="@color/primary"
97+
app:layout_constraintBottom_toBottomOf="parent"
98+
app:layout_constraintStart_toStartOf="parent" />
99+
</androidx.constraintlayout.widget.ConstraintLayout>
100+
</RelativeLayout>

app/src/main/res/layout/albums_grid_item.xml

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@
1616
android:layout_height="wrap_content"
1717
android:layout_marginTop="@dimen/grid_container_margin"
1818
android:layout_marginEnd="@dimen/grid_container_margin"
19-
android:gravity="center"
2019
android:orientation="vertical">
2120

2221
<androidx.constraintlayout.widget.ConstraintLayout
23-
android:layout_width="wrap_content"
22+
android:layout_width="match_parent"
2423
android:layout_height="wrap_content">
2524

2625
<com.elyeproj.loaderviewlibrary.LoaderImageView
2726
android:id="@+id/thumbnail_shimmer"
28-
android:layout_width="@dimen/grid_container_height"
29-
android:layout_height="@dimen/grid_container_height"
27+
android:layout_width="match_parent"
28+
android:layout_height="140dp"
3029
android:contentDescription="@null"
3130
android:src="@drawable/file_image"
3231
android:visibility="gone"
@@ -38,8 +37,8 @@
3837

3938
<ImageView
4039
android:id="@+id/thumbnail"
41-
android:layout_width="@dimen/grid_container_height"
42-
android:layout_height="@dimen/grid_container_height"
40+
android:layout_width="match_parent"
41+
android:layout_height="140dp"
4342
android:contentDescription="@null"
4443
android:src="@drawable/file_image"
4544
app:layout_constraintBottom_toTopOf="@+id/Filename"
@@ -50,11 +49,10 @@
5049

5150
<TextView
5251
android:id="@+id/Filename"
53-
android:layout_width="wrap_content"
52+
android:layout_width="0dp"
5453
android:layout_height="@dimen/grid_bottom_view_height"
55-
android:layout_gravity="center"
54+
android:layout_marginStart="@dimen/standard_margin"
5655
android:ellipsize="middle"
57-
android:gravity="center"
5856
android:singleLine="true"
5957
android:text="@string/placeholder_filename"
6058
android:textColor="@color/text_color"
@@ -66,12 +64,11 @@
6664

6765
<TextView
6866
android:id="@+id/file_info"
69-
android:layout_width="wrap_content"
67+
android:layout_width="0dp"
7068
android:layout_height="@dimen/grid_bottom_view_height"
71-
android:layout_gravity="center"
69+
android:layout_marginStart="@dimen/standard_margin"
7270
android:layout_marginBottom="@dimen/grid_bottom_view_margin_bottom"
7371
android:ellipsize="middle"
74-
android:gravity="center"
7572
android:singleLine="true"
7673
android:textColor="@color/list_item_lastmod_and_filesize_text"
7774
android:textSize="@dimen/two_line_secondary_text_size"

0 commit comments

Comments
 (0)