From c3ab197aa09354f080cae8509e1f015698f9005e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 1 Jul 2020 19:17:08 +0300 Subject: [PATCH] Fix some StrictMode warnings --- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 19 ++++++++++++--- .../core/parser/LocalMangaRepository.kt | 5 ++-- .../ui/details/MangaDetailsFragment.kt | 23 +++++++++++++------ .../koitharu/kotatsu/ui/list/MainActivity.kt | 5 +++- .../ui/search/MangaSuggestionsProvider.kt | 2 +- .../kotatsu/ui/search/SearchActivity.kt | 5 ++++ .../kotatsu/ui/search/SearchHelper.kt | 9 +++++--- .../koitharu/kotatsu/utils/ext/ParseExt.kt | 15 ++++++------ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 10 files changed, 61 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 749956ac7..76397ba83 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -1,10 +1,9 @@ package org.koitharu.kotatsu import android.app.Application +import android.os.StrictMode import androidx.appcompat.app.AppCompatDelegate import androidx.room.Room -import androidx.room.RoomDatabase -import androidx.sqlite.db.SupportSQLiteDatabase import coil.Coil import coil.ComponentRegistry import coil.ImageLoaderBuilder @@ -24,6 +23,7 @@ import org.koitharu.kotatsu.core.local.PagesCache import org.koitharu.kotatsu.core.local.cookies.PersistentCookieJar import org.koitharu.kotatsu.core.local.cookies.cache.SetCookieCache import org.koitharu.kotatsu.core.local.cookies.persistence.SharedPrefsCookiePersistor +import org.koitharu.kotatsu.core.parser.LocalMangaRepository import org.koitharu.kotatsu.core.parser.UserAgentInterceptor import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaLoaderContext @@ -46,6 +46,19 @@ class KotatsuApp : Application() { override fun onCreate() { super.onCreate() + if (BuildConfig.DEBUG) { + StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder() + .detectAll() + .penaltyLog() + .build()) + StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder() + .detectAll() + .setClassInstanceLimit(LocalMangaRepository::class.java, 1) + .setClassInstanceLimit(PagesCache::class.java, 1) + .setClassInstanceLimit(MangaLoaderContext::class.java, 1) + .penaltyLog() + .build()) + } initKoin() initCoil() Thread.setDefaultUncaughtExceptionHandler(AppCrashHandler(applicationContext)) @@ -75,7 +88,7 @@ class KotatsuApp : Application() { single { MangaLoaderContext() } - factory { + single { AppSettings(applicationContext) } single { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt index 725119563..bd0a54cd7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/LocalMangaRepository.kt @@ -78,8 +78,7 @@ class LocalMangaRepository : MangaRepository, KoinComponent { } @SuppressLint("DefaultLocale") - fun getFromFile(file: File): Manga { - val zip = ZipFile(file) + fun getFromFile(file: File): Manga = ZipFile(file).use { zip -> val fileUri = file.toUri().toString() val entry = zip.getEntry(MangaZip.INDEX_ENTRY) val index = entry?.let(zip::readText)?.let(::MangaIndex) @@ -105,7 +104,7 @@ class LocalMangaRepository : MangaRepository, KoinComponent { } } val uriBuilder = file.toUri().buildUpon() - return Manga( + Manga( id = file.absolutePath.longHashCode(), title = title, url = fileUri, diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt index bf5a02181..fb679580d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt @@ -5,9 +5,13 @@ import android.view.View import androidx.core.net.toUri import androidx.core.text.parseAsHtml import androidx.core.view.isVisible +import androidx.lifecycle.lifecycleScope import coil.api.load import com.google.android.material.chip.Chip import kotlinx.android.synthetic.main.fragment_details.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory @@ -73,13 +77,18 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai ) } manga.url.toUri().toFileOrNull()?.let { f -> - chips_tags.addChips(listOf(f)) { - create( - text = FileSizeUtils.formatBytes(context, it.length()), - iconRes = R.drawable.ic_chip_storage, - tag = it, - onClickListener = this@MangaDetailsFragment - ) + lifecycleScope.launch { + val size = withContext(Dispatchers.IO) { + f.length() + } + chips_tags.addChips(listOf(f)) { + create( + text = FileSizeUtils.formatBytes(context, size), + iconRes = R.drawable.ic_chip_storage, + tag = it, + onClickListener = this@MangaDetailsFragment + ) + } } } imageView_favourite.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt index 399ef4142..06442c4df 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt @@ -37,6 +37,7 @@ import org.koitharu.kotatsu.ui.settings.SettingsActivity import org.koitharu.kotatsu.ui.tracker.TrackWorker import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.resolveDp +import java.io.Closeable class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener, SharedPreferences.OnSharedPreferenceChangeListener, MainView { @@ -45,6 +46,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList private val settings by inject() private lateinit var drawerToggle: ActionBarDrawerToggle + private var closeable: Closeable? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -74,6 +76,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } override fun onDestroy() { + closeable?.close() settings.unsubscribe(this) super.onDestroy() } @@ -92,7 +95,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.opt_main, menu) menu.findItem(R.id.action_search)?.let { menuItem -> - SearchHelper.setupSearchView(menuItem) + closeable = SearchHelper.setupSearchView(menuItem) } return super.onCreateOptionsMenu(menu) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/MangaSuggestionsProvider.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/MangaSuggestionsProvider.kt index ffa8f0445..0a2cf5cff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/MangaSuggestionsProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/MangaSuggestionsProvider.kt @@ -79,7 +79,7 @@ class MangaSuggestionsProvider : SearchRecentSuggestionsProvider() { } @JvmStatic - fun getItemsCount(context: Context) = getCursor(context)?.count ?: 0 + fun getItemsCount(context: Context) = getCursor(context)?.use { it.count } ?: 0 @JvmStatic private fun getCursor(context: Context): Cursor? { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt index d39465d54..2a60f89e8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt @@ -37,6 +37,11 @@ class SearchActivity : BaseActivity(), SearchView.OnQueryTextListener { } } + override fun onDestroy() { + searchView.suggestionsAdapter?.changeCursor(null) //close cursor + super.onDestroy() + } + override fun onQueryTextSubmit(query: String?): Boolean { return if (!query.isNullOrBlank()) { title = query diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchHelper.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchHelper.kt index 231804de8..7ebb87dd8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchHelper.kt @@ -8,17 +8,20 @@ import androidx.appcompat.widget.SearchView import org.koitharu.kotatsu.R import org.koitharu.kotatsu.ui.search.global.GlobalSearchActivity import org.koitharu.kotatsu.utils.ext.safe +import java.io.Closeable object SearchHelper { @JvmStatic - fun setupSearchView(menuItem: MenuItem) { - val view = menuItem.actionView as? SearchView ?: return + fun setupSearchView(menuItem: MenuItem): Closeable? { + val view = menuItem.actionView as? SearchView ?: return null val context = view.context + val adapter = MangaSuggestionsProvider.getSuggestionAdapter(context) view.queryHint = context.getString(R.string.search_manga) - view.suggestionsAdapter = MangaSuggestionsProvider.getSuggestionAdapter(context) + view.suggestionsAdapter = adapter view.setOnQueryTextListener(QueryListener(context)) view.setOnSuggestionListener(SuggestionListener(view)) + return adapter?.cursor } private class QueryListener(private val context: Context) : diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt index 944286f59..464785d24 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt @@ -10,13 +10,14 @@ import org.jsoup.select.Elements fun Response.parseHtml(): Document { try { - val stream = body?.byteStream() ?: throw NullPointerException("Response body is null") - val charset = body!!.contentType()?.charset()?.name() - return Jsoup.parse( - stream, - charset, - request.url.toString() - ) + (body?.byteStream() ?: throw NullPointerException("Response body is null")).use { stream -> + val charset = body!!.contentType()?.charset()?.name() + return Jsoup.parse( + stream, + charset, + request.url.toString() + ) + } } finally { closeQuietly() } diff --git a/build.gradle b/build.gradle index 3219af198..d948ecf3e 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.0-alpha02' + classpath 'com.android.tools.build:gradle:4.2.0-alpha03' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f8233caa7..47bac7af6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jun 20 11:05:53 EEST 2020 +#Wed Jul 01 18:26:34 EEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip