Swipe to refresh detail view
This commit is contained in:
parent
09a5d5b4f5
commit
1616b27816
6 changed files with 31 additions and 19 deletions
|
@ -19,6 +19,7 @@ import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
import io.heckel.ntfy.R
|
import io.heckel.ntfy.R
|
||||||
import io.heckel.ntfy.app.Application
|
import io.heckel.ntfy.app.Application
|
||||||
import io.heckel.ntfy.data.Notification
|
import io.heckel.ntfy.data.Notification
|
||||||
|
@ -48,6 +49,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
// UI elements
|
// UI elements
|
||||||
private lateinit var adapter: DetailAdapter
|
private lateinit var adapter: DetailAdapter
|
||||||
private lateinit var mainList: RecyclerView
|
private lateinit var mainList: RecyclerView
|
||||||
|
private lateinit var mainListContainer: SwipeRefreshLayout
|
||||||
private lateinit var menu: Menu
|
private lateinit var menu: Menu
|
||||||
|
|
||||||
// Action mode stuff
|
// Action mode stuff
|
||||||
|
@ -87,6 +89,11 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
howToExample.text = Html.fromHtml(howToText)
|
howToExample.text = Html.fromHtml(howToText)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Swipe to refresh
|
||||||
|
mainListContainer = findViewById(R.id.detail_notification_list_container)
|
||||||
|
mainListContainer.setOnRefreshListener { refresh() }
|
||||||
|
mainListContainer.setColorSchemeResources(R.color.primaryColor)
|
||||||
|
|
||||||
// Update main list based on viewModel (& its datasource/livedata)
|
// Update main list based on viewModel (& its datasource/livedata)
|
||||||
val noEntriesText: View = findViewById(R.id.detail_no_notifications)
|
val noEntriesText: View = findViewById(R.id.detail_no_notifications)
|
||||||
val onNotificationClick = { n: Notification -> onNotificationClick(n) }
|
val onNotificationClick = { n: Notification -> onNotificationClick(n) }
|
||||||
|
@ -100,10 +107,10 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
it?.let {
|
it?.let {
|
||||||
adapter.submitList(it as MutableList<Notification>)
|
adapter.submitList(it as MutableList<Notification>)
|
||||||
if (it.isEmpty()) {
|
if (it.isEmpty()) {
|
||||||
mainList.visibility = View.GONE
|
mainListContainer.visibility = View.GONE
|
||||||
noEntriesText.visibility = View.VISIBLE
|
noEntriesText.visibility = View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
mainList.visibility = View.VISIBLE
|
mainListContainer.visibility = View.VISIBLE
|
||||||
noEntriesText.visibility = View.GONE
|
noEntriesText.visibility = View.GONE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,10 +135,6 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
onTestClick()
|
onTestClick()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
R.id.detail_menu_refresh -> {
|
|
||||||
onRefreshClick()
|
|
||||||
true
|
|
||||||
}
|
|
||||||
R.id.detail_menu_enable_instant -> {
|
R.id.detail_menu_enable_instant -> {
|
||||||
onInstantEnableClick(enable = true)
|
onInstantEnableClick(enable = true)
|
||||||
true
|
true
|
||||||
|
@ -181,7 +184,7 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRefreshClick() {
|
private fun refresh() {
|
||||||
Log.d(TAG, "Fetching cached notifications for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}")
|
Log.d(TAG, "Fetching cached notifications for ${topicShortUrl(subscriptionBaseUrl, subscriptionTopic)}")
|
||||||
|
|
||||||
lifecycleScope.launch(Dispatchers.IO) {
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
|
@ -194,12 +197,16 @@ class DetailActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
getString(R.string.refresh_message_result, newNotifications.size)
|
getString(R.string.refresh_message_result, newNotifications.size)
|
||||||
}
|
}
|
||||||
newNotifications.forEach { notification -> repository.addNotification(notification) }
|
newNotifications.forEach { notification -> repository.addNotification(notification) }
|
||||||
runOnUiThread { Toast.makeText(this@DetailActivity, toastMessage, Toast.LENGTH_LONG).show() }
|
runOnUiThread {
|
||||||
|
Toast.makeText(this@DetailActivity, toastMessage, Toast.LENGTH_LONG).show()
|
||||||
|
mainListContainer.isRefreshing = false
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
Toast
|
Toast
|
||||||
.makeText(this@DetailActivity, getString(R.string.refresh_message_error, e.message), Toast.LENGTH_LONG)
|
.makeText(this@DetailActivity, getString(R.string.refresh_message_error, e.message), Toast.LENGTH_LONG)
|
||||||
.show()
|
.show()
|
||||||
|
mainListContainer.isRefreshing = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,8 +71,8 @@ class MainActivity : AppCompatActivity(), ActionMode.Callback {
|
||||||
onSubscribeButtonClick()
|
onSubscribeButtonClick()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swipewn to refresh
|
// Swipe to refresh
|
||||||
mainListContainer = findViewById(R.id.main_subscriptions_list_swipe_container)
|
mainListContainer = findViewById(R.id.main_subscriptions_list_container)
|
||||||
mainListContainer.setOnRefreshListener { refreshAllSubscriptions() }
|
mainListContainer.setOnRefreshListener { refreshAllSubscriptions() }
|
||||||
mainListContainer.setColorSchemeResources(R.color.primaryColor)
|
mainListContainer.setColorSchemeResources(R.color.primaryColor)
|
||||||
|
|
||||||
|
|
|
@ -7,15 +7,22 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".ui.DetailActivity">
|
tools:context=".ui.DetailActivity">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
android:id="@+id/detail_notification_list"
|
android:id="@+id/detail_notification_list_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:clickable="true"
|
|
||||||
android:focusable="true"
|
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="10dp"
|
||||||
android:background="?android:attr/selectableItemBackground"
|
android:visibility="gone">
|
||||||
app:layoutManager="LinearLayoutManager" android:visibility="gone"/>
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/detail_notification_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
app:layoutManager="LinearLayoutManager"/>
|
||||||
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
android:id="@+id/main_subscriptions_list_swipe_container"
|
android:id="@+id/main_subscriptions_list_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="10dp"
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
<item android:id="@+id/detail_menu_enable_instant" android:title="@string/detail_menu_enable_instant"
|
<item android:id="@+id/detail_menu_enable_instant" android:title="@string/detail_menu_enable_instant"
|
||||||
/>
|
/>
|
||||||
<item android:id="@+id/detail_menu_disable_instant" android:title="@string/detail_menu_disable_instant"/>
|
<item android:id="@+id/detail_menu_disable_instant" android:title="@string/detail_menu_disable_instant"/>
|
||||||
<item android:id="@+id/detail_menu_refresh" android:title="@string/detail_menu_refresh"/>
|
|
||||||
<item android:id="@+id/detail_menu_copy_url" android:title="@string/detail_menu_copy_url"/>
|
<item android:id="@+id/detail_menu_copy_url" android:title="@string/detail_menu_copy_url"/>
|
||||||
<item android:id="@+id/detail_menu_unsubscribe" android:title="@string/detail_menu_unsubscribe"/>
|
<item android:id="@+id/detail_menu_unsubscribe" android:title="@string/detail_menu_unsubscribe"/>
|
||||||
</menu>
|
</menu>
|
||||||
|
|
|
@ -68,7 +68,6 @@
|
||||||
<!-- Detail activity: Action bar -->
|
<!-- Detail activity: Action bar -->
|
||||||
<string name="detail_menu_test">Send test notification</string>
|
<string name="detail_menu_test">Send test notification</string>
|
||||||
<string name="detail_menu_copy_url">Copy topic address</string>
|
<string name="detail_menu_copy_url">Copy topic address</string>
|
||||||
<string name="detail_menu_refresh">Force refresh</string>
|
|
||||||
<string name="detail_menu_enable_instant">Enable fast delivery</string>
|
<string name="detail_menu_enable_instant">Enable fast delivery</string>
|
||||||
<string name="detail_menu_disable_instant">Disable fast delivery</string>
|
<string name="detail_menu_disable_instant">Disable fast delivery</string>
|
||||||
<string name="detail_menu_unsubscribe">Unsubscribe</string>
|
<string name="detail_menu_unsubscribe">Unsubscribe</string>
|
||||||
|
|
Loading…
Reference in a new issue