mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Automatically resolve circular's direct URL
This commit is contained in:
@@ -23,19 +23,27 @@ import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageButton
|
||||
import android.widget.TextView
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.data.AndroidCircularRepository
|
||||
import net.underdesk.circolapp.databinding.ItemAttachmentBinding
|
||||
import net.underdesk.circolapp.shared.data.Circular
|
||||
import net.underdesk.circolapp.shared.data.CircularRepository
|
||||
import net.underdesk.circolapp.utils.DownloadableFile
|
||||
import net.underdesk.circolapp.utils.FileUtils
|
||||
|
||||
class AttachmentAdapter(
|
||||
private val attachmentsNames: List<String>,
|
||||
private val attachmentsUrls: List<String>,
|
||||
private val circular: Circular,
|
||||
private val mainActivity: MainActivity,
|
||||
private val adapterScope: CoroutineScope,
|
||||
private val circularHolder: CircularLetterAdapter.CircularLetterViewHolder
|
||||
) :
|
||||
RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() {
|
||||
private val adapterCallback: CircularLetterAdapter.AdapterCallback = mainActivity
|
||||
private lateinit var circularRepository: CircularRepository
|
||||
private lateinit var context: Context
|
||||
|
||||
inner class AttachmentViewHolder(binding: ItemAttachmentBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||
@@ -48,26 +56,74 @@ class AttachmentAdapter(
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AttachmentViewHolder {
|
||||
val binding = ItemAttachmentBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
context = parent.context
|
||||
circularRepository = AndroidCircularRepository.getInstance(context)
|
||||
|
||||
return AttachmentViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: AttachmentViewHolder, position: Int) {
|
||||
holder.title.text = attachmentsNames[position]
|
||||
holder.title.text = circular.attachmentsNames[position]
|
||||
|
||||
val observer = Observer<Boolean> {
|
||||
if (it) {
|
||||
holder.viewButton.isEnabled = false
|
||||
holder.downloadButton.isEnabled = false
|
||||
holder.shareButton.isEnabled = false
|
||||
} else {
|
||||
holder.viewButton.isEnabled = true
|
||||
holder.downloadButton.isEnabled = true
|
||||
holder.shareButton.isEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
circularHolder.loading.observe(mainActivity, observer)
|
||||
circularHolder.observer.add(observer)
|
||||
|
||||
holder.viewButton.setOnClickListener {
|
||||
FileUtils.viewFile(attachmentsUrls[position], context, mainActivity.customTabsSession)
|
||||
runWhenUrlIsAvailable(position) { url ->
|
||||
FileUtils.viewFile(url, context, mainActivity.customTabsSession)
|
||||
}
|
||||
}
|
||||
|
||||
holder.shareButton.setOnClickListener {
|
||||
FileUtils.shareFile(attachmentsUrls[position], context)
|
||||
runWhenUrlIsAvailable(position) { url -> FileUtils.shareFile(url, context) }
|
||||
}
|
||||
|
||||
holder.downloadButton.setOnClickListener {
|
||||
val file = DownloadableFile(attachmentsNames[position], attachmentsUrls[position])
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
runWhenUrlIsAvailable(position) { url ->
|
||||
val file = DownloadableFile(circular.attachmentsNames[position], url)
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount() = attachmentsNames.size
|
||||
private fun runWhenUrlIsAvailable(position: Int, code: (url: String) -> Unit) {
|
||||
if (circular.realAttachmentsUrls.size != circular.attachmentsUrls.size || circular.realAttachmentsUrls[position] == "") {
|
||||
circularHolder.loading.postValue(true)
|
||||
|
||||
adapterScope.launch {
|
||||
val realUrls = circularRepository.getRealUrlForAttachment(
|
||||
position,
|
||||
circular.attachmentsUrls,
|
||||
circular.realAttachmentsUrls,
|
||||
circular.id,
|
||||
circular.school
|
||||
)
|
||||
circularHolder.loading.postValue(false)
|
||||
|
||||
if (circular.realAttachmentsUrls.size != circular.attachmentsUrls.size) {
|
||||
circular.realAttachmentsUrls.clear()
|
||||
repeat(circular.attachmentsUrls.size) { circular.realAttachmentsUrls.add("") }
|
||||
}
|
||||
|
||||
circular.realAttachmentsUrls[position] = realUrls[position]
|
||||
code(realUrls[position])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
code(circular.realAttachmentsUrls[position])
|
||||
}
|
||||
|
||||
override fun getItemCount() = circular.attachmentsNames.size
|
||||
}
|
||||
|
||||
@@ -26,10 +26,13 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageButton
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.TextView
|
||||
import androidx.cardview.widget.CardView
|
||||
import androidx.core.content.ContextCompat.getDrawable
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -37,10 +40,12 @@ import kotlinx.coroutines.launch
|
||||
import net.underdesk.circolapp.AlarmBroadcastReceiver
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.data.AndroidCircularRepository
|
||||
import net.underdesk.circolapp.data.AndroidDatabase
|
||||
import net.underdesk.circolapp.databinding.ItemCircularBinding
|
||||
import net.underdesk.circolapp.fragments.NewReminderFragment
|
||||
import net.underdesk.circolapp.shared.data.Circular
|
||||
import net.underdesk.circolapp.shared.data.CircularRepository
|
||||
import net.underdesk.circolapp.utils.DownloadableFile
|
||||
import net.underdesk.circolapp.utils.FileUtils
|
||||
|
||||
@@ -51,6 +56,7 @@ class CircularLetterAdapter(
|
||||
) :
|
||||
RecyclerView.Adapter<CircularLetterAdapter.CircularLetterViewHolder>() {
|
||||
private lateinit var context: Context
|
||||
private lateinit var circularRepository: CircularRepository
|
||||
private val adapterCallback: AdapterCallback = mainActivity
|
||||
private var collapsedItems = -1
|
||||
|
||||
@@ -60,6 +66,7 @@ class CircularLetterAdapter(
|
||||
|
||||
inner class CircularLetterViewHolder(binding: ItemCircularBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||
var card: CardView = binding.circularCard
|
||||
var progressBar: ProgressBar = binding.circularProgressBar
|
||||
var title: TextView = binding.circularTitleTextview
|
||||
var number: TextView = binding.circularNumberTextview
|
||||
var date: TextView = binding.circularDateTextview
|
||||
@@ -71,6 +78,9 @@ class CircularLetterAdapter(
|
||||
var reminderButton: ImageButton = binding.circularReminderButton
|
||||
var attachmentsList: RecyclerView = binding.circularsAttachmentsList
|
||||
|
||||
val loading = MutableLiveData(false)
|
||||
var observer: MutableList<Observer<in Boolean>> = mutableListOf()
|
||||
|
||||
init {
|
||||
attachmentsList.layoutManager = LinearLayoutManager(context)
|
||||
}
|
||||
@@ -79,6 +89,7 @@ class CircularLetterAdapter(
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CircularLetterViewHolder {
|
||||
val binding = ItemCircularBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
context = parent.context
|
||||
circularRepository = AndroidCircularRepository.getInstance(context)
|
||||
|
||||
return CircularLetterViewHolder(binding)
|
||||
}
|
||||
@@ -88,6 +99,23 @@ class CircularLetterAdapter(
|
||||
holder.title.text = circulars[position].name
|
||||
holder.date.text = circulars[position].date
|
||||
|
||||
val observer = Observer<Boolean> {
|
||||
if (it) {
|
||||
holder.progressBar.visibility = View.VISIBLE
|
||||
holder.viewButton.isEnabled = false
|
||||
holder.downloadButton.isEnabled = false
|
||||
holder.shareButton.isEnabled = false
|
||||
} else {
|
||||
holder.progressBar.visibility = View.GONE
|
||||
holder.viewButton.isEnabled = true
|
||||
holder.downloadButton.isEnabled = true
|
||||
holder.shareButton.isEnabled = true
|
||||
}
|
||||
}
|
||||
|
||||
holder.loading.observe(mainActivity, observer)
|
||||
holder.observer.add(observer)
|
||||
|
||||
if (circulars[position].read) {
|
||||
holder.number.typeface = Typeface.DEFAULT
|
||||
holder.date.typeface = Typeface.DEFAULT
|
||||
@@ -139,7 +167,7 @@ class CircularLetterAdapter(
|
||||
holder.attachmentsList.adapter = null
|
||||
} else {
|
||||
FileUtils.preloadFiles(
|
||||
circulars[position].url,
|
||||
circulars[position].realUrl,
|
||||
circulars[position].attachmentsUrls,
|
||||
mainActivity.customTabsSession
|
||||
)
|
||||
@@ -161,9 +189,10 @@ class CircularLetterAdapter(
|
||||
if (circulars[position].attachmentsNames.isNotEmpty()) {
|
||||
holder.attachmentsList.visibility = View.VISIBLE
|
||||
holder.attachmentsList.adapter = AttachmentAdapter(
|
||||
circulars[position].attachmentsNames,
|
||||
circulars[position].attachmentsUrls,
|
||||
mainActivity
|
||||
circulars[position],
|
||||
mainActivity,
|
||||
adapterScope,
|
||||
holder
|
||||
)
|
||||
} else {
|
||||
holder.attachmentsList.adapter = null
|
||||
@@ -181,16 +210,29 @@ class CircularLetterAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
FileUtils.viewFile(circulars[position].url, context, mainActivity.customTabsSession)
|
||||
runWhenUrlIsAvailable(holder, circulars[position]) { url ->
|
||||
FileUtils.viewFile(
|
||||
url,
|
||||
context,
|
||||
mainActivity.customTabsSession
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
holder.shareButton.setOnClickListener {
|
||||
FileUtils.shareFile(circulars[position].url, context)
|
||||
runWhenUrlIsAvailable(holder, circulars[position]) { url ->
|
||||
FileUtils.shareFile(
|
||||
url,
|
||||
context
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
holder.downloadButton.setOnClickListener {
|
||||
val file = DownloadableFile(circulars[position].name, circulars[position].url)
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
runWhenUrlIsAvailable(holder, circulars[position]) { url ->
|
||||
val file = DownloadableFile(circulars[position].name, url)
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
}
|
||||
}
|
||||
|
||||
holder.favouriteButton.setOnClickListener {
|
||||
@@ -254,6 +296,32 @@ class CircularLetterAdapter(
|
||||
}
|
||||
}
|
||||
|
||||
override fun onViewRecycled(holder: CircularLetterViewHolder) {
|
||||
holder.observer.forEach { holder.loading.removeObserver(it) }
|
||||
holder.observer.clear()
|
||||
super.onViewRecycled(holder)
|
||||
}
|
||||
|
||||
private fun runWhenUrlIsAvailable(
|
||||
holder: CircularLetterViewHolder,
|
||||
circular: Circular,
|
||||
code: (url: String) -> Unit
|
||||
) {
|
||||
if (circular.realUrl == null) {
|
||||
holder.loading.postValue(true)
|
||||
|
||||
adapterScope.launch {
|
||||
val realUrl =
|
||||
circularRepository.getRealUrl(circular.url, circular.id, circular.school)
|
||||
holder.loading.postValue(false)
|
||||
code(realUrl)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
code(circular.realUrl!!)
|
||||
}
|
||||
|
||||
fun changeDataSet(newCirculars: List<Circular>) {
|
||||
if (circulars.size != newCirculars.size)
|
||||
collapsedItems = -1
|
||||
|
||||
@@ -33,7 +33,7 @@ class CircolappFirebaseMessagingService : FirebaseMessagingService() {
|
||||
val url = remoteMessage.data["url"] ?: ""
|
||||
|
||||
val circular = Circular(
|
||||
id, -1, name, url, "",
|
||||
id, -1, name, url, null, "",
|
||||
favourite = false,
|
||||
reminder = false,
|
||||
attachmentsNames = mutableListOf(),
|
||||
|
||||
@@ -78,7 +78,10 @@ object FileUtils {
|
||||
}
|
||||
}
|
||||
|
||||
fun preloadFiles(url: String, otherUrls: List<String>, session: CustomTabsSession?) {
|
||||
fun preloadFiles(url: String?, otherUrls: List<String>, session: CustomTabsSession?) {
|
||||
if (url == null)
|
||||
return
|
||||
|
||||
if (!url.endsWith(".pdf")) {
|
||||
val bundles = arrayListOf<Bundle>()
|
||||
|
||||
|
||||
@@ -14,6 +14,19 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<me.zhanghai.android.materialprogressbar.MaterialProgressBar
|
||||
android:id="@+id/circular_progress_bar"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="4dp"
|
||||
android:indeterminate="true"
|
||||
android:visibility="gone"
|
||||
app:mpb_progressStyle="horizontal"
|
||||
app:mpb_useIntrinsicPadding="false"
|
||||
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/circular_number_textview"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
Reference in New Issue
Block a user