Compare commits

...

8 Commits
v1.1 ... v1.1.2

Author SHA1 Message Date
Koitharu
fae958f6ef Remove unused resources 2021-07-07 07:25:31 +03:00
Koitharu
d8db89326f Info about background restrictions 2021-07-07 07:13:02 +03:00
Koitharu
3804896788 Save backup instead of sharing 2021-07-06 20:26:52 +03:00
Koitharu
4aedea7e15 Improve accesibility in reader 2021-07-06 19:20:41 +03:00
Koitharu
ed89d76488 Fix resource shrinking 2021-07-03 16:12:16 +03:00
Koitharu
bbd43b51e3 Increase version 2021-06-28 15:46:13 +03:00
Koitharu
a6a392c7bf Merge pull request #36 from ztimms73/fix-crashes
Fix possible crashes
2021-06-28 15:41:14 +03:00
ztimms73
08f92f9614 Fix possible crashes 2021-06-28 13:59:45 +03:00
22 changed files with 116 additions and 78 deletions

View File

@@ -13,8 +13,9 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdkVersion 21
targetSdkVersion 30
versionCode 365
versionName '1.1'
versionCode 367
versionName '1.1.2'
generatedDensities = []
kapt {
arguments {
@@ -66,7 +67,7 @@ dependencies {
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.activity:activity-ktx:1.2.3'
implementation 'androidx.fragment:fragment-ktx:1.3.4'
implementation 'androidx.fragment:fragment-ktx:1.3.5'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
@@ -93,7 +94,7 @@ dependencies {
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.0'
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.0'
implementation 'io.insert-koin:koin-android:3.1.0'
implementation 'io.insert-koin:koin-android:3.1.2'
implementation 'io.coil-kt:coil-base:1.2.2'
implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0'
implementation 'com.github.solkin:disk-lru-cache:1.2'
@@ -102,5 +103,5 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.json:json:20210307'
testImplementation 'io.insert-koin:koin-test-junit4:3.1.0'
testImplementation 'io.insert-koin:koin-test-junit4:3.1.2'
}

View File

@@ -59,12 +59,12 @@ abstract class BaseActivity<B : ViewBinding> : AppCompatActivity(), OnApplyWindo
this.binding = binding
super.setContentView(binding.root)
(binding.root.findViewById<View>(R.id.toolbar) as? Toolbar)?.let(this::setSupportActionBar)
val params = (binding.root.findViewById<View>(R.id.toolbar) as? Toolbar)?.layoutParams as AppBarLayout.LayoutParams
val params = (binding.root.findViewById<View>(R.id.toolbar) as? Toolbar)?.layoutParams as? AppBarLayout.LayoutParams
ViewCompat.setOnApplyWindowInsetsListener(binding.root, this)
if (get<AppSettings>().isToolbarHideWhenScrolling) {
params.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS
params?.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS
} else {
params.scrollFlags = SCROLL_FLAG_NO_SCROLL
params?.scrollFlags = SCROLL_FLAG_NO_SCROLL
}
}

View File

@@ -166,6 +166,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) :
const val KEY_LOCAL_STORAGE = "local_storage"
const val KEY_READER_SWITCHERS = "reader_switchers"
const val KEY_TRACK_SOURCES = "track_sources"
const val KEY_TRACK_WARNING = "track_warning"
const val KEY_APP_UPDATE = "app_update"
const val KEY_APP_UPDATE_AUTO = "app_update_auto"
const val KEY_TRACKER_NOTIFICATIONS = "tracker_notifications"

View File

@@ -220,7 +220,7 @@ class ReaderActivity : BaseFullscreenActivity<ActivityReaderBinding>(),
}
override fun onGridTouch(area: Int) {
controlDelegate.onGridTouch(area)
controlDelegate.onGridTouch(area, binding.container)
}
override fun onProcessTouch(rawX: Int, rawY: Int): Boolean {

View File

@@ -1,6 +1,8 @@
package org.koitharu.kotatsu.reader.ui
import android.view.KeyEvent
import android.view.SoundEffectConstants
import android.view.View
import androidx.lifecycle.LifecycleCoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
@@ -30,18 +32,27 @@ class ReaderControlDelegate(
}.launchIn(scope)
}
fun onGridTouch(area: Int) {
fun onGridTouch(area: Int, view: View) {
when (area) {
GridTouchHelper.AREA_CENTER -> {
listener.toggleUiVisibility()
view.playSoundEffect(SoundEffectConstants.CLICK)
}
GridTouchHelper.AREA_TOP -> if (isTapSwitchEnabled) {
listener.switchPageBy(-1)
view.playSoundEffect(SoundEffectConstants.NAVIGATION_UP)
}
GridTouchHelper.AREA_TOP,
GridTouchHelper.AREA_LEFT -> if (isTapSwitchEnabled) {
listener.switchPageBy(-1)
view.playSoundEffect(SoundEffectConstants.NAVIGATION_LEFT)
}
GridTouchHelper.AREA_BOTTOM -> if (isTapSwitchEnabled) {
listener.switchPageBy(1)
view.playSoundEffect(SoundEffectConstants.NAVIGATION_DOWN)
}
GridTouchHelper.AREA_BOTTOM,
GridTouchHelper.AREA_RIGHT -> if (isTapSwitchEnabled) {
listener.switchPageBy(1)
view.playSoundEffect(SoundEffectConstants.NAVIGATION_RIGHT)
}
}
}

View File

@@ -4,6 +4,9 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.text.style.URLSpan
import androidx.core.text.buildSpannedString
import androidx.core.text.inSpans
import androidx.preference.MultiSelectListPreference
import androidx.preference.Preference
import org.koitharu.kotatsu.R
@@ -19,6 +22,17 @@ class TrackerSettingsFragment : BasePreferenceFragment(R.string.new_chapters_che
findPreference<MultiSelectListPreference>(AppSettings.KEY_TRACK_SOURCES)
?.summaryProvider = MultiSummaryProvider(R.string.dont_check)
val warningPreference = findPreference<Preference>(AppSettings.KEY_TRACK_WARNING)
if (warningPreference != null) {
warningPreference.summary = buildSpannedString {
append(getString(R.string.tracker_warning))
append(" ")
inSpans(URLSpan("https://dontkillmyapp.com/")) {
append(getString(R.string.read_more))
}
}
warningPreference
}
}
override fun onPreferenceTreeClick(preference: Preference?): Boolean {

View File

@@ -1,27 +1,41 @@
package org.koitharu.kotatsu.settings.backup
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.AlertDialogFragment
import org.koitharu.kotatsu.databinding.DialogProgressBinding
import org.koitharu.kotatsu.utils.ShareHelper
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.progress.Progress
import java.io.File
import java.io.FileOutputStream
class BackupDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
private val viewModel by viewModel<BackupViewModel>(mode = LazyThreadSafetyMode.NONE)
private var backup: File? = null
private val saveFileContract =
registerForActivityResult(ActivityResultContracts.CreateDocument()) { uri ->
val file = backup
if (uri != null && file != null) {
saveBackup(file, uri)
} else {
dismiss()
}
}
override fun onInflateView(
inflater: LayoutInflater,
container: ViewGroup?
container: ViewGroup?,
) = DialogProgressBinding.inflate(inflater, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -60,8 +74,22 @@ class BackupDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
}
private fun onBackupDone(file: File) {
ShareHelper(context ?: return).shareBackup(file)
dismiss()
this.backup = file
saveFileContract.launch(file.name)
}
private fun saveBackup(file: File, output: Uri) {
try {
requireContext().contentResolver.openFileDescriptor(output, "w")?.use { fd ->
FileOutputStream(fd.fileDescriptor).use {
it.write(file.readBytes())
}
}
Toast.makeText(requireContext(), R.string.backup_saved, Toast.LENGTH_LONG).show()
dismiss()
} catch (e: Exception) {
onError(e)
}
}
companion object {

View File

@@ -0,0 +1,23 @@
package org.koitharu.kotatsu.settings.utils
import android.content.Context
import android.text.method.LinkMovementMethod
import android.util.AttributeSet
import android.widget.TextView
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
class LinksPreference @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = androidx.preference.R.attr.preferenceStyle,
defStyleRes: Int = 0,
) : Preference(context, attrs, defStyleAttr, defStyleRes) {
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
val summaryView = holder.findViewById(android.R.id.summary) as TextView
summaryView.movementMethod = LinkMovementMethod.getInstance()
}
}

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M12,4.5C17,4.5 21.27,7.61 23,12C21.27,16.39 17,19.5 12,19.5C7,19.5 2.73,16.39 1,12C2.73,7.61 7,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C15.76,17.5 19.17,15.36 20.82,12C19.17,8.64 15.76,6.5 12,6.5C8.24,6.5 4.83,8.64 3.18,12Z" />
</vector>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:enterFadeDuration="@android:integer/config_mediumAnimTime"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:drawable="@drawable/ic_eye" android:state_checked="true" />
<item android:drawable="@drawable/ic_eye_off" android:state_checked="false" />
</selector>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:fillAlpha="0.3"
android:pathData="M2,5.27L3.28,4L20,20.72L18.73,22L15.65,18.92C14.5,19.3 13.28,19.5 12,19.5C7,19.5 2.73,16.39 1,12C1.69,10.24 2.79,8.69 4.19,7.46L2,5.27M12,9A3,3 0 0,1 15,12C15,12.35 14.94,12.69 14.83,13L11,9.17C11.31,9.06 11.65,9 12,9M12,4.5C17,4.5 21.27,7.61 23,12C22.18,14.08 20.79,15.88 19,17.19L17.58,15.76C18.94,14.82 20.06,13.54 20.82,12C19.17,8.64 15.76,6.5 12,6.5C10.91,6.5 9.84,6.68 8.84,7L7.3,5.47C8.74,4.85 10.33,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C12.69,17.5 13.37,17.43 14,17.29L11.72,15C10.29,14.85 9.15,13.71 9,12.28L5.6,8.87C4.61,9.72 3.78,10.78 3.18,12Z" />
</vector>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="?listPreferredItemHeightSmall"
android:background="?selectableItemBackground"
android:drawablePadding="20dp"
android:gravity="center_vertical"
android:paddingStart="?listPreferredItemPaddingStart"
android:paddingEnd="?listPreferredItemPaddingEnd"
android:textAppearance="?textAppearanceListItemSmall"
android:textColor="?android:textColorPrimary"
android:theme="@style/AppPopupTheme"
tools:text="@tools:sample/full_names"
app:drawableStartCompat="@drawable/ic_history" />

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/ic_denied_large,@drawable/ic_alert_outline,@drawable/ic_error_large" />

View File

@@ -75,7 +75,6 @@
<string name="webtoon">Манхва</string>
<string name="read_mode">Рэжым чытання</string>
<string name="grid_size">Памер табліцы</string>
<string name="search_results_on_s">Вынікі пошуку па %s</string>
<string name="search_on_s">Пошук па %s</string>
<string name="delete_manga">Выдаліць мангу</string>
<string name="reader_settings">Настаўленні чытання</string>
@@ -96,7 +95,6 @@
<string name="internal_storage">Унутраны назапашвальнік</string>
<string name="external_storage">Знешняе сховішча</string>
<string name="domain">Дамен</string>
<string name="_default">Безумоўна</string>
<string name="application_update">Правяраць абнаўленне прыкладання</string>
<string name="app_update_available">Даступна абнаўленне прыкладання</string>
<string name="show_notification_app_update">Паказваць апавяшчэнне пры наяўнасці новай версіі</string>

View File

@@ -74,7 +74,6 @@
<string name="webtoon">Webtoon</string>
<string name="read_mode">Modo de lectura</string>
<string name="grid_size">Tamaño de la cuadrícula</string>
<string name="search_results_on_s">Resultados de búsqueda en %s</string>
<string name="search_on_s">Buscar en %s</string>
<string name="delete_manga">Borrar manga</string>
<string name="text_delete_local_manga">¿Realmente quieres borrar \"%s\" del almacenamiento local de tu teléfono? \nEsta operación no se puede deshacer.</string>
@@ -95,7 +94,6 @@
<string name="internal_storage">Almacenamiento interno</string>
<string name="external_storage">Almacenamiento externo</string>
<string name="domain">Dominio</string>
<string name="_default">Por defecto</string>
<string name="application_update">Comprobar actualizaciones automáticamente</string>
<string name="app_update_available">Una nueva versión de la aplicación está disponible</string>
<string name="show_notification_app_update">Mostrar notificación si la actualización está disponible</string>

View File

@@ -74,7 +74,6 @@
<string name="webtoon">Манхва</string>
<string name="read_mode">Режим чтения</string>
<string name="grid_size">Размер таблицы</string>
<string name="search_results_on_s">Результаты поиска по %s</string>
<string name="search_on_s">Поиск по %s</string>
<string name="delete_manga">Удалить мангу</string>
<string name="text_delete_local_manga">Вы уверены, что хотите удалить \"%s\" с устройства? \nЭто действие нельзя будет отменить.</string>
@@ -95,7 +94,6 @@
<string name="internal_storage">Внутренний накопитель</string>
<string name="external_storage">Внешнее хранилище</string>
<string name="domain">Домен</string>
<string name="_default">По умолчанию</string>
<string name="application_update">Проверять обновление приложения</string>
<string name="app_update_available">Доступно обновление приложения</string>
<string name="show_notification_app_update">Показывать уведомление при наличии новой версии</string>
@@ -211,4 +209,7 @@
<string name="languages">Языки</string>
<string name="welcome">Добро пожаловать</string>
<string name="text_clear_search_history_prompt">Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено.</string>
<string name="backup_saved">Резервная копия успешно сохранена</string>
<string name="tracker_warning">Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач.</string>
<string name="read_more">Подробнее</string>
</resources>

View File

@@ -75,7 +75,6 @@
<string name="webtoon">Webtoon</string>
<string name="read_mode">Read mode</string>
<string name="grid_size">Grid size</string>
<string name="search_results_on_s">Search results on %s</string>
<string name="search_on_s">Search on %s</string>
<string name="delete_manga">Delete manga</string>
<string name="text_delete_local_manga">Do you really want to delete \"%s\" from your phone\'s local storage? \nThis operation cannot be undone.</string>
@@ -96,7 +95,6 @@
<string name="internal_storage">Internal storage</string>
<string name="external_storage">External storage</string>
<string name="domain">Domain</string>
<string name="_default">Default</string>
<string name="application_update">Check for updates automatically</string>
<string name="app_update_available">Application update is available</string>
<string name="show_notification_app_update">Show notification if update is available</string>
@@ -213,4 +211,7 @@
<string name="other">Other</string>
<string name="languages">Languages</string>
<string name="welcome">Welcome</string>
<string name="backup_saved">Backup saved successfully</string>
<string name="tracker_warning">Some manufacturers can change the system behavior, which may breaks background tasks.</string>
<string name="read_more">Read more</string>
</resources>

View File

@@ -16,7 +16,7 @@
app:iconSpaceReserved="false" />
<Preference
android:icon="@drawable/ic_info_outilne"
android:icon="@drawable/ic_info_outline"
android:persistent="false"
android:selectable="false"
android:summary="@string/backup_information"

View File

@@ -24,4 +24,12 @@
android:title="@string/notifications_settings"
app:iconSpaceReserved="false" />
<org.koitharu.kotatsu.settings.utils.LinksPreference
android:key="track_warning"
android:icon="@drawable/ic_info_outline"
android:persistent="false"
android:selectable="false"
android:summary="@string/tracker_warning"
app:allowDividerAbove="true" />
</PreferenceScreen>

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0'
// NOTE: Do not place your application dependencies here; they belong

View File

@@ -1,7 +1,7 @@
#Mon Mar 29 19:25:53 EEST 2021
#Sat Jul 03 12:50:59 EEST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
distributionSha256Sum=7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205
distributionSha256Sum=765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e