diff --git a/app/build.gradle b/app/build.gradle index bcaa6cca8..bf0ec6b6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 { @@ -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.1' + 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.1' + testImplementation 'io.insert-koin:koin-test-junit4:3.1.2' } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index e3c265793..2c4421399 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -56,16 +56,18 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo protected fun setContentView(binding: B) { this.binding = binding super.setContentView(binding.root) - (binding.root.findViewById(R.id.toolbar) as? Toolbar)?.let(this::setSupportActionBar) - val toolbarParams = (binding.root.findViewById(R.id.toolbar) as? Toolbar)?.layoutParams as? AppBarLayout.LayoutParams - val persistentToolbarParams = (binding.root.findViewById(R.id.toolbar_card))?.layoutParams as? AppBarLayout.LayoutParams + val toolbar = (binding.root.findViewById(R.id.toolbar) as? Toolbar) + toolbar?.let(this::setSupportActionBar) ViewCompat.setOnApplyWindowInsetsListener(binding.root, this) - if (get().isToolbarHideWhenScrolling) { - toolbarParams?.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS - persistentToolbarParams?.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS - } else { - toolbarParams?.scrollFlags = SCROLL_FLAG_NO_SCROLL - persistentToolbarParams?.scrollFlags = SCROLL_FLAG_NO_SCROLL + + val toolbarParams = (toolbar ?: binding.root.findViewById(R.id.toolbar_card)) + ?.layoutParams as? AppBarLayout.LayoutParams + if (toolbarParams != null) { + if (get().isToolbarHideWhenScrolling) { + toolbarParams.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS + } else { + toolbarParams.scrollFlags = SCROLL_FLAG_NO_SCROLL + } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 4456df455..370f69720 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -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" diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index e34239b56..b8b7bcb19 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -220,7 +220,7 @@ class ReaderActivity : BaseFullscreenActivity(), } override fun onGridTouch(area: Int) { - controlDelegate.onGridTouch(area) + controlDelegate.onGridTouch(area, binding.container) } override fun onProcessTouch(rawX: Int, rawY: Int): Boolean { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt index eb408f5f7..f8c5d73c0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderControlDelegate.kt @@ -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) } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/TrackerSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/TrackerSettingsFragment.kt index f83beb33c..a4c489f8b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/TrackerSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/TrackerSettingsFragment.kt @@ -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(AppSettings.KEY_TRACK_SOURCES) ?.summaryProvider = MultiSummaryProvider(R.string.dont_check) + val warningPreference = findPreference(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 { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt index 5cd21c629..4d9003f3b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt @@ -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() { private val viewModel by viewModel(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() { } 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 { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/LinksPreference.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/LinksPreference.kt new file mode 100644 index 000000000..cd61ba247 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/LinksPreference.kt @@ -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() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_info_outilne.xml b/app/src/main/res/drawable/ic_info_outline.xml similarity index 100% rename from app/src/main/res/drawable/ic_info_outilne.xml rename to app/src/main/res/drawable/ic_info_outline.xml diff --git a/app/src/main/res/layout/item_search_complete.xml b/app/src/main/res/layout/item_search_complete.xml deleted file mode 100644 index d0ecbdc80..000000000 --- a/app/src/main/res/layout/item_search_complete.xml +++ /dev/null @@ -1,17 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/raw/keep.xml b/app/src/main/res/raw/keep.xml new file mode 100644 index 000000000..7f40321a2 --- /dev/null +++ b/app/src/main/res/raw/keep.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0f42c1658..227d005eb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -214,4 +214,7 @@ Языки Добро пожаловать Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. + Резервная копия успешно сохранена + Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач. + Подробнее \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80d309d6d..615dd5eb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -217,4 +217,7 @@ Languages Welcome Description + Backup saved successfully + Some manufacturers can change the system behavior, which may breaks background tasks. + Read more \ No newline at end of file diff --git a/app/src/main/res/xml/pref_backup.xml b/app/src/main/res/xml/pref_backup.xml index 417e43b2c..7a61eb336 100644 --- a/app/src/main/res/xml/pref_backup.xml +++ b/app/src/main/res/xml/pref_backup.xml @@ -16,7 +16,7 @@ app:iconSpaceReserved="false" /> + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 144344709..90a323679 100644 --- a/build.gradle +++ b/build.gradle @@ -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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6a4263d15..821394777 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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 \ No newline at end of file +distributionSha256Sum=765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e