Skip to content

Commit 82b97fc

Browse files
Fix Crash EditDescriptionActivity when switched dark/light mode (commons-app#5503)
* Fix Crash EditDescriptionActivity when switched dark/light mode * tests added * fix * code cleanup * code cleanup * Fix * Fix
1 parent 5a508ae commit 82b97fc

File tree

4 files changed

+90
-18
lines changed

4 files changed

+90
-18
lines changed

app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public final class OkHttpConnectionFactory {
3434
private static OkHttpClient createClient(final CommonsCookieJar cookieJar) {
3535
return new OkHttpClient.Builder()
3636
.cookieJar(cookieJar)
37-
.cache(new Cache(new File(CommonsApplication.getInstance().getCacheDir(), CACHE_DIR_NAME), NET_CACHE_SIZE))
37+
.cache((CommonsApplication.getInstance()!=null) ? new Cache(new File(CommonsApplication.getInstance().getCacheDir(), CACHE_DIR_NAME), NET_CACHE_SIZE) : null)
3838
.connectTimeout(120, TimeUnit.SECONDS)
3939
.writeTimeout(120, TimeUnit.SECONDS)
4040
.readTimeout(120, TimeUnit.SECONDS)

app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package fr.free.nrw.commons.description
22

3-
import android.app.Activity.RESULT_OK
43
import android.app.ProgressDialog
54
import android.content.Intent
65
import android.os.Bundle
@@ -9,17 +8,20 @@ import android.speech.RecognizerIntent
98
import android.view.View
109
import androidx.recyclerview.widget.LinearLayoutManager
1110
import androidx.recyclerview.widget.RecyclerView
11+
import fr.free.nrw.commons.Media
1212
import fr.free.nrw.commons.R
1313
import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding
1414
import fr.free.nrw.commons.description.EditDescriptionConstants.LIST_OF_DESCRIPTION_AND_CAPTION
15-
import fr.free.nrw.commons.description.EditDescriptionConstants.UPDATED_WIKITEXT
1615
import fr.free.nrw.commons.description.EditDescriptionConstants.WIKITEXT
1716
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
1817
import fr.free.nrw.commons.settings.Prefs
1918
import fr.free.nrw.commons.theme.BaseActivity
2019
import fr.free.nrw.commons.upload.UploadMediaDetail
2120
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
2221
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
22+
import io.reactivex.android.schedulers.AndroidSchedulers
23+
import io.reactivex.functions.Consumer
24+
import io.reactivex.schedulers.Schedulers
2325
import timber.log.Timber
2426
import javax.inject.Inject
2527

@@ -43,6 +45,11 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
4345
*/
4446
var wikiText: String? = null
4547

48+
/**
49+
* Media object
50+
*/
51+
var media: Media? = null
52+
4653
/**
4754
* Saved language
4855
*/
@@ -60,17 +67,30 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
6067

6168
private val REQUEST_CODE_FOR_VOICE_INPUT = 1213
6269

70+
private var descriptionAndCaptions: ArrayList<UploadMediaDetail>? = null
71+
72+
@Inject lateinit var descriptionEditHelper: DescriptionEditHelper
73+
6374
override fun onCreate(savedInstanceState: Bundle?) {
6475
super.onCreate(savedInstanceState)
6576

6677
binding = ActivityDescriptionEditBinding.inflate(layoutInflater)
6778
setContentView(binding.root)
6879

6980
val bundle = intent.extras
70-
val descriptionAndCaptions: ArrayList<UploadMediaDetail> =
71-
bundle!!.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)!!
72-
wikiText = bundle.getString(WIKITEXT)
73-
savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!!
81+
82+
if (savedInstanceState != null) {
83+
descriptionAndCaptions = savedInstanceState.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)
84+
wikiText = savedInstanceState.getString(WIKITEXT)
85+
savedLanguageValue = savedInstanceState.getString(Prefs.DESCRIPTION_LANGUAGE)!!
86+
media = savedInstanceState.getParcelable("media")
87+
} else {
88+
descriptionAndCaptions =
89+
bundle!!.getParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION)!!
90+
wikiText = bundle.getString(WIKITEXT)
91+
savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!!
92+
media = bundle.getParcelable("media")
93+
}
7494
initRecyclerView(descriptionAndCaptions)
7595

7696
binding.btnEditSubmit.setOnClickListener(::onSubmitButtonClicked)
@@ -122,7 +142,7 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
122142
}
123143

124144
private fun onBackButtonClicked(view: View) {
125-
onBackPressed()
145+
onBackPressedDispatcher.onBackPressed()
126146
}
127147

128148
private fun onSubmitButtonClicked(view: View) {
@@ -164,16 +184,47 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
164184
buffer.replace(", $".toRegex(), "")
165185
buffer.append(descriptionEnd)
166186
}
167-
val returningIntent = Intent()
168-
returningIntent.putExtra(UPDATED_WIKITEXT, buffer.toString())
169-
returningIntent.putParcelableArrayListExtra(
170-
LIST_OF_DESCRIPTION_AND_CAPTION,
171-
uploadMediaDetails as ArrayList<out Parcelable?>
172-
)
173-
setResult(RESULT_OK, returningIntent)
187+
editDescription(media!!, buffer.toString(), uploadMediaDetails as ArrayList<UploadMediaDetail>)
188+
174189
finish()
175190
}
176191

