From 2396ac09700a7d3bbddad9a6a6ddbb0a280e8af6 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:24:18 +0530 Subject: [PATCH 1/9] Add coroutine as a dependency in build.gradle --- build.gradle | 1 + library/build.gradle | 3 +++ 2 files changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 631eb0bb4..2dfaf6d3b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ buildscript { ext { kotlinVersion = '1.3.70' androidGradleVersion = '3.6.0' + coroutineVersion = '1.3.4' // Google libraries appCompatVersion = '1.1.0' diff --git a/library/build.gradle b/library/build.gradle index 4515e5f8c..8cae855aa 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -71,6 +71,9 @@ dependencies { implementation "androidx.room:room-runtime:$roomVersion" kapt "androidx.room:room-compiler:$roomVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutineVersion" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutineVersion" + implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.squareup.okhttp3:okhttp:$okhttp3Version" From 8ec798fefaf3a9098f06cee3d9b81df974397300 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:24:56 +0530 Subject: [PATCH 2/9] Migrate AsyncTasks to kotlin coroutines --- .../transaction/TransactionPayloadFragment.kt | 136 ++++++++---------- 1 file changed, 61 insertions(+), 75 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index 7598caa75..8efff8b3b 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -6,7 +6,6 @@ import android.content.Context import android.content.Intent import android.graphics.Color import android.net.Uri -import android.os.AsyncTask import android.os.Build import android.os.Bundle import android.text.SpannableStringBuilder @@ -26,6 +25,11 @@ import androidx.lifecycle.ViewModelProvider import com.chuckerteam.chucker.R import com.chuckerteam.chucker.databinding.ChuckerFragmentTransactionPayloadBinding import com.chuckerteam.chucker.internal.data.entity.HttpTransaction +import kotlinx.android.synthetic.main.chucker_fragment_transaction_payload.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException @@ -33,7 +37,7 @@ import java.io.IOException private const val GET_FILE_FOR_SAVING_REQUEST_CODE: Int = 43 internal class TransactionPayloadFragment : - Fragment(), SearchView.OnQueryTextListener { + Fragment(), SearchView.OnQueryTextListener { private lateinit var payloadBinding: ChuckerFragmentTransactionPayloadBinding @@ -43,8 +47,6 @@ internal class TransactionPayloadFragment : private var type: Int = 0 private lateinit var viewModel: TransactionViewModel - private var payloadLoaderTask: PayloadLoaderTask? = null - private var fileSaverTask: FileSaverTask? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -54,9 +56,9 @@ internal class TransactionPayloadFragment : } override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View? { payloadBinding = ChuckerFragmentTransactionPayloadBinding.inflate(inflater, container, false) return payloadBinding.root @@ -65,20 +67,19 @@ internal class TransactionPayloadFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.transaction.observe( - viewLifecycleOwner, - Observer { transaction -> - if (transaction == null) return@Observer - PayloadLoaderTask(this).execute(Pair(type, transaction)) - } + viewLifecycleOwner, + Observer { transaction -> + if (transaction == null) return@Observer + CoroutineScope(Dispatchers.Main).launch { + showProgress() + val result = processPayload(type, transaction) + responseRecyclerView.adapter = TransactionBodyAdapter(result) + hideProgress() + } + } ) } - override fun onDestroyView() { - super.onDestroyView() - payloadLoaderTask?.cancel(true) - fileSaverTask?.cancel(true) - } - @SuppressLint("NewApi") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { val transaction = viewModel.transaction.value @@ -143,8 +144,8 @@ internal class TransactionPayloadFragment : startActivityForResult(intent, GET_FILE_FOR_SAVING_REQUEST_CODE) } else { Toast.makeText( - requireContext(), R.string.chucker_save_failed_to_open_document, - Toast.LENGTH_SHORT + requireContext(), R.string.chucker_save_failed_to_open_document, + Toast.LENGTH_SHORT ).show() } } @@ -155,8 +156,14 @@ internal class TransactionPayloadFragment : val uri = resultData?.data val transaction = viewModel.transaction.value if (uri != null && transaction != null) { - fileSaverTask = FileSaverTask(this).apply { - execute(Triple(type, uri, transaction)) + CoroutineScope(Dispatchers.Main).launch { + val result = saveToFile(type, uri, transaction) + val toastMessageId = if (result) { + R.string.chucker_file_saved + } else { + R.string.chucker_file_not_saved + } + Toast.makeText(context, toastMessageId, Toast.LENGTH_SHORT).show() } } } @@ -174,22 +181,24 @@ internal class TransactionPayloadFragment : return true } - /** - * Async task responsible of loading in the background the content of the HTTP request/response. - */ - class PayloadLoaderTask(private val fragment: TransactionPayloadFragment) : - AsyncTask, Unit, List>() { - override fun onPreExecute() { - fragment.payloadBinding.apply { - loadingProgress.visibility = View.VISIBLE - responseRecyclerView.visibility = View.INVISIBLE - } + private fun showProgress() { + payloadBinding.apply { + loadingProgress.visibility = View.VISIBLE + responseRecyclerView.visibility = View.INVISIBLE } + } + + private fun hideProgress() { + payloadBinding.apply { + loadingProgress.visibility = View.INVISIBLE + responseRecyclerView.visibility = View.VISIBLE + requireActivity().invalidateOptionsMenu() + } + } - @Suppress("ComplexMethod") - override fun doInBackground(vararg params: Pair): List { - val (type, transaction) = params[0] + private suspend fun processPayload(type: Int, transaction: HttpTransaction): MutableList { + return withContext(Dispatchers.Default) { val result = mutableListOf() val headersString: String @@ -208,9 +217,9 @@ internal class TransactionPayloadFragment : if (headersString.isNotBlank()) { result.add( - TransactionPayloadItem.HeaderItem( - HtmlCompat.fromHtml(headersString, HtmlCompat.FROM_HTML_MODE_LEGACY) - ) + TransactionPayloadItem.HeaderItem( + HtmlCompat.fromHtml(headersString, HtmlCompat.FROM_HTML_MODE_LEGACY) + ) ) } @@ -219,7 +228,7 @@ internal class TransactionPayloadFragment : if (type == TYPE_RESPONSE && responseBitmap != null) { result.add(TransactionPayloadItem.ImageItem(responseBitmap)) } else if (!isBodyPlainText) { - fragment.context?.getString(R.string.chucker_body_omitted)?.let { + context?.getString(R.string.chucker_body_omitted)?.let { result.add(TransactionPayloadItem.BodyLineItem(SpannableStringBuilder.valueOf(it))) } } else { @@ -227,38 +236,25 @@ internal class TransactionPayloadFragment : result.add(TransactionPayloadItem.BodyLineItem(SpannableStringBuilder.valueOf(it))) } } - - return result - } - - override fun onPostExecute(result: List) { - fragment.payloadBinding.apply { - loadingProgress.visibility = View.INVISIBLE - responseRecyclerView.visibility = View.VISIBLE - responseRecyclerView.adapter = TransactionBodyAdapter(result) - } - fragment.requireActivity().invalidateOptionsMenu() + return@withContext result } } - class FileSaverTask(private val fragment: TransactionPayloadFragment) : - AsyncTask, Unit, Boolean>() { - @Suppress("NestedBlockDepth") - override fun doInBackground(vararg params: Triple): Boolean { - val (type, uri, transaction) = params[0] + private suspend fun saveToFile(type: Int, uri: Uri, transaction: HttpTransaction): Boolean { + return withContext(Dispatchers.IO) { try { - val context = fragment.context ?: return false + val context = context ?: return@withContext false context.contentResolver.openFileDescriptor(uri, "w")?.use { FileOutputStream(it.fileDescriptor).use { fos -> when (type) { TYPE_REQUEST -> { transaction.requestBody?.byteInputStream()?.copyTo(fos) - ?: throw IOException(TRANSACTION_EXCEPTION) + ?: throw IOException(TRANSACTION_EXCEPTION) } TYPE_RESPONSE -> { transaction.responseBody?.byteInputStream()?.copyTo(fos) - ?: throw IOException(TRANSACTION_EXCEPTION) + ?: throw IOException(TRANSACTION_EXCEPTION) } else -> { if (transaction.responseImageData != null) { @@ -272,22 +268,12 @@ internal class TransactionPayloadFragment : } } catch (e: FileNotFoundException) { e.printStackTrace() - return false + return@withContext false } catch (e: IOException) { e.printStackTrace() - return false - } - return true - } - - override fun onPostExecute(isSuccessful: Boolean) { - fragment.fileSaverTask = null - val toastMessageId = if (isSuccessful) { - R.string.chucker_file_saved - } else { - R.string.chucker_file_not_saved + return@withContext false } - Toast.makeText(fragment.context, toastMessageId, Toast.LENGTH_SHORT).show() + return@withContext true } } @@ -303,10 +289,10 @@ internal class TransactionPayloadFragment : const val DEFAULT_FILE_PREFIX = "chucker-export-" fun newInstance(type: Int): TransactionPayloadFragment = - TransactionPayloadFragment().apply { - arguments = Bundle().apply { - putInt(ARG_TYPE, type) + TransactionPayloadFragment().apply { + arguments = Bundle().apply { + putInt(ARG_TYPE, type) + } } - } } } From 1048d999d03e27ac58e1a6ea6616c0a5d1d5e961 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 3/9] Migrate executors with the coroutines in repositories --- .../HttpTransactionDatabaseRepository.kt | 17 ++++++++--------- .../RecordedThrowableDatabaseRepository.kt | 11 +++++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt index b9ab71d75..b08ef71f4 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt @@ -5,12 +5,11 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple import com.chuckerteam.chucker.internal.data.room.ChuckerDatabase import com.chuckerteam.chucker.internal.support.distinctUntilChanged -import java.util.concurrent.Executor -import java.util.concurrent.Executors +import kotlinx.coroutines.* internal class HttpTransactionDatabaseRepository(private val database: ChuckerDatabase) : HttpTransactionRepository { - private val executor: Executor = Executors.newSingleThreadExecutor() + private val backgroundScope = CoroutineScope(Dispatchers.IO) private val transactionDao get() = database.transactionDao() @@ -29,14 +28,14 @@ internal class HttpTransactionDatabaseRepository(private val database: ChuckerDa } override fun deleteAllTransactions() { - executor.execute { transactionDao.deleteAll() } + backgroundScope.launch { transactionDao.deleteAll() } } override fun insertTransaction(transaction: HttpTransaction) { - executor.execute { - val id = transactionDao.insert(transaction) - transaction.id = id ?: 0 - } + backgroundScope.launch { + val id = transactionDao.insert(transaction) + transaction.id = id ?: 0 + } } override fun updateTransaction(transaction: HttpTransaction): Int { @@ -44,6 +43,6 @@ internal class HttpTransactionDatabaseRepository(private val database: ChuckerDa } override fun deleteOldTransactions(threshold: Long) { - executor.execute { transactionDao.deleteBefore(threshold) } + backgroundScope.launch { transactionDao.deleteBefore(threshold) } } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt index bd628594d..10fae092c 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt @@ -5,6 +5,9 @@ import com.chuckerteam.chucker.internal.data.entity.RecordedThrowable import com.chuckerteam.chucker.internal.data.entity.RecordedThrowableTuple import com.chuckerteam.chucker.internal.data.room.ChuckerDatabase import com.chuckerteam.chucker.internal.support.distinctUntilChanged +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.util.concurrent.Executor import java.util.concurrent.Executors @@ -12,14 +15,14 @@ internal class RecordedThrowableDatabaseRepository( private val database: ChuckerDatabase ) : RecordedThrowableRepository { - private val executor: Executor = Executors.newSingleThreadExecutor() + private val backgroundScope = CoroutineScope(Dispatchers.IO) override fun getRecordedThrowable(id: Long): LiveData { return database.throwableDao().getById(id).distinctUntilChanged() } override fun deleteAllThrowables() { - executor.execute { database.throwableDao().deleteAll() } + backgroundScope.launch { database.throwableDao().deleteAll() } } override fun getSortedThrowablesTuples(): LiveData> { @@ -27,10 +30,10 @@ internal class RecordedThrowableDatabaseRepository( } override fun saveThrowable(throwable: RecordedThrowable) { - executor.execute { database.throwableDao().insert(throwable) } + backgroundScope.launch { database.throwableDao().insert(throwable) } } override fun deleteOldThrowables(threshold: Long) { - executor.execute { database.throwableDao().deleteBefore(threshold) } + backgroundScope.launch { database.throwableDao().deleteBefore(threshold) } } } From 6e8a31390855d434930d4a83ce7a90802042abb5 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Sat, 14 Mar 2020 00:26:07 +0530 Subject: [PATCH 4/9] Fix code style checks --- .../HttpTransactionDatabaseRepository.kt | 14 +++-- .../RecordedThrowableDatabaseRepository.kt | 2 - .../transaction/TransactionPayloadFragment.kt | 56 ++++++++++--------- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt index b08ef71f4..c18025524 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt @@ -5,7 +5,9 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple import com.chuckerteam.chucker.internal.data.room.ChuckerDatabase import com.chuckerteam.chucker.internal.support.distinctUntilChanged -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch internal class HttpTransactionDatabaseRepository(private val database: ChuckerDatabase) : HttpTransactionRepository { @@ -32,10 +34,10 @@ internal class HttpTransactionDatabaseRepository(private val database: ChuckerDa } override fun insertTransaction(transaction: HttpTransaction) { - backgroundScope.launch { - val id = transactionDao.insert(transaction) - transaction.id = id ?: 0 - } + backgroundScope.launch { + val id = transactionDao.insert(transaction) + transaction.id = id ?: 0 + } } override fun updateTransaction(transaction: HttpTransaction): Int { @@ -43,6 +45,6 @@ internal class HttpTransactionDatabaseRepository(private val database: ChuckerDa } override fun deleteOldTransactions(threshold: Long) { - backgroundScope.launch { transactionDao.deleteBefore(threshold) } + backgroundScope.launch { transactionDao.deleteBefore(threshold) } } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt index 10fae092c..cb8428d95 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt @@ -8,8 +8,6 @@ import com.chuckerteam.chucker.internal.support.distinctUntilChanged import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.util.concurrent.Executor -import java.util.concurrent.Executors internal class RecordedThrowableDatabaseRepository( private val database: ChuckerDatabase diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index 8efff8b3b..7b0c4d641 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -37,7 +37,7 @@ import java.io.IOException private const val GET_FILE_FOR_SAVING_REQUEST_CODE: Int = 43 internal class TransactionPayloadFragment : - Fragment(), SearchView.OnQueryTextListener { + Fragment(), SearchView.OnQueryTextListener { private lateinit var payloadBinding: ChuckerFragmentTransactionPayloadBinding @@ -56,27 +56,30 @@ internal class TransactionPayloadFragment : } override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View? { - payloadBinding = ChuckerFragmentTransactionPayloadBinding.inflate(inflater, container, false) + payloadBinding = ChuckerFragmentTransactionPayloadBinding.inflate( + inflater, container, + false + ) return payloadBinding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.transaction.observe( - viewLifecycleOwner, - Observer { transaction -> - if (transaction == null) return@Observer - CoroutineScope(Dispatchers.Main).launch { - showProgress() - val result = processPayload(type, transaction) - responseRecyclerView.adapter = TransactionBodyAdapter(result) - hideProgress() - } + viewLifecycleOwner, + Observer { transaction -> + if (transaction == null) return@Observer + CoroutineScope(Dispatchers.Main).launch { + showProgress() + val result = processPayload(type, transaction) + responseRecyclerView.adapter = TransactionBodyAdapter(result) + hideProgress() } + } ) } @@ -144,8 +147,8 @@ internal class TransactionPayloadFragment : startActivityForResult(intent, GET_FILE_FOR_SAVING_REQUEST_CODE) } else { Toast.makeText( - requireContext(), R.string.chucker_save_failed_to_open_document, - Toast.LENGTH_SHORT + requireContext(), R.string.chucker_save_failed_to_open_document, + Toast.LENGTH_SHORT ).show() } } @@ -181,7 +184,6 @@ internal class TransactionPayloadFragment : return true } - private fun showProgress() { payloadBinding.apply { loadingProgress.visibility = View.VISIBLE @@ -217,9 +219,11 @@ internal class TransactionPayloadFragment : if (headersString.isNotBlank()) { result.add( - TransactionPayloadItem.HeaderItem( - HtmlCompat.fromHtml(headersString, HtmlCompat.FROM_HTML_MODE_LEGACY) + TransactionPayloadItem.HeaderItem( + HtmlCompat.fromHtml( + headersString, HtmlCompat.FROM_HTML_MODE_LEGACY ) + ) ) } @@ -240,7 +244,7 @@ internal class TransactionPayloadFragment : } } - + @Suppress("NestedBlockDepth", "ThrowsCount") private suspend fun saveToFile(type: Int, uri: Uri, transaction: HttpTransaction): Boolean { return withContext(Dispatchers.IO) { try { @@ -250,11 +254,11 @@ internal class TransactionPayloadFragment : when (type) { TYPE_REQUEST -> { transaction.requestBody?.byteInputStream()?.copyTo(fos) - ?: throw IOException(TRANSACTION_EXCEPTION) + ?: throw IOException(TRANSACTION_EXCEPTION) } TYPE_RESPONSE -> { transaction.responseBody?.byteInputStream()?.copyTo(fos) - ?: throw IOException(TRANSACTION_EXCEPTION) + ?: throw IOException(TRANSACTION_EXCEPTION) } else -> { if (transaction.responseImageData != null) { @@ -289,10 +293,10 @@ internal class TransactionPayloadFragment : const val DEFAULT_FILE_PREFIX = "chucker-export-" fun newInstance(type: Int): TransactionPayloadFragment = - TransactionPayloadFragment().apply { - arguments = Bundle().apply { - putInt(ARG_TYPE, type) - } + TransactionPayloadFragment().apply { + arguments = Bundle().apply { + putInt(ARG_TYPE, type) } + } } } From 0541295f9f372e047b5594d20559c6da1a19ce1e Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 5/9] Migrate executors with the coroutines in repositories --- build.gradle | 2 +- library/build.gradle | 1 + .../chucker/api/ChuckerCollector.kt | 11 ++++++++-- .../chucker/api/RetentionManager.kt | 9 ++++++-- .../HttpTransactionDatabaseRepository.kt | 21 +++++++------------ .../repository/HttpTransactionRepository.kt | 6 +++--- .../RecordedThrowableDatabaseRepository.kt | 17 ++++++--------- .../repository/RecordedThrowableRepository.kt | 6 +++--- .../internal/data/room/HttpTransactionDao.kt | 6 +++--- .../data/room/RecordedThrowableDao.kt | 8 +++---- .../internal/support/ClearDatabaseService.kt | 11 ++++++++-- .../chucker/internal/ui/MainViewModel.kt | 14 +++++++++++-- .../transaction/TransactionPayloadFragment.kt | 20 +++++++++++++----- 13 files changed, 80 insertions(+), 52 deletions(-) diff --git a/build.gradle b/build.gradle index 2dfaf6d3b..5d55ee41d 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { appCompatVersion = '1.1.0' constraintLayoutVersion = '1.1.3' materialComponentsVersion = '1.1.0' - roomVersion = '2.2.3' + roomVersion = '2.2.5' lifecycleVersion = '2.2.0' androidXCoreVersion = '2.1.0' diff --git a/library/build.gradle b/library/build.gradle index 8cae855aa..2911f7875 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" + implementation "androidx.room:room-ktx:$roomVersion" implementation "androidx.room:room-runtime:$roomVersion" kapt "androidx.room:room-compiler:$roomVersion" diff --git a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerCollector.kt b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerCollector.kt index 0aa990212..1c304d63b 100644 --- a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerCollector.kt +++ b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerCollector.kt @@ -5,6 +5,9 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.data.entity.RecordedThrowable import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider import com.chuckerteam.chucker.internal.support.NotificationHelper +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch /** * The collector responsible of collecting data from a [ChuckerInterceptor] and @@ -36,7 +39,9 @@ class ChuckerCollector @JvmOverloads constructor( */ fun onError(tag: String, throwable: Throwable) { val recordedThrowable = RecordedThrowable(tag, throwable) - RepositoryProvider.throwable().saveThrowable(recordedThrowable) + CoroutineScope(Dispatchers.IO).launch { + RepositoryProvider.throwable().saveThrowable(recordedThrowable) + } if (showNotification) { notificationHelper.show(recordedThrowable) } @@ -48,7 +53,9 @@ class ChuckerCollector @JvmOverloads constructor( * @param transaction The HTTP transaction sent */ internal fun onRequestSent(transaction: HttpTransaction) { - RepositoryProvider.transaction().insertTransaction(transaction) + CoroutineScope(Dispatchers.IO).launch { + RepositoryProvider.transaction().insertTransaction(transaction) + } if (showNotification) { notificationHelper.show(transaction) } diff --git a/library/src/main/java/com/chuckerteam/chucker/api/RetentionManager.kt b/library/src/main/java/com/chuckerteam/chucker/api/RetentionManager.kt index ef0436de8..c3e26503e 100644 --- a/library/src/main/java/com/chuckerteam/chucker/api/RetentionManager.kt +++ b/library/src/main/java/com/chuckerteam/chucker/api/RetentionManager.kt @@ -6,6 +6,9 @@ import android.util.Log import com.chuckerteam.chucker.api.Chucker.LOG_TAG import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider import java.util.concurrent.TimeUnit +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch /** * Class responsible of holding the logic for the retention of your HTTP transactions @@ -62,8 +65,10 @@ class RetentionManager @JvmOverloads constructor( } private fun deleteSince(threshold: Long) { - RepositoryProvider.transaction().deleteOldTransactions(threshold) - RepositoryProvider.throwable().deleteOldThrowables(threshold) + CoroutineScope(Dispatchers.IO).launch { + RepositoryProvider.transaction().deleteOldTransactions(threshold) + RepositoryProvider.throwable().deleteOldThrowables(threshold) + } } private fun isCleanupDue(now: Long) = now - getLastCleanup(now) > cleanupFrequency diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt index c18025524..a6388bda6 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionDatabaseRepository.kt @@ -5,14 +5,9 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple import com.chuckerteam.chucker.internal.data.room.ChuckerDatabase import com.chuckerteam.chucker.internal.support.distinctUntilChanged -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch internal class HttpTransactionDatabaseRepository(private val database: ChuckerDatabase) : HttpTransactionRepository { - private val backgroundScope = CoroutineScope(Dispatchers.IO) - private val transactionDao get() = database.transactionDao() override fun getFilteredTransactionTuples(code: String, path: String): LiveData> { @@ -29,22 +24,20 @@ internal class HttpTransactionDatabaseRepository(private val database: ChuckerDa return transactionDao.getSortedTuples() } - override fun deleteAllTransactions() { - backgroundScope.launch { transactionDao.deleteAll() } + override suspend fun deleteAllTransactions() { + transactionDao.deleteAll() } - override fun insertTransaction(transaction: HttpTransaction) { - backgroundScope.launch { - val id = transactionDao.insert(transaction) - transaction.id = id ?: 0 - } + override suspend fun insertTransaction(transaction: HttpTransaction) { + val id = transactionDao.insert(transaction) + transaction.id = id ?: 0 } override fun updateTransaction(transaction: HttpTransaction): Int { return transactionDao.update(transaction) } - override fun deleteOldTransactions(threshold: Long) { - backgroundScope.launch { transactionDao.deleteBefore(threshold) } + override suspend fun deleteOldTransactions(threshold: Long) { + transactionDao.deleteBefore(threshold) } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionRepository.kt index 86c73e539..69bd90fe1 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/HttpTransactionRepository.kt @@ -11,13 +11,13 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple */ internal interface HttpTransactionRepository { - fun insertTransaction(transaction: HttpTransaction) + suspend fun insertTransaction(transaction: HttpTransaction) fun updateTransaction(transaction: HttpTransaction): Int - fun deleteOldTransactions(threshold: Long) + suspend fun deleteOldTransactions(threshold: Long) - fun deleteAllTransactions() + suspend fun deleteAllTransactions() fun getSortedTransactionTuples(): LiveData> diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt index cb8428d95..7f8b5817a 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableDatabaseRepository.kt @@ -5,33 +5,28 @@ import com.chuckerteam.chucker.internal.data.entity.RecordedThrowable import com.chuckerteam.chucker.internal.data.entity.RecordedThrowableTuple import com.chuckerteam.chucker.internal.data.room.ChuckerDatabase import com.chuckerteam.chucker.internal.support.distinctUntilChanged -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch internal class RecordedThrowableDatabaseRepository( private val database: ChuckerDatabase ) : RecordedThrowableRepository { - private val backgroundScope = CoroutineScope(Dispatchers.IO) - override fun getRecordedThrowable(id: Long): LiveData { return database.throwableDao().getById(id).distinctUntilChanged() } - override fun deleteAllThrowables() { - backgroundScope.launch { database.throwableDao().deleteAll() } + override suspend fun deleteAllThrowables() { + database.throwableDao().deleteAll() } override fun getSortedThrowablesTuples(): LiveData> { return database.throwableDao().getTuples() } - override fun saveThrowable(throwable: RecordedThrowable) { - backgroundScope.launch { database.throwableDao().insert(throwable) } + override suspend fun saveThrowable(throwable: RecordedThrowable) { + database.throwableDao().insert(throwable) } - override fun deleteOldThrowables(threshold: Long) { - backgroundScope.launch { database.throwableDao().deleteBefore(threshold) } + override suspend fun deleteOldThrowables(threshold: Long) { + database.throwableDao().deleteBefore(threshold) } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableRepository.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableRepository.kt index 3c71122bc..925c74586 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableRepository.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/repository/RecordedThrowableRepository.kt @@ -11,11 +11,11 @@ import com.chuckerteam.chucker.internal.data.entity.RecordedThrowableTuple */ internal interface RecordedThrowableRepository { - fun saveThrowable(throwable: RecordedThrowable) + suspend fun saveThrowable(throwable: RecordedThrowable) - fun deleteOldThrowables(threshold: Long) + suspend fun deleteOldThrowables(threshold: Long) - fun deleteAllThrowables() + suspend fun deleteAllThrowables() fun getSortedThrowablesTuples(): LiveData> diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/HttpTransactionDao.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/HttpTransactionDao.kt index eabb5bcab..87f739f99 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/HttpTransactionDao.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/HttpTransactionDao.kt @@ -28,17 +28,17 @@ internal interface HttpTransactionDao { fun getFilteredTuples(codeQuery: String, pathQuery: String): LiveData> @Insert - fun insert(transaction: HttpTransaction): Long? + suspend fun insert(transaction: HttpTransaction): Long? @Update(onConflict = OnConflictStrategy.REPLACE) fun update(transaction: HttpTransaction): Int @Query("DELETE FROM transactions") - fun deleteAll() + suspend fun deleteAll() @Query("SELECT * FROM transactions WHERE id = :id") fun getById(id: Long): LiveData @Query("DELETE FROM transactions WHERE requestDate <= :threshold") - fun deleteBefore(threshold: Long) + suspend fun deleteBefore(threshold: Long) } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/RecordedThrowableDao.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/RecordedThrowableDao.kt index f78f541fc..78fcac664 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/room/RecordedThrowableDao.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/room/RecordedThrowableDao.kt @@ -13,15 +13,15 @@ internal interface RecordedThrowableDao { @Query("SELECT id,tag,date,clazz,message FROM throwables ORDER BY date DESC") fun getTuples(): LiveData> - @Insert() - fun insert(throwable: RecordedThrowable): Long? + @Insert + suspend fun insert(throwable: RecordedThrowable): Long? @Query("DELETE FROM throwables") - fun deleteAll() + suspend fun deleteAll() @Query("SELECT * FROM throwables WHERE id = :id") fun getById(id: Long): LiveData @Query("DELETE FROM throwables WHERE date <= :threshold") - fun deleteBefore(threshold: Long) + suspend fun deleteBefore(threshold: Long) } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/ClearDatabaseService.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/ClearDatabaseService.kt index 9da1a71d5..117628f25 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/support/ClearDatabaseService.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/ClearDatabaseService.kt @@ -4,6 +4,9 @@ import android.app.IntentService import android.content.Intent import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider import java.io.Serializable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch internal class ClearDatabaseService : IntentService(CLEAN_DATABASE_SERVICE_NAME) { @@ -11,13 +14,17 @@ internal class ClearDatabaseService : IntentService(CLEAN_DATABASE_SERVICE_NAME) when (intent?.getSerializableExtra(EXTRA_ITEM_TO_CLEAR)) { is ClearAction.Transaction -> { RepositoryProvider.initialize(applicationContext) - RepositoryProvider.transaction().deleteAllTransactions() + CoroutineScope(Dispatchers.IO).launch { + RepositoryProvider.transaction().deleteAllTransactions() + } NotificationHelper.clearBuffer() NotificationHelper(this).dismissTransactionsNotification() } is ClearAction.Error -> { RepositoryProvider.initialize(applicationContext) - RepositoryProvider.throwable().deleteAllThrowables() + CoroutineScope(Dispatchers.IO).launch { + RepositoryProvider.throwable().deleteAllThrowables() + } NotificationHelper(this).dismissErrorsNotification() } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt index dfba55287..37d2d68f6 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt @@ -9,10 +9,16 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple import com.chuckerteam.chucker.internal.data.entity.RecordedThrowableTuple import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider import com.chuckerteam.chucker.internal.support.NotificationHelper +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.plus internal class MainViewModel : ViewModel() { private val currentFilter = MutableLiveData("") + private val backgroundScope = CoroutineScope(Dispatchers.IO) + Job() val transactions: LiveData> = currentFilter.switchMap { searchQuery -> with(RepositoryProvider.transaction()) { @@ -38,11 +44,15 @@ internal class MainViewModel : ViewModel() { } fun clearTransactions() { - RepositoryProvider.transaction().deleteAllTransactions() + backgroundScope.launch { + RepositoryProvider.transaction().deleteAllTransactions() + } NotificationHelper.clearBuffer() } fun clearThrowables() { - RepositoryProvider.throwable().deleteAllThrowables() + backgroundScope.launch { + RepositoryProvider.throwable().deleteAllThrowables() + } } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index 7b0c4d641..ec345ee6e 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -25,14 +25,17 @@ import androidx.lifecycle.ViewModelProvider import com.chuckerteam.chucker.R import com.chuckerteam.chucker.databinding.ChuckerFragmentTransactionPayloadBinding import com.chuckerteam.chucker.internal.data.entity.HttpTransaction +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.IOException import kotlinx.android.synthetic.main.chucker_fragment_transaction_payload.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlinx.coroutines.launch +import kotlinx.coroutines.plus import kotlinx.coroutines.withContext -import java.io.FileNotFoundException -import java.io.FileOutputStream -import java.io.IOException private const val GET_FILE_FOR_SAVING_REQUEST_CODE: Int = 43 @@ -48,6 +51,8 @@ internal class TransactionPayloadFragment : private lateinit var viewModel: TransactionViewModel + private val uiScope = CoroutineScope(Dispatchers.Main) + Job() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) type = arguments!!.getInt(ARG_TYPE) @@ -73,7 +78,7 @@ internal class TransactionPayloadFragment : viewLifecycleOwner, Observer { transaction -> if (transaction == null) return@Observer - CoroutineScope(Dispatchers.Main).launch { + uiScope.launch { showProgress() val result = processPayload(type, transaction) responseRecyclerView.adapter = TransactionBodyAdapter(result) @@ -83,6 +88,11 @@ internal class TransactionPayloadFragment : ) } + override fun onDestroy() { + super.onDestroy() + uiScope.cancel() + } + @SuppressLint("NewApi") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { val transaction = viewModel.transaction.value @@ -159,7 +169,7 @@ internal class TransactionPayloadFragment : val uri = resultData?.data val transaction = viewModel.transaction.value if (uri != null && transaction != null) { - CoroutineScope(Dispatchers.Main).launch { + uiScope.launch { val result = saveToFile(type, uri, transaction) val toastMessageId = if (result) { R.string.chucker_file_saved From e4528b8799f978b88f484b00433cdae548b5c26f Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 6/9] Migrate executors with the coroutines in repositories --- .../chuckerteam/chucker/internal/ui/MainViewModel.kt | 10 +++------- .../ui/transaction/TransactionPayloadFragment.kt | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt index 37d2d68f6..d58d7e4b2 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/MainViewModel.kt @@ -5,20 +5,16 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.switchMap +import androidx.lifecycle.viewModelScope import com.chuckerteam.chucker.internal.data.entity.HttpTransactionTuple import com.chuckerteam.chucker.internal.data.entity.RecordedThrowableTuple import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider import com.chuckerteam.chucker.internal.support.NotificationHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import kotlinx.coroutines.plus internal class MainViewModel : ViewModel() { private val currentFilter = MutableLiveData("") - private val backgroundScope = CoroutineScope(Dispatchers.IO) + Job() val transactions: LiveData> = currentFilter.switchMap { searchQuery -> with(RepositoryProvider.transaction()) { @@ -44,14 +40,14 @@ internal class MainViewModel : ViewModel() { } fun clearTransactions() { - backgroundScope.launch { + viewModelScope.launch { RepositoryProvider.transaction().deleteAllTransactions() } NotificationHelper.clearBuffer() } fun clearThrowables() { - backgroundScope.launch { + viewModelScope.launch { RepositoryProvider.throwable().deleteAllThrowables() } } diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index ec345ee6e..17e35161d 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -29,9 +29,9 @@ import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import kotlinx.android.synthetic.main.chucker_fragment_transaction_payload.* -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import kotlinx.coroutines.plus @@ -51,7 +51,7 @@ internal class TransactionPayloadFragment : private lateinit var viewModel: TransactionViewModel - private val uiScope = CoroutineScope(Dispatchers.Main) + Job() + private val uiScope = MainScope() + Job() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 7acecbaca525a70bb8e0446e6c884f341a3c2bc7 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 7/9] Migrate executors with the coroutines in repositories --- .../internal/ui/transaction/TransactionPayloadFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index 17e35161d..018a2d666 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -51,7 +51,7 @@ internal class TransactionPayloadFragment : private lateinit var viewModel: TransactionViewModel - private val uiScope = MainScope() + Job() + private val uiScope = MainScope() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 6477806fbb8340de4a021dd46ba4143b3f2b657a Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 8/9] Migrate executors with the coroutines in repositories --- .../internal/ui/transaction/TransactionPayloadFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index 018a2d666..ee8bad54b 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -30,11 +30,9 @@ import java.io.FileOutputStream import java.io.IOException import kotlinx.android.synthetic.main.chucker_fragment_transaction_payload.* import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import kotlinx.coroutines.launch -import kotlinx.coroutines.plus import kotlinx.coroutines.withContext private const val GET_FILE_FOR_SAVING_REQUEST_CODE: Int = 43 From d050103d84a1b042186371f26face8ca6017a9d7 Mon Sep 17 00:00:00 2001 From: Nikhil Chaudhari Date: Mon, 9 Mar 2020 23:26:15 +0530 Subject: [PATCH 9/9] Migrate executors with the coroutines in repositories --- .../ui/transaction/TransactionPayloadFragment.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt index ee8bad54b..fd714c1b2 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/ui/transaction/TransactionPayloadFragment.kt @@ -28,7 +28,6 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException -import kotlinx.android.synthetic.main.chucker_fragment_transaction_payload.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel @@ -79,7 +78,7 @@ internal class TransactionPayloadFragment : uiScope.launch { showProgress() val result = processPayload(type, transaction) - responseRecyclerView.adapter = TransactionBodyAdapter(result) + payloadBinding.responseRecyclerView.adapter = TransactionBodyAdapter(result) hideProgress() } } @@ -240,7 +239,7 @@ internal class TransactionPayloadFragment : if (type == TYPE_RESPONSE && responseBitmap != null) { result.add(TransactionPayloadItem.ImageItem(responseBitmap)) } else if (!isBodyPlainText) { - context?.getString(R.string.chucker_body_omitted)?.let { + requireContext().getString(R.string.chucker_body_omitted)?.let { result.add(TransactionPayloadItem.BodyLineItem(SpannableStringBuilder.valueOf(it))) } } else { @@ -252,12 +251,11 @@ internal class TransactionPayloadFragment : } } - @Suppress("NestedBlockDepth", "ThrowsCount") + @Suppress("ThrowsCount") private suspend fun saveToFile(type: Int, uri: Uri, transaction: HttpTransaction): Boolean { return withContext(Dispatchers.IO) { try { - val context = context ?: return@withContext false - context.contentResolver.openFileDescriptor(uri, "w")?.use { + requireContext().contentResolver.openFileDescriptor(uri, "w")?.use { FileOutputStream(it.fileDescriptor).use { fos -> when (type) { TYPE_REQUEST -> {