mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
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:
parent
5a508ae417
commit
82b97fc49f
4 changed files with 90 additions and 18 deletions
|
|
@ -34,7 +34,7 @@ public final class OkHttpConnectionFactory {
|
||||||
private static OkHttpClient createClient(final CommonsCookieJar cookieJar) {
|
private static OkHttpClient createClient(final CommonsCookieJar cookieJar) {
|
||||||
return new OkHttpClient.Builder()
|
return new OkHttpClient.Builder()
|
||||||
.cookieJar(cookieJar)
|
.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)
|
.connectTimeout(120, TimeUnit.SECONDS)
|
||||||
.writeTimeout(120, TimeUnit.SECONDS)
|
.writeTimeout(120, TimeUnit.SECONDS)
|
||||||
.readTimeout(120, TimeUnit.SECONDS)
|
.readTimeout(120, TimeUnit.SECONDS)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package fr.free.nrw.commons.description
|
package fr.free.nrw.commons.description
|
||||||
|
|
||||||
import android.app.Activity.RESULT_OK
|
|
||||||
import android.app.ProgressDialog
|
import android.app.ProgressDialog
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
|
@ -9,10 +8,10 @@ import android.speech.RecognizerIntent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import fr.free.nrw.commons.Media
|
||||||
import fr.free.nrw.commons.R
|
import fr.free.nrw.commons.R
|
||||||
import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding
|
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.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.description.EditDescriptionConstants.WIKITEXT
|
||||||
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
|
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
|
||||||
import fr.free.nrw.commons.settings.Prefs
|
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.UploadMediaDetail
|
||||||
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
|
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
|
||||||
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
|
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 timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
@ -43,6 +45,11 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
*/
|
*/
|
||||||
var wikiText: String? = null
|
var wikiText: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Media object
|
||||||
|
*/
|
||||||
|
var media: Media? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saved language
|
* Saved language
|
||||||
*/
|
*/
|
||||||
|
|
@ -60,6 +67,10 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
|
|
||||||
private val REQUEST_CODE_FOR_VOICE_INPUT = 1213
|
private val REQUEST_CODE_FOR_VOICE_INPUT = 1213
|
||||||
|
|
||||||
|
private var descriptionAndCaptions: ArrayList<UploadMediaDetail>? = null
|
||||||
|
|
||||||
|
@Inject lateinit var descriptionEditHelper: DescriptionEditHelper
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
|
@ -67,10 +78,19 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
val bundle = intent.extras
|
val bundle = intent.extras
|
||||||
val descriptionAndCaptions: ArrayList<UploadMediaDetail> =
|
|
||||||
bundle!!.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)!!
|
if (savedInstanceState != null) {
|
||||||
wikiText = bundle.getString(WIKITEXT)
|
descriptionAndCaptions = savedInstanceState.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)
|
||||||
savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!!
|
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)
|
initRecyclerView(descriptionAndCaptions)
|
||||||
|
|
||||||
binding.btnEditSubmit.setOnClickListener(::onSubmitButtonClicked)
|
binding.btnEditSubmit.setOnClickListener(::onSubmitButtonClicked)
|
||||||
|
|
@ -122,7 +142,7 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onBackButtonClicked(view: View) {
|
private fun onBackButtonClicked(view: View) {
|
||||||
onBackPressed()
|
onBackPressedDispatcher.onBackPressed()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSubmitButtonClicked(view: View) {
|
private fun onSubmitButtonClicked(view: View) {
|
||||||
|
|
@ -164,16 +184,47 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
buffer.replace(", $".toRegex(), "")
|
buffer.replace(", $".toRegex(), "")
|
||||||
buffer.append(descriptionEnd)
|
buffer.append(descriptionEnd)
|
||||||
}
|
}
|
||||||
val returningIntent = Intent()
|
editDescription(media!!, buffer.toString(), uploadMediaDetails as ArrayList<UploadMediaDetail>)
|
||||||
returningIntent.putExtra(UPDATED_WIKITEXT, buffer.toString())
|
|
||||||
returningIntent.putParcelableArrayListExtra(
|
|
||||||
LIST_OF_DESCRIPTION_AND_CAPTION,
|
|
||||||
uploadMediaDetails as ArrayList<out Parcelable?>
|
|
||||||
)
|
|
||||||
setResult(RESULT_OK, returningIntent)
|
|
||||||
finish()
|
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() {
|
private fun showLoggingProgressBar() {
|
||||||
progressDialog = ProgressDialog(this)
|
progressDialog = ProgressDialog(this)
|
||||||
progressDialog!!.isIndeterminate = true
|
progressDialog!!.isIndeterminate = true
|
||||||
|
|
@ -193,4 +244,13 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
|
||||||
else { Timber.e("Error %s", resultCode) }
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -402,6 +402,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
binding.progressBarEdit.setVisibility(GONE);
|
||||||
|
binding.descriptionEdit.setVisibility(VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -967,8 +969,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
||||||
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, descriptionAndCaptions);
|
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, descriptionAndCaptions);
|
||||||
bundle.putString(WIKITEXT, s);
|
bundle.putString(WIKITEXT, s);
|
||||||
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, applicationKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""));
|
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, applicationKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""));
|
||||||
|
bundle.putParcelable("media", media);
|
||||||
intent.putExtras(bundle);
|
intent.putExtras(bundle);
|
||||||
startActivityForResult(intent, REQUEST_CODE_EDIT_DESCRIPTION);
|
startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.test.core.app.ApplicationProvider
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import fr.free.nrw.commons.Media
|
||||||
import fr.free.nrw.commons.R
|
import fr.free.nrw.commons.R
|
||||||
import fr.free.nrw.commons.TestCommonsApplication
|
import fr.free.nrw.commons.TestCommonsApplication
|
||||||
import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding
|
import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding
|
||||||
|
|
@ -55,6 +56,8 @@ class DescriptionEditActivityUnitTest {
|
||||||
@Mock
|
@Mock
|
||||||
private lateinit var rvDescriptions: RecyclerView
|
private lateinit var rvDescriptions: RecyclerView
|
||||||
|
|
||||||
|
private lateinit var media: Media
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
|
|
@ -62,11 +65,15 @@ class DescriptionEditActivityUnitTest {
|
||||||
context = ApplicationProvider.getApplicationContext()
|
context = ApplicationProvider.getApplicationContext()
|
||||||
uploadMediaDetails = mutableListOf(UploadMediaDetail("en", "desc"))
|
uploadMediaDetails = mutableListOf(UploadMediaDetail("en", "desc"))
|
||||||
as ArrayList<UploadMediaDetail>
|
as ArrayList<UploadMediaDetail>
|
||||||
|
media = Media("filename", "creator", "url", "thumburl",
|
||||||
|
"localpath", Date(197000), "extmetadata")
|
||||||
|
|
||||||
val intent = Intent().putExtra("title", "read")
|
val intent = Intent().putExtra("title", "read")
|
||||||
val bundle = Bundle()
|
val bundle = Bundle()
|
||||||
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetails)
|
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetails)
|
||||||
bundle.putString(WIKITEXT, "desc")
|
bundle.putString(WIKITEXT, "desc")
|
||||||
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, "bn")
|
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, "bn")
|
||||||
|
bundle.putParcelable("media", media)
|
||||||
intent.putExtras(bundle)
|
intent.putExtras(bundle)
|
||||||
activity =
|
activity =
|
||||||
Robolectric.buildActivity(DescriptionEditActivity::class.java, intent).create().get()
|
Robolectric.buildActivity(DescriptionEditActivity::class.java, intent).create().get()
|
||||||
|
|
@ -78,6 +85,8 @@ class DescriptionEditActivityUnitTest {
|
||||||
Whitebox.setInternalState(activity, "rvDescriptions", rvDescriptions)
|
Whitebox.setInternalState(activity, "rvDescriptions", rvDescriptions)
|
||||||
Whitebox.setInternalState(activity, "binding", binding)
|
Whitebox.setInternalState(activity, "binding", binding)
|
||||||
Whitebox.setInternalState(activity, "savedLanguageValue", "bn")
|
Whitebox.setInternalState(activity, "savedLanguageValue", "bn")
|
||||||
|
Whitebox.setInternalState(activity, "media", media)
|
||||||
|
Whitebox.setInternalState(activity,"descriptionAndCaptions",uploadMediaDetails)
|
||||||
`when`(uploadMediaDetailAdapter.items).thenReturn(uploadMediaDetails)
|
`when`(uploadMediaDetailAdapter.items).thenReturn(uploadMediaDetails)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,4 +173,4 @@ class DescriptionEditActivityUnitTest {
|
||||||
assertEquals(dialog.isShowing, true)
|
assertEquals(dialog.isShowing, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue