diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt index 45e9d90a3e..286610c4ab 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt @@ -55,7 +55,9 @@ class PendingUploadsFragment : ): View { super.onCreate(savedInstanceState) binding = FragmentPendingUploadsBinding.inflate(inflater, container, false) - pendingUploadsPresenter.onAttachView(this) + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.onAttachView(this) + } initAdapter() return binding.root } @@ -78,40 +80,42 @@ class PendingUploadsFragment : private fun initRecyclerView() { binding.pendingUploadsRecyclerView.setLayoutManager(LinearLayoutManager(this.context)) binding.pendingUploadsRecyclerView.adapter = adapter - pendingUploadsPresenter.setup() - pendingUploadsPresenter.totalContributionList - .observe(viewLifecycleOwner) { list: PagedList -> - contributionsSize = list.size - contributionsList = mutableListOf() - var pausedOrQueuedUploads = 0 - list.forEach { - if (it != null) { - if (it.state == STATE_PAUSED || - it.state == STATE_QUEUED || - it.state == STATE_IN_PROGRESS - ) { - contributionsList.add(it) + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.setup() + pendingUploadsPresenter.totalContributionList + .observe(viewLifecycleOwner) { list: PagedList -> + contributionsSize = list.size + contributionsList = mutableListOf() + var pausedOrQueuedUploads = 0 + list.forEach { + if (it != null) { + if (it.state == STATE_PAUSED || + it.state == STATE_QUEUED || + it.state == STATE_IN_PROGRESS + ) { + contributionsList.add(it) + } + if (it.state == STATE_PAUSED || it.state == STATE_QUEUED) { + pausedOrQueuedUploads++ + } + } } - if (it.state == STATE_PAUSED || it.state == STATE_QUEUED) { - pausedOrQueuedUploads++ + if (contributionsSize == 0) { + binding.nopendingTextView.visibility = View.VISIBLE + binding.pendingUplaodsLl.visibility = View.GONE + 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 { + uploadProgressActivity.setPausedIcon(false) + } } } - } - if (contributionsSize == 0) { - binding.nopendingTextView.visibility = View.VISIBLE - binding.pendingUplaodsLl.visibility = View.GONE - 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 { - uploadProgressActivity.setPausedIcon(false) - } - } } } @@ -129,9 +133,11 @@ class PendingUploadsFragment : String.format(locale, activity.getString(R.string.no)), { ViewUtil.showShortToast(context, R.string.cancelling_upload) - pendingUploadsPresenter.deleteUpload( - contribution, requireContext().applicationContext, - ) + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.deleteUpload( + contribution, requireContext().applicationContext, + ) + } }, {}, ) @@ -140,14 +146,22 @@ class PendingUploadsFragment : /** * Restarts all the paused uploads. */ - fun restartUploads() = pendingUploadsPresenter.restartUploads( - contributionsList, 0, requireContext().applicationContext - ) + fun restartUploads() { + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.restartUploads( + contributionsList, 0, requireContext().applicationContext + ) + } + } /** * Pauses all the ongoing uploads. */ - fun pauseUploads() = pendingUploadsPresenter.pauseUploads() + fun pauseUploads() { + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.pauseUploads() + } + } /** * Cancels all the uploads after getting a confirmation from the user using Dialog. @@ -164,13 +178,15 @@ class PendingUploadsFragment : { ViewUtil.showShortToast(context, R.string.cancelling_upload) uploadProgressActivity.hidePendingIcons() - pendingUploadsPresenter.deleteUploads( - listOf( - STATE_QUEUED, - STATE_IN_PROGRESS, - STATE_PAUSED, - ), - ) + if (::pendingUploadsPresenter.isInitialized) { + pendingUploadsPresenter.deleteUploads( + listOf( + STATE_QUEUED, + STATE_IN_PROGRESS, + STATE_PAUSED, + ), + ) + } }, {}, ) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt index 665f106e22..eaa6b95a7e 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt @@ -21,8 +21,6 @@ import javax.inject.Inject */ class UploadProgressActivity : BaseActivity() { private lateinit var binding: ActivityUploadProgressBinding - private var pendingUploadsFragment: PendingUploadsFragment? = null - private var failedUploadsFragment: FailedUploadsFragment? = null var viewPagerAdapter: ViewPagerAdapter? = null var menu: Menu? = null @@ -68,18 +66,37 @@ class UploadProgressActivity : BaseActivity() { setTabs() } + /** + * Helper to retrieve the current PendingUploadsFragment by checking the fragment manager. + */ + private fun getPendingUploadsFragment(): PendingUploadsFragment? { + return supportFragmentManager.fragments.find { + it is PendingUploadsFragment && it.isAdded + } as? PendingUploadsFragment + } + + /** + * Helper to retrieve the current FailedUploadsFragment by checking the fragment manager. + */ + private fun getFailedUploadsFragment(): FailedUploadsFragment? { + return supportFragmentManager.fragments.find { + it is FailedUploadsFragment && it.isAdded + } as? FailedUploadsFragment + } + + /** * Initializes and sets up the tabs data by creating instances of `PendingUploadsFragment` * and `FailedUploadsFragment`, adds them to the `fragmentList`, and assigns corresponding * titles from resources to the `titleList`. */ fun setTabs() { - pendingUploadsFragment = PendingUploadsFragment() - failedUploadsFragment = FailedUploadsFragment() + val pendingFragment = getPendingUploadsFragment() ?: PendingUploadsFragment() + val failedFragment = getFailedUploadsFragment() ?: FailedUploadsFragment() viewPagerAdapter!!.setTabs( - R.string.pending to pendingUploadsFragment!!, - R.string.failed to failedUploadsFragment!! + R.string.pending to pendingFragment, + R.string.failed to failedFragment ) viewPagerAdapter!!.notifyDataSetChanged() } @@ -119,7 +136,7 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.pause), ).setIcon(R.drawable.pause_icon) .setOnMenuItemClickListener { - pendingUploadsFragment!!.pauseUploads() + getPendingUploadsFragment()?.pauseUploads() setPausedIcon(true) true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) @@ -133,7 +150,7 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.cancel), ).setIcon(R.drawable.ic_cancel_upload) .setOnMenuItemClickListener { - pendingUploadsFragment!!.deleteUploads() + getPendingUploadsFragment()?.deleteUploads() true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) } @@ -147,7 +164,7 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.resume), ).setIcon(R.drawable.play_icon) .setOnMenuItemClickListener { - pendingUploadsFragment!!.restartUploads() + getPendingUploadsFragment()?.restartUploads() setPausedIcon(false) true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) @@ -161,7 +178,7 @@ class UploadProgressActivity : BaseActivity() { .add(Menu.NONE, R.id.retry_icon, Menu.NONE, getString(R.string.retry)) .setIcon(R.drawable.ic_refresh_24dp) .setOnMenuItemClickListener { - failedUploadsFragment!!.restartUploads() + getFailedUploadsFragment()?.restartUploads() true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) } @@ -174,7 +191,7 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.cancel), ).setIcon(R.drawable.ic_cancel_upload) .setOnMenuItemClickListener { - failedUploadsFragment!!.deleteUploads() + getFailedUploadsFragment()?.deleteUploads() true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) }