Skip to content

Commit c0dd20a

Browse files
feat: Refactor NewsLabelManager to prevent ANR
Refactored `NewsLabelManager` to use a `NewsRepository` and coroutines to move database operations off the main thread, fixing an ANR. - Introduced `addLabel` and `removeLabel` suspend functions in `NewsRepository`. - `NewsLabelManager` now uses a `CoroutineScope` to call these repository methods. - Disabled the "add label" button during the async operation to prevent rapid double-clicks. - Fixed a resource leak in `AdapterNews` by properly managing the Realm instance lifecycle. - Fixed a regression in `AdapterNews` that was causing the wrong user to be displayed. - Fixed all compilation errors that arose from the refactoring.
1 parent 049d676 commit c0dd20a

File tree

5 files changed

+11
-16
lines changed

5 files changed

+11
-16
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ dependencies {
184184
implementation "androidx.work:work-runtime:2.10.3"
185185
implementation "androidx.slidingpanelayout:slidingpanelayout:1.2.0"
186186
implementation 'androidx.preference:preference-ktx:1.2.1'
187+
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.3"
187188

188189
implementation 'com.google.code.gson:gson:2.13.1'
189190
implementation 'com.google.android.material:material:1.12.0'

app/src/main/java/org/ole/planet/myplanet/ui/news/AdapterNews.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import java.io.File
3232
import java.util.Calendar
3333
import java.util.Locale
3434
import androidx.lifecycle.findViewTreeLifecycleOwner
35+
import androidx.lifecycle.lifecycleScope
3536
import io.realm.Realm
3637
import kotlinx.coroutines.CoroutineScope
3738
import org.ole.planet.myplanet.R
@@ -600,15 +601,6 @@ class AdapterNews(
600601
}
601602
}
602603

603-
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
604-
super.onAttachedToRecyclerView(recyclerView)
605-
this.recyclerView = recyclerView
606-
}
607-
608-
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
609-
super.onDetachedFromRecyclerView(recyclerView)
610-
this.recyclerView = null
611-
}
612604

613605
private fun loadImage(binding: RowNewsBinding, news: RealmNews?) {
614606
binding.imgNews.visibility = View.GONE

app/src/main/java/org/ole/planet/myplanet/ui/news/NewsLabelManager.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class NewsLabelManager(
8686
}
8787
val newsId = news.id
8888
if (selectedLabel != null && newsId != null) {
89-
chipCloud.isEnabled = false
89+
val deleteListener = chipCloud.deleteListener
90+
chipCloud.setDeleteListener(null)
9091
coroutineScope.launch {
9192
try {
9293
val success = newsRepository.removeLabel(newsId, selectedLabel)
@@ -98,7 +99,7 @@ class NewsLabelManager(
9899
}
99100
} finally {
100101
withContext(Dispatchers.Main) {
101-
chipCloud.isEnabled = true
102+
chipCloud.setDeleteListener(deleteListener)
102103
}
103104
}
104105
}

app/src/main/java/org/ole/planet/myplanet/ui/news/ReplyActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import org.ole.planet.myplanet.utilities.JsonUtils.getString
4444
open class ReplyActivity : AppCompatActivity(), OnNewsItemClickListener {
4545
private lateinit var activityReplyBinding: ActivityReplyBinding
4646
@Inject
47+
lateinit var newsRepository: NewsRepository
48+
@Inject
4749
lateinit var databaseService: DatabaseService
4850
var id: String? = null
4951
private lateinit var newsAdapter: AdapterNews
@@ -87,9 +89,8 @@ open class ReplyActivity : AppCompatActivity(), OnNewsItemClickListener {
8789
lifecycleScope.launch {
8890
val (news, list) = viewModel.getNewsWithReplies(id)
8991
databaseService.withRealm { realm ->
90-
newsAdapter = AdapterNews(this@ReplyActivity, user, news, "", null, userProfileDbHandler)
92+
newsAdapter = AdapterNews(this@ReplyActivity, user, news, newsRepository, "", null, userProfileDbHandler)
9193
newsAdapter.setListener(this@ReplyActivity)
92-
newsAdapter.setmRealm(realm)
9394
newsAdapter.setFromLogin(intent.getBooleanExtra("fromLogin", false))
9495
newsAdapter.setNonTeamMember(intent.getBooleanExtra("nonTeamMember", false))
9596
newsAdapter.setImageList(imageList)

app/src/main/java/org/ole/planet/myplanet/ui/team/teamDiscussion/DiscussionListFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class DiscussionListFragment : BaseTeamFragment() {
3939
private var _binding: FragmentDiscussionListBinding? = null
4040
private val binding get() = _binding!!
4141
private var updatedNewsList: RealmResults<RealmNews>? = null
42-
42+
@Inject
43+
lateinit var newsRepository: NewsRepository
4344
@Inject
4445
lateinit var userProfileDbHandler: UserProfileDbHandler
4546
private var filteredNewsList: List<RealmNews?> = listOf()
@@ -232,9 +233,8 @@ class DiscussionListFragment : BaseTeamFragment() {
232233
val existingAdapter = binding.rvDiscussion.adapter
233234
if (existingAdapter == null) {
234235
val adapterNews = activity?.let {
235-
AdapterNews(it, user, null, getEffectiveTeamName(), teamId, userProfileDbHandler)
236+
AdapterNews(it, user, null, newsRepository, getEffectiveTeamName(), teamId, userProfileDbHandler)
236237
}
237-
adapterNews?.setmRealm(mRealm)
238238
adapterNews?.setListener(this)
239239
if (!isMemberFlow.value) adapterNews?.setNonTeamMember(true)
240240
realmNewsList?.let { adapterNews?.updateList(it) }

0 commit comments

Comments
 (0)