From 82b97fc49fa8d269704c832c7ebbc20a1c0e2066 Mon Sep 17 00:00:00 2001 From: Shashank Kumar <126143257+shashankiitbhu@users.noreply.github.com> Date: Sun, 31 Mar 2024 12:06:41 +0530 Subject: [PATCH] Fix Crash EditDescriptionActivity when switched dark/light mode (#5503) * Fix Crash EditDescriptionActivity when switched dark/light mode * tests added * fix * code cleanup * code cleanup * Fix * Fix --- .../nrw/commons/OkHttpConnectionFactory.java | 2 +- .../description/DescriptionEditActivity.kt | 90 +++++++++++++++---- .../commons/media/MediaDetailFragment.java | 5 +- .../DescriptionEditActivityUnitTest.kt | 11 ++- 4 files changed, 90 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java index b475b3995..a3cef1172 100644 --- a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java +++ b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java @@ -34,7 +34,7 @@ public final class OkHttpConnectionFactory { private static OkHttpClient createClient(final CommonsCookieJar cookieJar) { return new OkHttpClient.Builder() .cookieJar(cookieJar) - .cache(new Cache(new File(CommonsApplication.getInstance().getCacheDir(), CACHE_DIR_NAME), NET_CACHE_SIZE)) + .cache((CommonsApplication.getInstance()!=null) ? new Cache(new File(CommonsApplication.getInstance().getCacheDir(), CACHE_DIR_NAME), NET_CACHE_SIZE) : null) .connectTimeout(120, TimeUnit.SECONDS) .writeTimeout(120, TimeUnit.SECONDS) .readTimeout(120, TimeUnit.SECONDS) diff --git a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt index ac0139880..26aae0b45 100644 --- a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt @@ -1,6 +1,5 @@ package fr.free.nrw.commons.description -import android.app.Activity.RESULT_OK import android.app.ProgressDialog import android.content.Intent import android.os.Bundle @@ -9,10 +8,10 @@ import android.speech.RecognizerIntent import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import fr.free.nrw.commons.Media import fr.free.nrw.commons.R import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding import fr.free.nrw.commons.description.EditDescriptionConstants.LIST_OF_DESCRIPTION_AND_CAPTION -import fr.free.nrw.commons.description.EditDescriptionConstants.UPDATED_WIKITEXT import fr.free.nrw.commons.description.EditDescriptionConstants.WIKITEXT import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao import fr.free.nrw.commons.settings.Prefs @@ -20,6 +19,9 @@ import fr.free.nrw.commons.theme.BaseActivity import fr.free.nrw.commons.upload.UploadMediaDetail import fr.free.nrw.commons.upload.UploadMediaDetailAdapter import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.functions.Consumer +import io.reactivex.schedulers.Schedulers import timber.log.Timber import javax.inject.Inject @@ -43,6 +45,11 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi */ var wikiText: String? = null + /** + * Media object + */ + var media: Media? = null + /** * Saved language */ @@ -60,6 +67,10 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi private val REQUEST_CODE_FOR_VOICE_INPUT = 1213 + private var descriptionAndCaptions: ArrayList? = null + + @Inject lateinit var descriptionEditHelper: DescriptionEditHelper + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -67,10 +78,19 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi setContentView(binding.root) val bundle = intent.extras - val descriptionAndCaptions: ArrayList = - bundle!!.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)!! - wikiText = bundle.getString(WIKITEXT) - savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!! + + if (savedInstanceState != null) { + descriptionAndCaptions = savedInstanceState.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION) + wikiText = savedInstanceState.getString(WIKITEXT) + savedLanguageValue = savedInstanceState.getString(Prefs.DESCRIPTION_LANGUAGE)!! + media = savedInstanceState.getParcelable("media") + } else { + descriptionAndCaptions = + bundle!!.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)!! + wikiText = bundle.getString(WIKITEXT) + savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!! + media = bundle.getParcelable("media") + } initRecyclerView(descriptionAndCaptions) binding.btnEditSubmit.setOnClickListener(::onSubmitButtonClicked) @@ -122,7 +142,7 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi } private fun onBackButtonClicked(view: View) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } private fun onSubmitButtonClicked(view: View) { @@ -164,16 +184,47 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi buffer.replace(", $".toRegex(), "") buffer.append(descriptionEnd) } - val returningIntent = Intent() - returningIntent.putExtra(UPDATED_WIKITEXT, buffer.toString()) - returningIntent.putParcelableArrayListExtra( - LIST_OF_DESCRIPTION_AND_CAPTION, - uploadMediaDetails as ArrayList - ) - setResult(RESULT_OK, returningIntent) + editDescription(media!!, buffer.toString(), uploadMediaDetails as ArrayList) + finish() } + /** + * Edits description and caption + * @param media media object + * @param updatedWikiText updated wiki text + * @param uploadMediaDetails descriptions and captions + */ + private fun editDescription(media : Media, updatedWikiText : String, uploadMediaDetails : ArrayList){ + descriptionEditHelper?.addDescription( + applicationContext, media, + updatedWikiText + ) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(Consumer { s: Boolean? -> Timber.d("Descriptions are added.") })?.let { + compositeDisposable.add( + it + ) + } + + val updatedCaptions = LinkedHashMap() + for (mediaDetail in uploadMediaDetails) { + compositeDisposable.add( + descriptionEditHelper!!.addCaption( + applicationContext, media, + mediaDetail.languageCode, mediaDetail.captionText + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { s: Boolean? -> + updatedCaptions[mediaDetail.languageCode!!] = mediaDetail.captionText + media.captions = updatedCaptions + Timber.d("Caption is added.") + }) + } + } + private fun showLoggingProgressBar() { progressDialog = ProgressDialog(this) progressDialog!!.isIndeterminate = true @@ -193,4 +244,13 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi else { Timber.e("Error %s", resultCode) } } } -} \ No newline at end of file + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + + outState.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetailAdapter.items as ArrayList) + outState.putString(WIKITEXT, wikiText) + outState.putString(Prefs.DESCRIPTION_LANGUAGE, savedLanguageValue) + //save Media + outState.putParcelable("media", media) + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 40bc5a1d4..249494caa 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -402,6 +402,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements } } ); + binding.progressBarEdit.setVisibility(GONE); + binding.descriptionEdit.setVisibility(VISIBLE); } @Override @@ -967,8 +969,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, descriptionAndCaptions); bundle.putString(WIKITEXT, s); bundle.putString(Prefs.DESCRIPTION_LANGUAGE, applicationKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, "")); + bundle.putParcelable("media", media); intent.putExtras(bundle); - startActivityForResult(intent, REQUEST_CODE_EDIT_DESCRIPTION); + startActivity(intent); } /** diff --git a/app/src/test/kotlin/fr/free/nrw/commons/description/DescriptionEditActivityUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/description/DescriptionEditActivityUnitTest.kt index b2a33bc23..f7b203cfa 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/description/DescriptionEditActivityUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/description/DescriptionEditActivityUnitTest.kt @@ -11,6 +11,7 @@ import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.test.core.app.ApplicationProvider +import fr.free.nrw.commons.Media import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding @@ -55,6 +56,8 @@ class DescriptionEditActivityUnitTest { @Mock private lateinit var rvDescriptions: RecyclerView + private lateinit var media: Media + @Before @Throws(Exception::class) fun setUp() { @@ -62,11 +65,15 @@ class DescriptionEditActivityUnitTest { context = ApplicationProvider.getApplicationContext() uploadMediaDetails = mutableListOf(UploadMediaDetail("en", "desc")) as ArrayList + media = Media("filename", "creator", "url", "thumburl", + "localpath", Date(197000), "extmetadata") + val intent = Intent().putExtra("title", "read") val bundle = Bundle() bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetails) bundle.putString(WIKITEXT, "desc") bundle.putString(Prefs.DESCRIPTION_LANGUAGE, "bn") + bundle.putParcelable("media", media) intent.putExtras(bundle) activity = Robolectric.buildActivity(DescriptionEditActivity::class.java, intent).create().get() @@ -78,6 +85,8 @@ class DescriptionEditActivityUnitTest { Whitebox.setInternalState(activity, "rvDescriptions", rvDescriptions) Whitebox.setInternalState(activity, "binding", binding) Whitebox.setInternalState(activity, "savedLanguageValue", "bn") + Whitebox.setInternalState(activity, "media", media) + Whitebox.setInternalState(activity,"descriptionAndCaptions",uploadMediaDetails) `when`(uploadMediaDetailAdapter.items).thenReturn(uploadMediaDetails) } @@ -164,4 +173,4 @@ class DescriptionEditActivityUnitTest { assertEquals(dialog.isShowing, true) } -} \ No newline at end of file +}