This commit is contained in:
VoidRaven 2025-10-23 17:42:37 +05:30 committed by GitHub
commit 5ab7f5fb50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 84 additions and 56 deletions

View file

@ -28,8 +28,11 @@ class PendingUploadsFragment :
CommonsDaggerSupportFragment(), CommonsDaggerSupportFragment(),
PendingUploadsContract.View, PendingUploadsContract.View,
PendingUploadsAdapter.Callback { PendingUploadsAdapter.Callback {
//fix:public and nullable to allow the dagger injection and prevent crash on the rotation.
@Inject @Inject
lateinit var pendingUploadsPresenter: PendingUploadsPresenter @JvmField
var pendingUploadsPresenter: PendingUploadsPresenter? = null
private lateinit var binding: FragmentPendingUploadsBinding private lateinit var binding: FragmentPendingUploadsBinding
@ -55,15 +58,11 @@ class PendingUploadsFragment :
): View { ): View {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = FragmentPendingUploadsBinding.inflate(inflater, container, false) binding = FragmentPendingUploadsBinding.inflate(inflater, container, false)
pendingUploadsPresenter.onAttachView(this) pendingUploadsPresenter?.onAttachView(this)
initAdapter() initAdapter()
return binding.root return binding.root
} }
fun initAdapter() {
adapter = PendingUploadsAdapter(this)
}
override fun onViewCreated( override fun onViewCreated(
view: View, view: View,
savedInstanceState: Bundle?, savedInstanceState: Bundle?,
@ -72,47 +71,51 @@ class PendingUploadsFragment :
initRecyclerView() initRecyclerView()
} }
fun initAdapter() {
adapter = PendingUploadsAdapter(this)
}
/** /**
* Initializes the recycler view. * Initializes the recycler view.
*/ */
private fun initRecyclerView() { private fun initRecyclerView() {
binding.pendingUploadsRecyclerView.setLayoutManager(LinearLayoutManager(this.context)) binding.pendingUploadsRecyclerView.setLayoutManager(LinearLayoutManager(this.context))
binding.pendingUploadsRecyclerView.adapter = adapter binding.pendingUploadsRecyclerView.adapter = adapter
pendingUploadsPresenter.setup() pendingUploadsPresenter?.setup()
pendingUploadsPresenter.totalContributionList pendingUploadsPresenter?.totalContributionList
.observe(viewLifecycleOwner) { list: PagedList<Contribution> -> ?.observe(viewLifecycleOwner) { list: PagedList<Contribution> ->
contributionsSize = list.size contributionsSize = list.size
contributionsList = mutableListOf() contributionsList = mutableListOf()
var pausedOrQueuedUploads = 0 var pausedOrQueuedUploads = 0
list.forEach { list.forEach {
if (it != null) { if (it != null) {
if (it.state == STATE_PAUSED || if (it.state == STATE_PAUSED ||
it.state == STATE_QUEUED || it.state == STATE_QUEUED ||
it.state == STATE_IN_PROGRESS it.state == STATE_IN_PROGRESS
) { ) {
contributionsList.add(it) contributionsList.add(it)
} }
if (it.state == STATE_PAUSED || it.state == STATE_QUEUED) { if (it.state == STATE_PAUSED || it.state == STATE_QUEUED) {
pausedOrQueuedUploads++ pausedOrQueuedUploads++
}
} }
} }
} if (contributionsSize == 0) {
if (contributionsSize == 0) { binding.nopendingTextView.visibility = View.VISIBLE
binding.nopendingTextView.visibility = View.VISIBLE binding.pendingUplaodsLl.visibility = View.GONE
binding.pendingUplaodsLl.visibility = View.GONE uploadProgressActivity.hidePendingIcons()
uploadProgressActivity.hidePendingIcons()
} else {
binding.nopendingTextView.visibility = View.GONE
binding.pendingUplaodsLl.visibility = View.VISIBLE
adapter.submitList(list)
binding.progressTextView.setText("$contributionsSize uploads left")
if ((pausedOrQueuedUploads == contributionsSize) || CommonsApplication.isPaused) {
uploadProgressActivity.setPausedIcon(true)
} else { } else {
uploadProgressActivity.setPausedIcon(false) binding.nopendingTextView.visibility = View.GONE
binding.pendingUplaodsLl.visibility = View.VISIBLE
adapter.submitList(list)
binding.progressTextView.setText("$contributionsSize uploads left")
if ((pausedOrQueuedUploads == contributionsSize) || CommonsApplication.isPaused) {
uploadProgressActivity.setPausedIcon(true)
} else {
uploadProgressActivity.setPausedIcon(false)
}
} }
} }
}
} }
/** /**
@ -129,7 +132,8 @@ class PendingUploadsFragment :
String.format(locale, activity.getString(R.string.no)), String.format(locale, activity.getString(R.string.no)),
{ {
ViewUtil.showShortToast(context, R.string.cancelling_upload) ViewUtil.showShortToast(context, R.string.cancelling_upload)
pendingUploadsPresenter.deleteUpload( // uses the safe call directly
pendingUploadsPresenter?.deleteUpload(
contribution, requireContext().applicationContext, contribution, requireContext().applicationContext,
) )
}, },
@ -140,19 +144,24 @@ class PendingUploadsFragment :
/** /**
* Restarts all the paused uploads. * Restarts all the paused uploads.
*/ */
fun restartUploads() = pendingUploadsPresenter.restartUploads( fun restartUploads() {
contributionsList, 0, requireContext().applicationContext pendingUploadsPresenter?.restartUploads(
) contributionsList, 0, requireContext().applicationContext
)
}
/** /**
* Pauses all the ongoing uploads. * Pauses all the ongoing uploads.
*/ */
fun pauseUploads() = pendingUploadsPresenter.pauseUploads() fun pauseUploads() { pendingUploadsPresenter?.pauseUploads()
}
/** /**
* Cancels all the uploads after getting a confirmation from the user using Dialog. * Cancels all the uploads after getting a confirmation from the user using Dialog.
*/ */
fun deleteUploads() { fun deleteUploads() {
pendingUploadsPresenter ?: return
val activity = requireActivity() val activity = requireActivity()
val locale = Locale.getDefault() val locale = Locale.getDefault()
showAlertDialog( showAlertDialog(
@ -164,7 +173,7 @@ class PendingUploadsFragment :
{ {
ViewUtil.showShortToast(context, R.string.cancelling_upload) ViewUtil.showShortToast(context, R.string.cancelling_upload)
uploadProgressActivity.hidePendingIcons() uploadProgressActivity.hidePendingIcons()
pendingUploadsPresenter.deleteUploads( pendingUploadsPresenter?.deleteUploads(
listOf( listOf(
STATE_QUEUED, STATE_QUEUED,
STATE_IN_PROGRESS, STATE_IN_PROGRESS,

View file

@ -21,8 +21,6 @@ import javax.inject.Inject
*/ */
class UploadProgressActivity : BaseActivity() { class UploadProgressActivity : BaseActivity() {
private lateinit var binding: ActivityUploadProgressBinding private lateinit var binding: ActivityUploadProgressBinding
private var pendingUploadsFragment: PendingUploadsFragment? = null
private var failedUploadsFragment: FailedUploadsFragment? = null
var viewPagerAdapter: ViewPagerAdapter? = null var viewPagerAdapter: ViewPagerAdapter? = null
var menu: Menu? = null var menu: Menu? = null
@ -68,18 +66,37 @@ class UploadProgressActivity : BaseActivity() {
setTabs() setTabs()
} }
private fun getPendingUploadsFragment(): PendingUploadsFragment? {
return supportFragmentManager.findFragmentByTag(
"android:switcher:${R.id.upload_progress_view_pager}:${0}",
) as? PendingUploadsFragment
}
// the helper to retrieve the current, non-stale FailedUploadsFragment instance.
private fun getFailedUploadsFragment(): FailedUploadsFragment? {
return supportFragmentManager.findFragmentByTag(
"android:switcher:${R.id.upload_progress_view_pager}:${1}",
) as? FailedUploadsFragment
}
/** /**
* Initializes and sets up the tabs data by creating instances of `PendingUploadsFragment` * Initializes and sets up the tabs data by creating instances of `PendingUploadsFragment`
* and `FailedUploadsFragment`, adds them to the `fragmentList`, and assigns corresponding * and `FailedUploadsFragment`, adds them to the `fragmentList`, and assigns corresponding
* titles from resources to the `titleList`. * titles from resources to the `titleList`.
*/ */
fun setTabs() { fun setTabs() {
pendingUploadsFragment = PendingUploadsFragment() val pendingUploadsFragment: Fragment
failedUploadsFragment = FailedUploadsFragment() val failedUploadsFragment: Fragment
// checks if the fragmentManager already has the fragments (after the rotation)
pendingUploadsFragment = getPendingUploadsFragment() ?: PendingUploadsFragment()
failedUploadsFragment = getFailedUploadsFragment() ?: FailedUploadsFragment()
viewPagerAdapter!!.setTabs( viewPagerAdapter!!.setTabs(
R.string.pending to pendingUploadsFragment!!, R.string.pending to pendingUploadsFragment,
R.string.failed to failedUploadsFragment!! R.string.failed to failedUploadsFragment
) )
viewPagerAdapter!!.notifyDataSetChanged() viewPagerAdapter!!.notifyDataSetChanged()
} }
@ -119,7 +136,8 @@ class UploadProgressActivity : BaseActivity() {
getString(R.string.pause), getString(R.string.pause),
).setIcon(R.drawable.pause_icon) ).setIcon(R.drawable.pause_icon)
.setOnMenuItemClickListener { .setOnMenuItemClickListener {
pendingUploadsFragment!!.pauseUploads() //retrieves the current fragment instance just before the use
getPendingUploadsFragment()?.pauseUploads()
setPausedIcon(true) setPausedIcon(true)
true true
}.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
@ -133,7 +151,8 @@ class UploadProgressActivity : BaseActivity() {
getString(R.string.cancel), getString(R.string.cancel),
).setIcon(R.drawable.ic_cancel_upload) ).setIcon(R.drawable.ic_cancel_upload)
.setOnMenuItemClickListener { .setOnMenuItemClickListener {
pendingUploadsFragment!!.deleteUploads() //retrieve the current fragment instance just before thee use
getPendingUploadsFragment()?.deleteUploads()
true true
}.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
} }
@ -147,7 +166,8 @@ class UploadProgressActivity : BaseActivity() {
getString(R.string.resume), getString(R.string.resume),
).setIcon(R.drawable.play_icon) ).setIcon(R.drawable.play_icon)
.setOnMenuItemClickListener { .setOnMenuItemClickListener {
pendingUploadsFragment!!.restartUploads() //retrieve the current fragment instance just before the use
getPendingUploadsFragment()?.restartUploads()
setPausedIcon(false) setPausedIcon(false)
true true
}.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
@ -160,8 +180,7 @@ class UploadProgressActivity : BaseActivity() {
menu!! menu!!
.add(Menu.NONE, R.id.retry_icon, Menu.NONE, getString(R.string.retry)) .add(Menu.NONE, R.id.retry_icon, Menu.NONE, getString(R.string.retry))
.setIcon(R.drawable.ic_refresh_24dp) .setIcon(R.drawable.ic_refresh_24dp)
.setOnMenuItemClickListener { .setOnMenuItemClickListener { getFailedUploadsFragment()?.restartUploads()
failedUploadsFragment!!.restartUploads()
true true
}.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
} }
@ -174,7 +193,7 @@ class UploadProgressActivity : BaseActivity() {
getString(R.string.cancel), getString(R.string.cancel),
).setIcon(R.drawable.ic_cancel_upload) ).setIcon(R.drawable.ic_cancel_upload)
.setOnMenuItemClickListener { .setOnMenuItemClickListener {
failedUploadsFragment!!.deleteUploads() getFailedUploadsFragment()?.deleteUploads()
true true
}.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
} }