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
This commit is contained in:
Shashank Kumar 2024-03-31 12:06:41 +05:30 committed by GitHub
parent 5a508ae417
commit 82b97fc49f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 90 additions and 18 deletions

View file

@ -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)

View file

@ -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<UploadMediaDetail>? = 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<UploadMediaDetail> =
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<out Parcelable?>
)
setResult(RESULT_OK, returningIntent)
editDescription(media!!, buffer.toString(), uploadMediaDetails as ArrayList<UploadMediaDetail>)
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<UploadMediaDetail>){
descriptionEditHelper?.addDescription(
applicationContext, media,
updatedWikiText
)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(Consumer<Boolean> { s: Boolean? -> Timber.d("Descriptions are added.") })?.let {
compositeDisposable.add(
it
)
}
val updatedCaptions = LinkedHashMap<String, String>()
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) }
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetailAdapter.items as ArrayList<out Parcelable?>)
outState.putString(WIKITEXT, wikiText)
outState.putString(Prefs.DESCRIPTION_LANGUAGE, savedLanguageValue)
//save Media
outState.putParcelable("media", media)
}
}

View file

@ -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);
}
/**

View file

@ -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<UploadMediaDetail>
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)
}
}
}