192+
/**
193+
* Edits description and caption
194+
* @param media media object
195+
* @param updatedWikiText updated wiki text
196+
* @param uploadMediaDetails descriptions and captions
197+
*/
198+
private fun editDescription(media : Media, updatedWikiText : String, uploadMediaDetails : ArrayList<UploadMediaDetail>){
199+
descriptionEditHelper?.addDescription(
200+
applicationContext, media,
201+
updatedWikiText
202+
)
203+
?.subscribeOn(Schedulers.io())
204+
?.observeOn(AndroidSchedulers.mainThread())
205+
?.subscribe(Consumer<Boolean> { s: Boolean? -> Timber.d("Descriptions are added.") })?.let {
206+
compositeDisposable.add(
207+
it
208+
)
209+
}
210+
211+
val updatedCaptions = LinkedHashMap<String, String>()
212+
for (mediaDetail in uploadMediaDetails) {
213+
compositeDisposable.add(
214+
descriptionEditHelper!!.addCaption(
215+
applicationContext, media,
216+
mediaDetail.languageCode, mediaDetail.captionText
217+
)
218+
.subscribeOn(Schedulers.io())
219+
.observeOn(AndroidSchedulers.mainThread())
220+
.subscribe { s: Boolean? ->
221+
updatedCaptions[mediaDetail.languageCode!!] = mediaDetail.captionText
222+
media.captions = updatedCaptions
223+
Timber.d("Caption is added.")
224+
})
225+
}
226+
}
227+
177228
private fun showLoggingProgressBar() {
178229
progressDialog = ProgressDialog(this)
179230
progressDialog!!.isIndeterminate = true
@@ -193,4 +244,13 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
193244
else { Timber.e("Error %s", resultCode) }
194245
}
195246
}
196-
}
247+
override fun onSaveInstanceState(outState: Bundle) {
248+
super.onSaveInstanceState(outState)
249+
250+
outState.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetailAdapter.items as ArrayList<out Parcelable?>)
251+
outState.putString(WIKITEXT, wikiText)
252+
outState.putString(Prefs.DESCRIPTION_LANGUAGE, savedLanguageValue)
253+
//save Media
254+
outState.putParcelable("media", media)
255+
}
256+
}

app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,8 @@ public void onGlobalLayout() {
402402
}
403403
}
404404
);
405+
binding.progressBarEdit.setVisibility(GONE);
406+
binding.descriptionEdit.setVisibility(VISIBLE);
405407
}
406408

407409
@Override
@@ -967,8 +969,9 @@ private void extractCaptionDescription(final String s) {
967969
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, descriptionAndCaptions);
968970
bundle.putString(WIKITEXT, s);
969971
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, applicationKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""));
972+
bundle.putParcelable("media", media);
970973
intent.putExtras(bundle);
971-
startActivityForResult(intent, REQUEST_CODE_EDIT_DESCRIPTION);
974+
startActivity(intent);
972975
}
973976

974977
/**

app/src/test/kotlin/fr/free/nrw/commons/description/DescriptionEditActivityUnitTest.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.view.LayoutInflater
1111
import android.view.View
1212
import androidx.recyclerview.widget.RecyclerView
1313
import androidx.test.core.app.ApplicationProvider
14+
import fr.free.nrw.commons.Media
1415
import fr.free.nrw.commons.R
1516
import fr.free.nrw.commons.TestCommonsApplication
1617
import fr.free.nrw.commons.databinding.ActivityDescriptionEditBinding
@@ -55,18 +56,24 @@ class DescriptionEditActivityUnitTest {
5556
@Mock
5657
private lateinit var rvDescriptions: RecyclerView
5758

59+
private lateinit var media: Media
60+
5861
@Before
5962
@Throws(Exception::class)
6063
fun setUp() {
6164
MockitoAnnotations.initMocks(this)
6265
context = ApplicationProvider.getApplicationContext()
6366
uploadMediaDetails = mutableListOf(UploadMediaDetail("en", "desc"))
6467
as ArrayList<UploadMediaDetail>
68+
media = Media("filename", "creator", "url", "thumburl",
69+
"localpath", Date(197000), "extmetadata")
70+
6571
val intent = Intent().putExtra("title", "read")
6672
val bundle = Bundle()
6773
bundle.putParcelableArrayList(LIST_OF_DESCRIPTION_AND_CAPTION, uploadMediaDetails)
6874
bundle.putString(WIKITEXT, "desc")
6975
bundle.putString(Prefs.DESCRIPTION_LANGUAGE, "bn")
76+
bundle.putParcelable("media", media)
7077
intent.putExtras(bundle)
7178
activity =
7279
Robolectric.buildActivity(DescriptionEditActivity::class.java, intent).create().get()
@@ -78,6 +85,8 @@ class DescriptionEditActivityUnitTest {
7885
Whitebox.setInternalState(activity, "rvDescriptions", rvDescriptions)
7986
Whitebox.setInternalState(activity, "binding", binding)
8087
Whitebox.setInternalState(activity, "savedLanguageValue", "bn")
88+
Whitebox.setInternalState(activity, "media", media)
89+
Whitebox.setInternalState(activity,"descriptionAndCaptions",uploadMediaDetails)
8190
`when`(uploadMediaDetailAdapter.items).thenReturn(uploadMediaDetails)
8291
}
8392

@@ -164,4 +173,4 @@ class DescriptionEditActivityUnitTest {
164173
assertEquals(dialog.isShowing, true)
165174
}
166175

167-
}
176+
}

0 commit comments

Comments
 (0)