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..78a3933f83 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 @@ -28,6 +28,7 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsContract.View, PendingUploadsAdapter.Callback { + // final-state:Non-nullable lateinit var as the Presenter is always initialized. @Inject lateinit var pendingUploadsPresenter: PendingUploadsPresenter @@ -60,10 +61,6 @@ class PendingUploadsFragment : return binding.root } - fun initAdapter() { - adapter = PendingUploadsAdapter(this) - } - override fun onViewCreated( view: View, savedInstanceState: Bundle?, @@ -72,6 +69,10 @@ class PendingUploadsFragment : initRecyclerView() } + fun initAdapter() { + adapter = PendingUploadsAdapter(this) + } + /** * Initializes the recycler view. */ @@ -81,38 +82,38 @@ class PendingUploadsFragment : 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++ + 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 (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) + if (contributionsSize == 0) { + binding.nopendingTextView.visibility = View.VISIBLE + binding.pendingUplaodsLl.visibility = View.GONE + uploadProgressActivity.hidePendingIcons() } 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) + } } } - } } /** @@ -140,19 +141,24 @@ class PendingUploadsFragment : /** * Restarts all the paused uploads. */ - fun restartUploads() = pendingUploadsPresenter.restartUploads( - contributionsList, 0, requireContext().applicationContext - ) + fun restartUploads() { + pendingUploadsPresenter.restartUploads( + contributionsList, 0, requireContext().applicationContext + ) + } /** * 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. */ fun deleteUploads() { + //final change:thee redundant 'if (!::pendingUploadsPresenter.isInitialized) return' is removed. val activity = requireActivity() val locale = Locale.getDefault() showAlertDialog( @@ -175,4 +181,4 @@ class PendingUploadsFragment : {}, ) } -} +} \ No newline at end of file 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..0fafeb79b6 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,38 @@ class UploadProgressActivity : BaseActivity() { setTabs() } + //helper to retrieve the current Fragment by CLASS TYPE (as suggested). + private fun getPendingUploadsFragment(): PendingUploadsFragment? { + //find the Fragment by class type, not index + return supportFragmentManager.fragments.find { + it is PendingUploadsFragment && it.isAdded + } as? PendingUploadsFragment + } + + private fun getFailedUploadsFragment(): FailedUploadsFragment? { + //find the Fragment by class type, not index + 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 pendingUploadsFragment: Fragment + val failedUploadsFragment: Fragment + + // using the robust getPendingUploadsFragment() helper + pendingUploadsFragment = getPendingUploadsFragment() ?: PendingUploadsFragment() + failedUploadsFragment = getFailedUploadsFragment() ?: FailedUploadsFragment() viewPagerAdapter!!.setTabs( - R.string.pending to pendingUploadsFragment!!, - R.string.failed to failedUploadsFragment!! + R.string.pending to pendingUploadsFragment, + R.string.failed to failedUploadsFragment ) viewPagerAdapter!!.notifyDataSetChanged() } @@ -119,7 +137,8 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.pause), ).setIcon(R.drawable.pause_icon) .setOnMenuItemClickListener { - pendingUploadsFragment!!.pauseUploads() + //robust helper to find the correct instance + getPendingUploadsFragment()?.pauseUploads() setPausedIcon(true) true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) @@ -133,7 +152,8 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.cancel), ).setIcon(R.drawable.ic_cancel_upload) .setOnMenuItemClickListener { - pendingUploadsFragment!!.deleteUploads() + //robust helper to find the correct instance + getPendingUploadsFragment()?.deleteUploads() true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) } @@ -147,7 +167,8 @@ class UploadProgressActivity : BaseActivity() { getString(R.string.resume), ).setIcon(R.drawable.play_icon) .setOnMenuItemClickListener { - pendingUploadsFragment!!.restartUploads() + //robust helper to find the correct instance + getPendingUploadsFragment()?.restartUploads() setPausedIcon(false) true }.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) @@ -161,7 +182,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 +195,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) }