From ced4ca01cba52754f1c5d418ad088835f0218cf0 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 23 Jun 2022 14:54:30 +0300 Subject: [PATCH 01/23] Add icon to metadata --- metadata/en-US/icon.png | Bin 0 -> 24934 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 metadata/en-US/icon.png diff --git a/metadata/en-US/icon.png b/metadata/en-US/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f63e533f0297b36535f01f0a8aa6e9316aa2bf8c GIT binary patch literal 24934 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 pA0(s`aL*9}2p1gJ)=T0H{6D Date: Sun, 26 Jun 2022 10:21:47 +0300 Subject: [PATCH 02/23] Compact chapters list --- app/src/main/res/layout/item_chapter.xml | 5 +++-- app/src/main/res/values/dimens.xml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_chapter.xml b/app/src/main/res/layout/item_chapter.xml index 3998c9fd0..6fe72009e 100644 --- a/app/src/main/res/layout/item_chapter.xml +++ b/app/src/main/res/layout/item_chapter.xml @@ -4,10 +4,11 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="@dimen/chapter_list_item_height" + android:layout_height="wrap_content" android:background="?selectableItemBackground" android:baselineAligned="false" android:gravity="center_vertical" + android:minHeight="@dimen/chapter_list_item_height" android:orientation="horizontal"> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 474c2eb6d..ad8250116 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -15,7 +15,7 @@ 120dp 120dp 4dp - 62dp + 48dp 120dp 48dp 36dp From 663718ece49009346248b0e29d41633c6b105a21 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 26 Jun 2022 11:09:58 +0300 Subject: [PATCH 03/23] Add ScrollView to list mode dialog --- app/src/main/res/layout/dialog_list_mode.xml | 107 ++++++++++--------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/app/src/main/res/layout/dialog_list_mode.xml b/app/src/main/res/layout/dialog_list_mode.xml index cfbd8e018..e8341c954 100644 --- a/app/src/main/res/layout/dialog_list_mode.xml +++ b/app/src/main/res/layout/dialog_list_mode.xml @@ -1,70 +1,75 @@ - + android:layout_height="wrap_content"> - - + android:layout_margin="16dp" + android:orientation="vertical"> - + + + + + + + + + android:paddingLeft="?attr/dialogPreferredPadding" + android:paddingRight="?attr/dialogPreferredPadding" + android:singleLine="true" + android:text="@string/grid_size" + android:visibility="gone" + tools:visibility="visible" /> - + android:layout_marginHorizontal="16dp" + android:stepSize="5" + android:valueFrom="50" + android:valueTo="150" + android:visibility="gone" + app:labelBehavior="floating" + app:tickVisible="false" + tools:value="100" + tools:visibility="visible" /> - - - - - - - \ No newline at end of file + + \ No newline at end of file From 9686c977315138169a1108f3823918593b0a0857 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 26 Jun 2022 11:21:47 +0300 Subject: [PATCH 04/23] Add tracker settings to option menu --- .../org/koitharu/kotatsu/settings/SettingsActivity.kt | 9 ++++++++- .../org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt | 6 ++++++ app/src/main/res/menu/opt_feed.xml | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index 8b82b327c..9bd070028 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -22,6 +22,7 @@ import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.tracker.domain.Tracker import org.koitharu.kotatsu.utils.ext.isScrolledToTop class SettingsActivity : @@ -89,7 +90,7 @@ class SettingsActivity : val fm = supportFragmentManager val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false) fragment.arguments = pref.extras - // fragment.setTargetFragment(caller, 0) + fragment.setTargetFragment(caller, 0) openFragment(fragment) return true } @@ -118,6 +119,7 @@ class SettingsActivity : val fragment = when (intent?.action) { ACTION_READER -> ReaderSettingsFragment() ACTION_SUGGESTIONS -> SuggestionsSettingsFragment() + ACTION_TRACKER -> TrackerSettingsFragment() ACTION_SOURCE -> SourceSettingsFragment.newInstance( intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL ) @@ -133,6 +135,7 @@ class SettingsActivity : private const val ACTION_READER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS" private const val ACTION_SUGGESTIONS = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SUGGESTIONS" + private const val ACTION_TRACKER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_TRACKER" private const val ACTION_SOURCE = "${BuildConfig.APPLICATION_ID}.action.MANAGE_SOURCE_SETTINGS" private const val EXTRA_SOURCE = "source" @@ -146,6 +149,10 @@ class SettingsActivity : Intent(context, SettingsActivity::class.java) .setAction(ACTION_SUGGESTIONS) + fun newTrackerSettingsIntent(context: Context) = + Intent(context, SettingsActivity::class.java) + .setAction(ACTION_TRACKER) + fun newSourceSettingsIntent(context: Context, source: MangaSource) = Intent(context, SettingsActivity::class.java) .setAction(ACTION_SOURCE) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt index 6787ff7da..655f02f8b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt @@ -9,6 +9,7 @@ import androidx.core.view.MenuProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.tracker.work.TrackWorker class FeedMenuProvider( @@ -43,6 +44,11 @@ class FeedMenuProvider( }.show() true } + R.id.action_settings -> { + val intent = SettingsActivity.newTrackerSettingsIntent(context) + context.startActivity(intent) + true + } else -> false } } \ No newline at end of file diff --git a/app/src/main/res/menu/opt_feed.xml b/app/src/main/res/menu/opt_feed.xml index 7da287e4a..44c985e74 100644 --- a/app/src/main/res/menu/opt_feed.xml +++ b/app/src/main/res/menu/opt_feed.xml @@ -15,4 +15,10 @@ android:title="@string/clear_feed" app:showAsAction="never" /> + + \ No newline at end of file From 9e7aaa6c912ef2ec5114f3b4a3f440428951a3c9 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 27 Jun 2022 11:54:33 +0300 Subject: [PATCH 05/23] Option to disable fingerprint authentication --- .../kotatsu/core/prefs/AppSettings.kt | 5 +++++ .../main/ui/protect/ProtectActivity.kt | 3 +++ .../main/ui/protect/ProtectViewModel.kt | 3 +++ .../settings/protect/ProtectSetupActivity.kt | 19 ++++++++++++++++++- .../settings/protect/ProtectSetupViewModel.kt | 7 +++++++ .../res/layout/activity_setup_protect.xml | 13 +++++++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/themes.xml | 1 + 8 files changed, 51 insertions(+), 1 deletion(-) 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 c9b75fd73..5dd49a44b 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 @@ -125,6 +125,10 @@ class AppSettings(context: Context) { get() = prefs.getString(KEY_APP_PASSWORD, null) set(value) = prefs.edit { if (value != null) putString(KEY_APP_PASSWORD, value) else remove(KEY_APP_PASSWORD) } + var isBiometricProtectionEnabled: Boolean + get() = prefs.getBoolean(KEY_PROTECT_APP_BIOMETRIC, true) + set(value) = prefs.edit { putBoolean(KEY_PROTECT_APP_BIOMETRIC, value) } + var sourcesOrder: List get() = prefs.getString(KEY_SOURCES_ORDER, null) ?.split('|') @@ -293,6 +297,7 @@ class AppSettings(context: Context) { const val KEY_READER_MODE_DETECT = "reader_mode_detect" const val KEY_APP_PASSWORD = "app_password" const val KEY_PROTECT_APP = "protect_app" + const val KEY_PROTECT_APP_BIOMETRIC = "protect_app_bio" const val KEY_APP_VERSION = "app_version" const val KEY_ZOOM_MODE = "zoom_mode" const val KEY_BACKUP = "backup" diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt index 953991baa..0da2ee55f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectActivity.kt @@ -96,6 +96,9 @@ class ProtectActivity : } private fun useFingerprint(): Boolean { + if (!viewModel.isBiometricEnabled) { + return false + } if (BiometricManager.from(this).canAuthenticate(BIOMETRIC_WEAK) != BIOMETRIC_SUCCESS) { return false } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt index 69e671c01..85ffe23cb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/protect/ProtectViewModel.kt @@ -19,6 +19,9 @@ class ProtectViewModel( val onUnlockSuccess = SingleLiveEvent() + val isBiometricEnabled + get() = settings.isBiometricProtectionEnabled + fun tryUnlock(password: String) { if (job?.isActive == true) { return diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt index a0145362a..f88a8dad9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupActivity.kt @@ -1,5 +1,7 @@ package org.koitharu.kotatsu.settings.protect +import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -7,9 +9,11 @@ import android.view.KeyEvent import android.view.View import android.view.WindowManager import android.view.inputmethod.EditorInfo +import android.widget.CompoundButton import android.widget.TextView import androidx.core.graphics.Insets import androidx.core.view.isGone +import androidx.core.view.isVisible import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity @@ -18,7 +22,7 @@ import org.koitharu.kotatsu.databinding.ActivitySetupProtectBinding private const val MIN_PASSWORD_LENGTH = 4 class ProtectSetupActivity : BaseActivity(), TextWatcher, - View.OnClickListener, TextView.OnEditorActionListener { + View.OnClickListener, TextView.OnEditorActionListener, CompoundButton.OnCheckedChangeListener { private val viewModel by viewModel() @@ -31,6 +35,9 @@ class ProtectSetupActivity : BaseActivity(), TextWa binding.buttonNext.setOnClickListener(this) binding.buttonCancel.setOnClickListener(this) + binding.switchBiometric.isChecked = viewModel.isBiometricEnabled + binding.switchBiometric.setOnCheckedChangeListener(this) + viewModel.isSecondStep.observe(this, this::onStepChanged) viewModel.onPasswordSet.observe(this) { finishAfterTransition() @@ -62,6 +69,10 @@ class ProtectSetupActivity : BaseActivity(), TextWa } } + override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) { + viewModel.setBiometricEnabled(isChecked) + } + override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { return if (actionId == EditorInfo.IME_ACTION_DONE && binding.buttonNext.isEnabled) { binding.buttonNext.performClick() @@ -85,6 +96,7 @@ class ProtectSetupActivity : BaseActivity(), TextWa private fun onStepChanged(isSecondStep: Boolean) { binding.buttonCancel.isGone = isSecondStep + binding.switchBiometric.isVisible = isSecondStep && isBiometricAvailable() if (isSecondStep) { binding.layoutPassword.helperText = getString(R.string.repeat_password) binding.buttonNext.setText(R.string.confirm) @@ -93,4 +105,9 @@ class ProtectSetupActivity : BaseActivity(), TextWa binding.buttonNext.setText(R.string.next) } } + + private fun isBiometricAvailable(): Boolean { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt index 1244c836e..c9013d23d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/protect/ProtectSetupViewModel.kt @@ -22,6 +22,9 @@ class ProtectSetupViewModel( val onPasswordMismatch = SingleLiveEvent() val onClearText = SingleLiveEvent() + val isBiometricEnabled + get() = settings.isBiometricProtectionEnabled + fun onNextClick(password: String) { if (firstPassword.value == null) { firstPassword.value = password @@ -35,4 +38,8 @@ class ProtectSetupViewModel( } } } + + fun setBiometricEnabled(isEnabled: Boolean) { + settings.isBiometricProtectionEnabled = isEnabled + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setup_protect.xml b/app/src/main/res/layout/activity_setup_protect.xml index 8fbd925a7..78c0e8e02 100644 --- a/app/src/main/res/layout/activity_setup_protect.xml +++ b/app/src/main/res/layout/activity_setup_protect.xml @@ -62,6 +62,19 @@ + + Something went wrong. Please submit a bug report to the developers to help us fix it. Send Disable all + Use fingerprint if available \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 16b847cc8..691c50251 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -72,6 +72,7 @@ @style/Widget.Material3.CardView.Filled @style/Widget.Kotatsu.RecyclerView @style/Widget.Kotatsu.ListItemTextView + @style/Widget.Material3.CompoundButton.MaterialSwitch @style/TextAppearance.Kotatsu.Menu From b1d51bbefbcb9bdea442662b4322ddb95df01517 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 27 Jun 2022 12:11:22 +0300 Subject: [PATCH 06/23] Migrate to MaterialSwitch component --- .../main/res/layout/activity_category_edit.xml | 2 +- .../res/layout/item_search_suggestion_header.xml | 2 +- app/src/main/res/layout/item_source_config.xml | 2 +- .../res/layout/item_source_config_draggable.xml | 2 +- .../layout/preference_widget_material_switch.xml | 9 +++++++++ app/src/main/res/values-night/bools.xml | 1 - app/src/main/res/values-v23/styles.xml | 11 ----------- app/src/main/res/values/bools.xml | 1 - app/src/main/res/values/styles.xml | 15 ++++----------- app/src/main/res/values/themes.xml | 2 +- 10 files changed, 18 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/layout/preference_widget_material_switch.xml delete mode 100644 app/src/main/res/values-v23/styles.xml diff --git a/app/src/main/res/layout/activity_category_edit.xml b/app/src/main/res/layout/activity_category_edit.xml index 4cd3a7afe..93eef7b49 100644 --- a/app/src/main/res/layout/activity_category_edit.xml +++ b/app/src/main/res/layout/activity_category_edit.xml @@ -68,7 +68,7 @@ - - - - diff --git a/app/src/main/res/layout/preference_widget_material_switch.xml b/app/src/main/res/layout/preference_widget_material_switch.xml new file mode 100644 index 000000000..f4e6866c1 --- /dev/null +++ b/app/src/main/res/layout/preference_widget_material_switch.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-night/bools.xml b/app/src/main/res/values-night/bools.xml index bd0cb49f5..869e5dabd 100644 --- a/app/src/main/res/values-night/bools.xml +++ b/app/src/main/res/values-night/bools.xml @@ -2,5 +2,4 @@ false false - true \ No newline at end of file diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml deleted file mode 100644 index f7eb9b21e..000000000 --- a/app/src/main/res/values-v23/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml index 6cb53be9e..0940b1dbb 100644 --- a/app/src/main/res/values/bools.xml +++ b/app/src/main/res/values/bools.xml @@ -3,5 +3,4 @@ false true false - false \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8951634e9..b4f3f77cf 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -86,13 +86,6 @@ 16dp - - - - @@ -180,4 +169,8 @@ @layout/preference_dialog_autocompletetextview + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 691c50251..f23f676ba 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -68,11 +68,11 @@ @style/Widget.Material3.Toolbar @style/Widget.Material3.AppBarLayout @style/Widget.Kotatsu.Tabs - @style/Widget.Kotatsu.Switch @style/Widget.Material3.CardView.Filled @style/Widget.Kotatsu.RecyclerView @style/Widget.Kotatsu.ListItemTextView @style/Widget.Material3.CompoundButton.MaterialSwitch + @style/Preference.SwitchPreferenceCompat.M3 @style/TextAppearance.Kotatsu.Menu From 09a3c5da230009075bebc4f45773b544dc43ed38 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 27 Jun 2022 12:26:23 +0300 Subject: [PATCH 07/23] Update dialogs --- .../kotatsu/base/ui/dialog/TextInputDialog.kt | 89 ------------------- .../ui/categories/CategoriesEditDelegate.kt | 4 +- .../history/ui/HistoryListMenuProvider.kt | 4 +- .../koitharu/kotatsu/main/ui/MainActivity.kt | 3 +- 4 files changed, 8 insertions(+), 92 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt deleted file mode 100644 index 4b5c02ca6..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt +++ /dev/null @@ -1,89 +0,0 @@ -package org.koitharu.kotatsu.base.ui.dialog - -import android.content.Context -import android.content.DialogInterface -import android.text.InputFilter -import android.view.LayoutInflater -import androidx.annotation.StringRes -import androidx.appcompat.app.AlertDialog -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.koitharu.kotatsu.databinding.DialogInputBinding - -class TextInputDialog private constructor( - private val delegate: AlertDialog, -) : DialogInterface by delegate { - - fun show() = delegate.show() - - class Builder(context: Context) { - - private val binding = DialogInputBinding.inflate(LayoutInflater.from(context)) - - private val delegate = MaterialAlertDialogBuilder(context) - .setView(binding.root) - - fun setTitle(@StringRes titleResId: Int): Builder { - delegate.setTitle(titleResId) - return this - } - - fun setTitle(title: CharSequence): Builder { - delegate.setTitle(title) - return this - } - - fun setHint(@StringRes hintResId: Int): Builder { - binding.inputEdit.hint = binding.root.context.getString(hintResId) - return this - } - - fun setMaxLength(maxLength: Int, strict: Boolean): Builder { - with(binding.inputLayout) { - counterMaxLength = maxLength - isCounterEnabled = maxLength > 0 - } - if (strict && maxLength > 0) { - binding.inputEdit.filters += InputFilter.LengthFilter(maxLength) - } - return this - } - - fun setInputType(inputType: Int): Builder { - binding.inputEdit.inputType = inputType - return this - } - - fun setText(text: String): Builder { - binding.inputEdit.setText(text) - binding.inputEdit.setSelection(text.length) - return this - } - - fun setPositiveButton( - @StringRes textId: Int, - listener: (DialogInterface, String) -> Unit - ): Builder { - delegate.setPositiveButton(textId) { dialog, _ -> - listener(dialog, binding.inputEdit.text?.toString().orEmpty()) - } - return this - } - - fun setNegativeButton( - @StringRes textId: Int, - listener: DialogInterface.OnClickListener? = null - ): Builder { - delegate.setNegativeButton(textId, listener) - return this - } - - fun setOnCancelListener(listener: DialogInterface.OnCancelListener): Builder { - delegate.setOnCancelListener(listener) - return this - } - - fun create() = - TextInputDialog(delegate.create()) - - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt index f7a98c078..cece6607f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt @@ -4,6 +4,7 @@ import android.content.Context import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory +import com.google.android.material.R as materialR class CategoriesEditDelegate( private val context: Context, @@ -11,9 +12,10 @@ class CategoriesEditDelegate( ) { fun deleteCategory(category: FavouriteCategory) { - MaterialAlertDialogBuilder(context) + MaterialAlertDialogBuilder(context, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered) .setMessage(context.getString(R.string.category_delete_confirm, category.title)) .setTitle(R.string.remove_category) + .setIcon(R.drawable.ic_delete) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(R.string.remove) { _, _ -> callback.onDeleteCategory(category) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt index b27629ce6..fe0daa58c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt @@ -7,6 +7,7 @@ import android.view.MenuItem import androidx.core.view.MenuProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R +import com.google.android.material.R as materialR class HistoryListMenuProvider( private val context: Context, @@ -19,9 +20,10 @@ class HistoryListMenuProvider( override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { R.id.action_clear_history -> { - MaterialAlertDialogBuilder(context) + MaterialAlertDialogBuilder(context, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered) .setTitle(R.string.clear_history) .setMessage(R.string.text_clear_history_prompt) + .setIcon(R.drawable.ic_delete) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(R.string.clear) { _, _ -> viewModel.clearHistory() diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 55cd36559..b327ae030 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -299,8 +299,9 @@ class MainActivity : } override fun onClearSearchHistory() { - MaterialAlertDialogBuilder(this) + MaterialAlertDialogBuilder(this, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered) .setTitle(R.string.clear_search_history) + .setIcon(R.drawable.ic_clear_all) .setMessage(R.string.text_clear_search_history_prompt) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(R.string.clear) { _, _ -> From 9956f1ae4f3b476cc40671868c32cb9f41b599d8 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 27 Jun 2022 13:11:08 +0300 Subject: [PATCH 08/23] Fix detailed list item --- .../main/res/layout/item_manga_list_details.xml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/layout/item_manga_list_details.xml b/app/src/main/res/layout/item_manga_list_details.xml index 468a1b476..b08c80bb6 100644 --- a/app/src/main/res/layout/item_manga_list_details.xml +++ b/app/src/main/res/layout/item_manga_list_details.xml @@ -18,8 +18,8 @@ android:layout_height="match_parent" android:orientation="vertical" android:scaleType="centerCrop" - tools:src="@tools:sample/backgrounds/scenic" - app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover"/> + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover" + tools:src="@tools:sample/backgrounds/scenic" /> + android:baselineAligned="false" + android:clipChildren="false" + android:orientation="horizontal"> From 33bccd10fed5d6451a31b16af2a31493acaf702b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 27 Jun 2022 14:44:43 +0300 Subject: [PATCH 09/23] Update widgets for Android 12 --- .../widget/recent/RecentListFactory.kt | 17 +++++++++++---- .../widget/shelf/ShelfConfigActivity.kt | 5 ----- .../kotatsu/widget/shelf/ShelfListFactory.kt | 16 +++++++++++--- .../main/res/drawable/bg_appwidget_card.xml | 7 +++++++ app/src/main/res/layout/item_recent.xml | 4 ++-- app/src/main/res/layout/item_shelf.xml | 21 +++++++++++-------- app/src/main/res/layout/widget_recent.xml | 2 +- app/src/main/res/layout/widget_shelf.xml | 9 ++++---- app/src/main/res/values-v31/dimens.xml | 4 ++++ app/src/main/res/values-v31/themes.xml | 6 ++++++ app/src/main/res/values/dimens.xml | 4 ++++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/values/themes.xml | 4 ++++ app/src/main/res/xml/widget_recent.xml | 1 + app/src/main/res/xml/widget_shelf.xml | 6 +++++- 15 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/drawable/bg_appwidget_card.xml create mode 100644 app/src/main/res/values-v31/dimens.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt index 3e4125a21..bf8fbf202 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt @@ -7,6 +7,8 @@ import android.widget.RemoteViewsService import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest +import coil.size.Size +import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaIntent @@ -22,9 +24,15 @@ class RecentListFactory( ) : RemoteViewsService.RemoteViewsFactory { private val dataSet = ArrayList() + private val transformation = RoundedCornersTransformation( + context.resources.getDimension(R.dimen.appwidget_corner_radius_inner) + ) + private val coverSize = Size( + context.resources.getDimensionPixelSize(R.dimen.widget_cover_width), + context.resources.getDimensionPixelSize(R.dimen.widget_cover_height), + ) - override fun onCreate() { - } + override fun onCreate() = Unit override fun getLoadingView() = null @@ -45,6 +53,8 @@ class RecentListFactory( val cover = coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) + .size(coverSize) + .transformations(transformation) .build() ).requireBitmap() views.setImageViewBitmap(R.id.imageView_cover, cover) @@ -61,6 +71,5 @@ class RecentListFactory( override fun getViewTypeCount() = 1 - override fun onDestroy() { - } + override fun onDestroy() = Unit } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt index b404b3286..44a2cc632 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfConfigActivity.kt @@ -10,8 +10,6 @@ import androidx.core.graphics.Insets import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding -import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.divider.MaterialDividerItemDecoration import com.google.android.material.snackbar.Snackbar import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R @@ -40,9 +38,6 @@ class ShelfConfigActivity : BaseActivity(), setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) } adapter = CategorySelectAdapter(this) - binding.recyclerView.addItemDecoration( - MaterialDividerItemDecoration(this, RecyclerView.VERTICAL) - ) binding.recyclerView.adapter = adapter binding.buttonDone.isVisible = true binding.buttonDone.setOnClickListener(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt index 61fd0d9ab..2eb942ef5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt @@ -7,6 +7,8 @@ import android.widget.RemoteViewsService import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest +import coil.size.Size +import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaIntent @@ -20,14 +22,20 @@ class ShelfListFactory( private val context: Context, private val favouritesRepository: FavouritesRepository, private val coil: ImageLoader, - widgetId: Int + widgetId: Int, ) : RemoteViewsService.RemoteViewsFactory { private val dataSet = ArrayList() private val config = AppWidgetConfig(context, widgetId) + private val transformation = RoundedCornersTransformation( + context.resources.getDimension(R.dimen.appwidget_corner_radius_inner) + ) + private val coverSize = Size( + context.resources.getDimensionPixelSize(R.dimen.widget_cover_width), + context.resources.getDimensionPixelSize(R.dimen.widget_cover_height), + ) - override fun onCreate() { - } + override fun onCreate() = Unit override fun getLoadingView() = null @@ -56,6 +64,8 @@ class ShelfListFactory( val cover = coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) + .size(coverSize) + .transformations(transformation) .build() ).requireBitmap() views.setImageViewBitmap(R.id.imageView_cover, cover) diff --git a/app/src/main/res/drawable/bg_appwidget_card.xml b/app/src/main/res/drawable/bg_appwidget_card.xml new file mode 100644 index 000000000..35a460504 --- /dev/null +++ b/app/src/main/res/drawable/bg_appwidget_card.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_recent.xml b/app/src/main/res/layout/item_recent.xml index e5b884dd4..26cd12560 100644 --- a/app/src/main/res/layout/item_recent.xml +++ b/app/src/main/res/layout/item_recent.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/imageView_cover" - android:layout_width="92dp" - android:layout_height="128dp" + android:layout_width="@dimen/widget_cover_width" + android:layout_height="@dimen/widget_cover_height" android:scaleType="centerCrop" tools:ignore="ContentDescription" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_shelf.xml b/app/src/main/res/layout/item_shelf.xml index 657613c36..41ad4e865 100644 --- a/app/src/main/res/layout/item_shelf.xml +++ b/app/src/main/res/layout/item_shelf.xml @@ -3,21 +3,24 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:padding="4dp" + android:theme="@style/Theme.Kotatsu.AppWidgetContainer"> + tools:ignore="UnusedAttribute,UselessParent"> @@ -25,12 +28,12 @@ android:id="@+id/textView_title" android:layout_width="match_parent" android:layout_height="wrap_content" + android:elegantTextHeight="false" android:ellipsize="end" - android:gravity="center" android:lines="2" - android:shadowColor="@android:color/black" - android:shadowRadius="1" - android:textColor="@android:color/white" /> + android:paddingHorizontal="4dp" + android:paddingBottom="4dp" + android:textColor="?android:attr/textColorPrimary" /> diff --git a/app/src/main/res/layout/widget_recent.xml b/app/src/main/res/layout/widget_recent.xml index e10f76b3e..f65032b83 100644 --- a/app/src/main/res/layout/widget_recent.xml +++ b/app/src/main/res/layout/widget_recent.xml @@ -9,7 +9,7 @@ android:id="@+id/stackView" android:layout_width="match_parent" android:layout_height="match_parent" - tools:listitem="@layout/item_shelf" /> + tools:listitem="@layout/item_recent" /> + android:layout_height="match_parent" + android:background="?android:attr/colorBackground" + android:padding="4dp" + android:theme="@style/Theme.Kotatsu.AppWidgetContainer"> + android:textColor="?android:attr/textColorPrimary" /> \ No newline at end of file diff --git a/app/src/main/res/values-v31/dimens.xml b/app/src/main/res/values-v31/dimens.xml new file mode 100644 index 000000000..e99ffda56 --- /dev/null +++ b/app/src/main/res/values-v31/dimens.xml @@ -0,0 +1,4 @@ + + + @android:dimen/system_app_widget_inner_radius + \ No newline at end of file diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml index fd0950ca4..c84e6787a 100644 --- a/app/src/main/res/values-v31/themes.xml +++ b/app/src/main/res/values-v31/themes.xml @@ -41,4 +41,10 @@ @color/m3_dynamic_dark_highlighted_text @color/m3_dynamic_default_color_primary_text + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ad8250116..d563b55f8 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -24,10 +24,14 @@ 2dp 12dp 10dp + 116dp + 84dp 124dp 4dp 0dp 8dp + + 8dp \ 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 1e1e316d5..79ec942ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -302,4 +302,6 @@ Send Disable all Use fingerprint if available + Manga from your favourites + Your recently read manga \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f23f676ba..2d1ae4e76 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -103,4 +103,8 @@ @style/Theme.Kotatsu.ActionMode.CloseButton + diff --git a/app/src/main/res/xml/widget_recent.xml b/app/src/main/res/xml/widget_recent.xml index 4f4beea5a..7b6985481 100644 --- a/app/src/main/res/xml/widget_recent.xml +++ b/app/src/main/res/xml/widget_recent.xml @@ -1,6 +1,7 @@ + android:widgetCategory="home_screen" + android:widgetFeatures="reconfigurable" + tools:ignore="UnusedAttribute" /> From e231dba0b065ac80b3e1e2dca6aea7edaf2b1e4e Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 29 Jun 2022 09:34:13 +0200 Subject: [PATCH 10/23] Translated using Weblate (Ukrainian) Currently translated at 100.0% (301 of 301 strings) Co-authored-by: Artem Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/ Translation: Kotatsu/Strings --- app/src/main/res/values-uk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5d1134e6a..827258f89 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -298,4 +298,5 @@ Допомагає з перевірками фонових оновлень Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити. Надіслати + Вимкнути все \ No newline at end of file From 20a0eda5dbd72b358d6a10c8dcdb1a0f6b3e791f Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Wed, 29 Jun 2022 09:34:14 +0200 Subject: [PATCH 11/23] Translated using Weblate (Finnish) Currently translated at 99.6% (303 of 304 strings) Translated using Weblate (French) Currently translated at 100.0% (304 of 304 strings) Translated using Weblate (Italian) Currently translated at 100.0% (304 of 304 strings) Translated using Weblate (German) Currently translated at 100.0% (304 of 304 strings) Translated using Weblate (Spanish) Currently translated at 99.3% (302 of 304 strings) Co-authored-by: J. Lavoie Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ Translation: Kotatsu/Strings --- app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-es/strings.xml | 3 +++ app/src/main/res/values-fi/strings.xml | 3 +++ app/src/main/res/values-fr/strings.xml | 3 +++ app/src/main/res/values-it/strings.xml | 3 +++ 5 files changed, 15 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1db0ee4f2..36249510e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -299,4 +299,7 @@ Senden Etwas ist schief gelaufen. Bitte senden Sie einen Fehlerbericht an die Entwickler, damit wir das Problem beheben können. Alle deaktivieren + Fingerabdruck verwenden, falls vorhanden + Manga aus Ihren Favoriten + Ihr kürzlich gelesener Manga \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 61a329970..448aa0ece 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -298,4 +298,7 @@ Desactivar la optimización de la batería Enviar Algo ha ido mal. Por favor, envía un informe de errores a los desarrolladores para ayudarnos a solucionarlo. + Utilizar la huella dactilar si está disponible + Mangas de tus favoritos + Sus mangas recientemente leídos \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index bed77c1da..45e41143e 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -299,4 +299,7 @@ Jokin meni pieleen. Lähetä vikailmoitus kehittäjille, jotta voimme korjata sen. Poista kaikki käytöstä Lähetä + Käytä sormenjälkeä, jos käytettävissä + Manga suosikeistasi + Äskettäin lukemasi manga \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3b3946b6b..e62ddfdc9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -299,4 +299,7 @@ Un problème est survenu. Veuillez soumettre un rapport de bogue aux développeurs pour nous aider à le corriger. Envoyer Tout désactiver + Utiliser l\'empreinte digitale si elle est disponible + Vos mangas récemment lus + Les mangas de vos favoris \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7ce25744c..d132159ae 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -299,4 +299,7 @@ Qualcosa è andato storto. Si prega di inviare una segnalazione di bug agli sviluppatori per aiutarci a risolvere il problema. Invia Disabilita tutto + Usa le impronte digitali se disponibili + Manga dai preferiti + I manga letti di recente \ No newline at end of file From a9b8174b10acd067377cbe4ed41c0c5ddd4dc83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 29 Jun 2022 09:34:14 +0200 Subject: [PATCH 12/23] Translated using Weblate (Turkish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (304 of 304 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/ Translation: Kotatsu/Strings --- app/src/main/res/values-tr/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 732d6bce3..6bc8cf3e3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -300,4 +300,7 @@ Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin. Gönder Tümünü devre dışı bırak + Varsa parmak izi kullan + Favorilerinizden mangalar + Son okuduğunuz mangalar \ No newline at end of file From a37b9a1036ba8ae7a2323db89c61fa3f935afd74 Mon Sep 17 00:00:00 2001 From: kuragehime Date: Wed, 29 Jun 2022 09:34:15 +0200 Subject: [PATCH 13/23] Translated using Weblate (Japanese) Currently translated at 100.0% (304 of 304 strings) Co-authored-by: kuragehime Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ja/ Translation: Kotatsu/Strings --- app/src/main/res/values-ja/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 791348bc8..607665284 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -299,4 +299,7 @@ 何か問題が発生しました。開発者にバグレポートを提出し、解決にご協力ください。 送信 すべて無効にする + 最近読んだ漫画 + 指紋がある場合は、指紋を使用する + お気に入りの漫画 \ No newline at end of file From f71274d90da694386ce6a2bbe628a511287da697 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 29 Jun 2022 10:54:17 +0300 Subject: [PATCH 14/23] Update translations --- app/src/main/res/values-ru/strings.xml | 495 ++++++++++---------- app/src/main/res/values-tr/strings.xml | 603 ++++++++++++------------- app/src/main/res/values-uk/strings.xml | 599 ++++++++++++------------ 3 files changed, 859 insertions(+), 838 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 505aba081..70d3f0e07 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,252 +1,252 @@ - Закрыть меню - Открыть меню - На устройстве - Избранное - История - Произошла ошибка - Не удалось подключиться к интернету - Подробности - Главы - Список - Подробный список - Таблица - Вид списка - Настройки - Онлайн каталоги - Загрузка… - Глава %1$d из %2$d - Закрыть - Повторить - Очистить историю - Ничего не найдено - Истории пока нет - Читать + Закрыть меню + Открыть меню + На устройстве + Избранное + История + Произошла ошибка + Не удалось подключиться к интернету + Подробности + Главы + Список + Подробный список + Таблица + Вид списка + Настройки + Онлайн каталоги + Загрузка… + Глава %1$d из %2$d + Закрыть + Повторить + Очистить историю + Ничего не найдено + Истории пока нет + Читать Избранного пока нет - В избранное - Новая категория - Добавить - Введите название - Сохранить - Поделиться - Создать ярлык… - Поделиться %s - Поиск - Поиск манги - Загрузка… - Обработка… - Загружено - Загрузки - Имя - Популярная - Обновлённая - Новая - Рейтинг + В избранное + Новая категория + Добавить + Введите название + Сохранить + Поделиться + Создать ярлык… + Поделиться %s + Поиск + Поиск манги + Загрузка… + Обработка… + Загружено + Загрузки + Имя + Популярная + Обновлённая + Новая + Рейтинг Порядок сортировки Фильтр - Тема - Светлая - Тёмная - Как в системе - Страницы - Очистить - Очистить всю историю чтения полностью\? - Удалить - «%s» удалено из истории - «%s» удалено с устройства - Дождитесь завершения загрузки… - Сохранить страницу - Сохранено - Поделиться изображением - Импорт - Удалить - Операция не поддерживается - Выберите CBZ-файл или ZIP - Нет описания - История и кэш - Очистить кэш страниц - Кэш - Б|кБ|МБ|ГБ|ТБ - Стандартный - Манхва - Режим чтения - Размер таблицы - Поиск по %s - Удалить мангу - Удалить \"%s\" с устройства навсегда\? - Настройки чтения - Листание страниц - Нажатия по краям - Кнопки громкости - Продолжить - Предупреждение - Это может привести к расходу большого количества трафика - Больше не спрашивать - Отмена… - Ошибка - Очистить кэш миниатюр - Очистить историю поиска - Очищено - Только жесты - Внутренний накопитель - Внешнее хранилище - Домен - Проверять наличие новых версий приложения - Доступна новая версия приложения - Показывать уведомление, если доступна новая версия - Открыть в веб-браузере - В этой манге %s. Сохранить их все\? - Сохранить - Уведомления - Включено %1$d из %2$d - Новые главы - Загрузить - Читать с начала - Перезапустить - Настройки уведомлений - Звук уведомления - Светодиодная индикация - Вибросигнал - Категории избранного - Категории… - Переименовать - Удалить категорию \"%s\" из избранного\? + Тема + Светлая + Тёмная + Как в системе + Страницы + Очистить + Очистить всю историю чтения полностью\? + Удалить + «%s» удалено из истории + «%s» удалено с устройства + Дождитесь завершения загрузки… + Сохранить страницу + Сохранено + Поделиться изображением + Импорт + Удалить + Операция не поддерживается + Выберите CBZ-файл или ZIP + Нет описания + История и кэш + Очистить кэш страниц + Кэш + Б|кБ|МБ|ГБ|ТБ + Стандартный + Манхва + Режим чтения + Размер таблицы + Поиск по %s + Удалить мангу + Удалить \"%s\" с устройства навсегда\? + Настройки чтения + Листание страниц + Нажатия по краям + Кнопки громкости + Продолжить + Предупреждение + Это может привести к расходу большого количества трафика + Больше не спрашивать + Отмена… + Ошибка + Очистить кэш миниатюр + Очистить историю поиска + Очищено + Только жесты + Внутренний накопитель + Внешнее хранилище + Домен + Проверять наличие новых версий приложения + Доступна новая версия приложения + Показывать уведомление, если доступна новая версия + Открыть в веб-браузере + В этой манге %s. Сохранить их все\? + Сохранить + Уведомления + Включено %1$d из %2$d + Новые главы + Загрузить + Читать с начала + Перезапустить + Настройки уведомлений + Звук уведомления + Светодиодная индикация + Вибросигнал + Категории избранного + Категории… + Переименовать + Удалить категорию \"%s\" из избранного\? \nВся манга в ней будет потеряна. - Удалить - Как-то здесь пусто… - Попробуйте переформулировать запрос. - Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию - То, что вы прочитаете, будет отображено здесь - Найдите, что почитать, в боковом меню. - Сохраните что-нибудь - Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. - Полка - Недавнее - Анимация листания - Папка для загрузок - Недоступно - Нет доступного хранилища - Другое хранилище + Удалить + Как-то здесь пусто… + Попробуйте переформулировать запрос. + Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию + То, что вы прочитаете, будет отображено здесь + Найдите, что почитать, в боковом меню. + Сохраните что-нибудь + Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. + Полка + Недавнее + Анимация листания + Папка для загрузок + Недоступно + Нет доступного хранилища + Другое хранилище Готово - Всё избранное - Категория пуста - Прочитать позже - Обновления - Новые главы из того, что вы читаете, будут показаны здесь - Результаты поиска - Похожие - Новая версия: %s - Размер: %s - Ожидание подключения… - Очистить ленту обновлений - Очищено - Повернуть экран - Обновить - Обновление скоро начнётся - Следить за обновлениями - Не проверять - Введите пароль - Неверный пароль - Защитить приложение - Запрашивать пароль при запуске Kotatsu - Повторите пароль - Пароли не совпадают - О программе - Версия %s - Проверить обновления - Проверка обновления… - Не удалось проверить обновления - Нет доступных обновлений - Справа налево (←) - Создать категорию - Масштабирование - Вписать в экран - Подогнать по высоте - Подогнать по ширине - Исходный размер - Чёрная - Потребляет меньше энергии на экранах AMOLED - Резервное копирование и восстановление - Создать резервную копию - Восстановить данные - Восстановлено - Подготовка… - Файл не найден - Все данные были восстановлены - Данные были восстановлены, но возникли некоторые ошибки - Вы можете создать резервную копию избранного и истории и потом восстановить их - Только что - Вчера - Давно - Группировать - Сегодня - Попробовать ещё раз - Выбранный режим будет сохранён для текущей манги - Без звука - Необходимо пройти CAPTCHA - Пройти - Очистить куки - Все файлы cookie были удалены - Проверка новых глав: %1$d из %2$d - Очистить ленту - Удалить всю историю обновлений навсегда\? - Проверка новых глав - В обратном порядке - Войти - Авторизуйтесь, чтобы просмотреть этот контент - По умолчанию: %s - …и ещё %1$d - Далее - Введите пароль для запуска приложения - Подтвердить - Пароль должен состоять из 4 символов или более + Всё избранное + Категория пуста + Прочитать позже + Обновления + Новые главы из того, что вы читаете, будут показаны здесь + Результаты поиска + Похожие + Новая версия: %s + Размер: %s + Ожидание подключения… + Очистить ленту обновлений + Очищено + Повернуть экран + Обновить + Обновление скоро начнётся + Следить за обновлениями + Не проверять + Введите пароль + Неверный пароль + Защитить приложение + Запрашивать пароль при запуске Kotatsu + Повторите пароль + Пароли не совпадают + О программе + Версия %s + Проверить обновления + Проверка обновления… + Не удалось проверить обновления + Нет доступных обновлений + Справа налево (←) + Создать категорию + Масштабирование + Вписать в экран + Подогнать по высоте + Подогнать по ширине + Исходный размер + Чёрная + Потребляет меньше энергии на экранах AMOLED + Резервное копирование и восстановление + Создать резервную копию + Восстановить данные + Восстановлено + Подготовка… + Файл не найден + Все данные были восстановлены + Данные были восстановлены, но возникли некоторые ошибки + Вы можете создать резервную копию избранного и истории и потом восстановить их + Только что + Вчера + Давно + Группировать + Сегодня + Попробовать ещё раз + Выбранный режим будет сохранён для текущей манги + Без звука + Необходимо пройти CAPTCHA + Пройти + Очистить куки + Все файлы cookie были удалены + Проверка новых глав: %1$d из %2$d + Очистить ленту + Удалить всю историю обновлений навсегда\? + Проверка новых глав + В обратном порядке + Войти + Авторизуйтесь, чтобы просмотреть этот контент + По умолчанию: %s + …и ещё %1$d + Далее + Введите пароль для запуска приложения + Подтвердить + Пароль должен состоять из 4 символов или более Поиск только по %s - Другие + Другие Добро пожаловать - Удалить все последние поисковые запросы навсегда\? - Резервная копия сохранена - Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. - Подробнее - В очереди - Нет активных загрузок - Глава отсутствует - Скачайте или прочитайте эту недостающую главу онлайн. - Помочь с переводом приложения - Перевод + Удалить все последние поисковые запросы навсегда\? + Резервная копия сохранена + Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. + Подробнее + В очереди + Нет активных загрузок + Глава отсутствует + Скачайте или прочитайте эту недостающую главу онлайн. + Помочь с переводом приложения + Перевод Тема на 4PDA - Обратная связь + Обратная связь Авторизация выполнена - Вход в %s не поддерживается - Вы выйдете из всех источников - Жанры - Завершено - Онгоинг - Формат даты - По умолчанию - Исключить NSFW мангу из истории - Вы должны ввести имя - Показывать номера страницы - Включенные источники - Доступные источники - Динамическая тема - Применяет тему приложения, основанную на цветовой палитре обоев на устройстве - Политика скриншотов - Разрешить - Запретить для NSFW - Всегда блокировать - Рекомендации - Включить рекомендации - Предлагать мангу на основе Ваших предпочтений - Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы - Начните читать мангу, чтобы получать персональные предложения - Не предлагать NSFW мангу - Включено - Выключено - Не удалось загрузить список жанров - Вычисление… - Создать проблему на GitHub - Импорт манги: %1$d из %2$d + Вход в %s не поддерживается + Вы выйдете из всех источников + Жанры + Завершено + Онгоинг + Формат даты + По умолчанию + Исключить NSFW мангу из истории + Вы должны ввести имя + Показывать номера страницы + Включенные источники + Доступные источники + Динамическая тема + Применяет тему приложения, основанную на цветовой палитре обоев на устройстве + Политика скриншотов + Разрешить + Запретить для NSFW + Всегда блокировать + Рекомендации + Включить рекомендации + Предлагать мангу на основе Ваших предпочтений + Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы + Начните читать мангу, чтобы получать персональные предложения + Не предлагать NSFW мангу + Включено + Выключено + Не удалось загрузить список жанров + Вычисление… + Создать проблему на GitHub + Импорт манги: %1$d из %2$d Сбросить фильтр Поиск по жанрам Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках. @@ -282,4 +282,23 @@ Изменить Изменить категорию Нет категорий избранного + Добавить закладку + Удалить закладку + Закладки + Закладка удалена + Закладка добавлена + Отменить + Удалено из истории + DNS через HTTPS + Режим по умолчанию + Автоопределение режима чтения + Автоматически определяет, является ли манга веб-комиксом + Отключить оптимизацию энергопотребления + Помогает с фоновой проверкой обновлений + Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить + Отправить + Отключить все + Использовать отпечаток пальца, если доступно + Манга из Вашего избранного + Манга, которую Вы недавно читали \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6bc8cf3e3..661dc853b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,306 +1,305 @@ - İnternete bağlı olduğunuzdan emin olunuz - Menüyü kapat - Menüyü aç - Dahili Depolama - Favoriler - Geçmiş - Bölümler - Liste - Detaylı liste - Izgara - Liste modu - Yükleniyor… - Kapat - Tekrar dene - Geçmişi temizle - Hiçbir şey bulunamadı - Sen geçmişiniz yok - Oku - Henüz favorileriniz yok - Favoriniz - Yeni kategori - Ekle - Kategori ismi girin - Kaydet - Paylaş - %s Paylaş - Ara - Manga ara - İndiriliyor… - İşleniyor… - İndirildi - İndirilenler - Ad - Güncellenme - Yeniler - Puanlama - Litre - Tema - Açık - Koyu - Takip sistemi - Sayfalar - Temizle - Tüm okuma geçmişi kalıcı olarak silinsin mi\? - Kaldır - “%s” geçmişinden kaldırıldı - “%s” yerel depolama alanından sil - Lütfen bitmesini bekleyin… - Sayfayı kaydet - Resmi paylaş - Popüler - Detaylar - Ayarlar - Kaydet - Tekrar başlat - Bir hata oluştu - Uzak kaynaklar - Uyarı - Geçmiş ve önbellek - Temizlendi - Devam - Müsait değil - Boş kategori - Önbellek - Uygulamanın yeni sürümlerini kontrol edin - Kaldır - Sil - Bölüm %1$d / %2$d - Bir ZIP veya CBZ dosyası seçin. - Okuma modu - Izgara boyutu - Webtoon - B|kB|MB|GB|TB - Okuyucu ayarları - Ses butonları - Bir daha sorma - İptal ediliyor… - Hata - Küçük resim önbelleğini temizle - Yalnızca hareketler - Alan adi - Web tarayıcısında aç - Yeni bölümler - Bildirim ayarları - Bildirim sesi - LED göstergesi - Titreşim - Diğer depolama - Güncellemeler - Kısayol oluştur… - İçe aktar - Mangayı sil - Bilgi işleniyor… - Sıralama düzeni - Açıklama yok - Bu işlem desteklenmiyor - Standart - Sayfa önbelleğini temizle - %s üzerinde ara - Dahili depolama - Bildirimler - Sayfaları değiştir - Bu çok fazla veri aktarabilir - Kaydet - İndir - İndirilenler klasörü - Harici depolama - Baştan oku - Kategoriler… - Uygulamanın yeni bir sürümü mevcut - Yeni bir sürüm mevcutsa bildirimini göster - Favori kategoriler - Bitti - Sonra oku - Sayfa animasyonu - Kullanılabilir depolama alanı yok - Yeniden adlandır - “%s” cihazdan kalıcı olarak silinsin mi\? - Arama geçmişini temizle - Burası biraz boş… - Ekranı döndür - Ölçek modu - Yüksekliğe sığdır - Siyah - Başlangıçta tut - Akışı temizle - Bu eksik bölümü çevrim içi olarak indirin veya okuyun. - Yedekten geri yükle - Güncelle - Oturum aç - Bitti - Hakkında - Bu içeriği görüntülemek için oturum açın - Onayla - Yetkilendirildi - Az önce - Kenar dokunuşları - Bu mangada %s var. Hepsi kaydedilsin mi\? - %1$d / %2$d açık - “%s” kategorisi favorilerinizden kaldırılsın mı\? + İnternete bağlı olduğunuzdan emin olunuz + Menüyü kapat + Menüyü aç + Dahili Depolama + Favoriler + Geçmiş + Bölümler + Liste + Detaylı liste + Izgara + Liste modu + Yükleniyor… + Kapat + Tekrar dene + Geçmişi temizle + Hiçbir şey bulunamadı + Sen geçmişiniz yok + Oku + Henüz favorileriniz yok + Favoriniz + Yeni kategori + Ekle + Kategori ismi girin + Kaydet + Paylaş + %s Paylaş + Ara + Manga ara + İndiriliyor… + İşleniyor… + İndirildi + İndirilenler + Ad + Güncellenme + Yeniler + Puanlama + Litre + Tema + Açık + Koyu + Takip sistemi + Sayfalar + Temizle + Tüm okuma geçmişi kalıcı olarak silinsin mi\? + Kaldır + “%s” geçmişinden kaldırıldı + “%s” yerel depolama alanından sil + Lütfen bitmesini bekleyin… + Sayfayı kaydet + Resmi paylaş + Popüler + Detaylar + Ayarlar + Kaydet + Tekrar başlat + Bir hata oluştu + Uzak kaynaklar + Uyarı + Geçmiş ve önbellek + Temizlendi + Devam + Müsait değil + Boş kategori + Önbellek + Uygulamanın yeni sürümlerini kontrol edin + Kaldır + Sil + Bölüm %1$d / %2$d + Bir ZIP veya CBZ dosyası seçin. + Okuma modu + Izgara boyutu + Webtoon + B|kB|MB|GB|TB + Okuyucu ayarları + Ses butonları + Bir daha sorma + İptal ediliyor… + Hata + Küçük resim önbelleğini temizle + Yalnızca hareketler + Alan adi + Web tarayıcısında aç + Yeni bölümler + Bildirim ayarları + Bildirim sesi + LED göstergesi + Titreşim + Diğer depolama + Güncellemeler + Kısayol oluştur… + İçe aktar + Mangayı sil + Bilgi işleniyor… + Sıralama düzeni + Açıklama yok + Bu işlem desteklenmiyor + Standart + Sayfa önbelleğini temizle + %s üzerinde ara + Dahili depolama + Bildirimler + Sayfaları değiştir + Bu çok fazla veri aktarabilir + Kaydet + İndir + İndirilenler klasörü + Harici depolama + Baştan oku + Kategoriler… + Uygulamanın yeni bir sürümü mevcut + Yeni bir sürüm mevcutsa bildirimini göster + Favori kategoriler + Bitti + Sonra oku + Sayfa animasyonu + Kullanılabilir depolama alanı yok + Yeniden adlandır + “%s” cihazdan kalıcı olarak silinsin mi\? + Arama geçmişini temizle + Burası biraz boş… + Ekranı döndür + Ölçek modu + Yüksekliğe sığdır + Siyah + Başlangıçta tut + Akışı temizle + Bu eksik bölümü çevrim içi olarak indirin veya okuyun. + Yedekten geri yükle + Güncelle + Oturum aç + Bitti + Hakkında + Bu içeriği görüntülemek için oturum açın + Onayla + Yetkilendirildi + Az önce + Kenar dokunuşları + Bu mangada %s var. Hepsi kaydedilsin mi\? + %1$d / %2$d açık + “%s” kategorisi favorilerinizden kaldırılsın mı\? \nİçindeki tüm mangalar kaybolacak. - Sorguyu yeniden biçimlendirmeyi deneyin. - Okuduklarınız burada görüntülenecek - Yan menüde ne okuyacağınızı bulun. - Önce bir şey kaydedin - Çevrim içi kaynaklardan kaydedin veya dosyaları içe aktarın. - Raf - Son - Boyut: %s - İlgili - Temizlendi - Parola gir - Kotatsu başlatılırken parola sor - Güncellemeleri ara - Güncelleme akışını temizle - Akış güncellemesi yakında başlayacak - Sürüm %s - Güncellemeleri denetle - Güncellemeler denetleniyor… - Güncellemeler aranamadı - Merkeze sığdır - Genişliğe sığdır - AMOLED ekranlarda daha az güç kullanır - Yedekle ve geri yükle - Veri yedeği oluştur - Geri yüklendi - Hazırlanıyor… - Dün - Grup - Sessiz - Çöz - Çerezleri temizle - Öntanımlı: %s - Ters - Parola 4 veya daha fazla karakterden oluşmalıdır - Hoş geldiniz - Sıraya alındı - Etkin indirme yok - Bölüm eksik - Bu uygulamayı çevirin - Çeviri - Yalnızca %s içinde ara - 4PDA\'daki konu - Devam ediyor - Tüm kaynaklardaki oturumunuz kapatılacak - Kullanılan kaynaklar - Kullanılabilir kaynaklar - Uygunsuz mangayı geçmişten hariç tut - Numaralı sayfalar - Duvar kağıdınızın renk düzeninden oluşturulan bir temayı uygular - Manga içe aktarılıyor: %1$d / %2$d - Arama sonuçları - Ağ bekleniyor… - Parolayı tekrarla - Sağdan sola (←) okuyucuyu tercih et - Denetleme - Yanlış parola - GitHub\'da sorun oluştur - Geçmişinizin ve favorilerinizin yedeğini oluşturabilir ve bunları geri yükleyebilirsiniz - Uzun zaman önce - Bugün - Güncelleme yok - Yeni bölümler denetleniyor: %1$d / %2$d - Dinamik tema - Favorilerinizi düzenlemek için kategorileri kullanabilirsiniz. Kategori oluşturmak için «+» düğmesine basın - Tüm favoriler - Okuduklarınızın yeni bölümleri burada gösterilir - Yeni sürüm: %s - Uygulamayı koru - Parolalar eşleşmiyor - Sağdan sola (←) - Yeni kategori - Dosya bulunamadı - Tüm veriler geri yüklendi - Veriler geri yüklendi, ancak hatalar var - Tekrar denemek için dokunun - İleri - Diğer - CAPTCHA gerekli - Tüm çerezler kaldırıldı - Seçilen yapılandırma bu manga için hatırlanacak - Tüm güncelleme geçmişi kalıcı olarak silinsin mi\? - …ve %1$d daha fazlası - Uygulamayı başlatmak için bir parola girin - Tüm son arama sorguları kalıcı olarak kaldırılsın mı\? - Geri bildirim - Yedek kaydedildi - Türler - Tarih biçimi - Öntanımlı - Bir ad girmelisiniz - %s üzerinde oturum açma desteklenmiyor - Daha fazla oku - Bazı aygıtların arka plan görevlerini bozabilecek farklı sistem davranışları vardır. - Ekran görüntüsü politikası - Uygunsuzlarda engelle - Her zaman engelle - İzin ver - Yeni bölümleri denetle - Öneriler - Önerileri etkinleştir - Tercihlerinize göre manga önerileri alın - Tüm veriler aygıt üzerinde yerel olarak işlenir. Kişisel verilerinizin herhangi bir hizmete aktarılması söz konusu değildir - Manga okumaya başladıktan sonra kişiselleştirilmiş öneriler alacaksınız - Uygunsuz manga önerme - Etkin - Devre dışı - Türler listesi yüklenemiyor - Filtreyi sıfırla - Tür bul - Manga okumak istediğiniz dilleri seçin. Daha sonra ayarlardan değiştirebilirsiniz. - Her zaman - Hiçbir zaman - Yalnızca Wi-Fi\'de - Sayfaları önceden yükle - %s olarak oturum açıldı - 18+ - Çeşitli diller - Bölüm bul - Bu mangada bölüm yok - %%%1$s - İçerik - Öneriler güncelleniyor - Görünüm - Türleri hariç tut - Önerilerde görmek istemediğiniz türleri belirtin - Seçilen ögeler aygıttan kalıcı olarak silinsin mi\? - Seçilen tüm mangaları tüm bölümleriyle birlikte indirmek istediğinizden emin misiniz\? Bu işlem çok fazla trafik ve depolama alanı tüketebilir - Kaldırma tamamlandı - Bölümler arka planda kaldırılacaktır. Bu biraz zaman alabilir - Paralel indirmeler - İndirmeyi yavaşlat - IP adresinizin engellenmesinden kaçınmanıza yardımcı olur - Kaydedilen manga işleme - Gizle - Yeni manga kaynakları var - Bildirim almayacaksınız ancak yeni bölümler listelerde vurgulanacak - Bildirimleri etkinleştir - Yeni bölümleri denetle ve bildirim gönder - Okuduğunuz manga güncellemeleri hakkında bildirim alacaksınız - Favori kategori yok - Ad - Düzenle - Kategoriyi düzenle - Yer imi ekle - Yer imini kaldır - Yer imleri - Yer imi kaldırıldı - Yer imi eklendi - Geri al - Geçmişten kaldırıldı - HTTPS üzerinden DNS - Okuyucu modunu otomatik algıla - Manganın webtoon olup olmadığını otomatik olarak algıla - Öntanımlı mod - Pil iyileştirmesini devre dışı bırak - Arka planda güncelleme denetimlerine yardımcı olur - Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin. - Gönder - Tümünü devre dışı bırak - Varsa parmak izi kullan - Favorilerinizden mangalar - Son okuduğunuz mangalar + Sorguyu yeniden biçimlendirmeyi deneyin. + Okuduklarınız burada görüntülenecek + Yan menüde ne okuyacağınızı bulun. + Önce bir şey kaydedin + Çevrim içi kaynaklardan kaydedin veya dosyaları içe aktarın. + Raf + Son + Boyut: %s + İlgili + Temizlendi + Parola gir + Kotatsu başlatılırken parola sor + Güncellemeleri ara + Güncelleme akışını temizle + Akış güncellemesi yakında başlayacak + Sürüm %s + Güncellemeleri denetle + Güncellemeler denetleniyor… + Güncellemeler aranamadı + Merkeze sığdır + Genişliğe sığdır + AMOLED ekranlarda daha az güç kullanır + Yedekle ve geri yükle + Veri yedeği oluştur + Geri yüklendi + Hazırlanıyor… + Dün + Grup + Sessiz + Çöz + Çerezleri temizle + Öntanımlı: %s + Ters + Parola 4 veya daha fazla karakterden oluşmalıdır + Hoş geldiniz + Sıraya alındı + Etkin indirme yok + Bölüm eksik + Bu uygulamayı çevirin + Çeviri + Yalnızca %s içinde ara + 4PDA\'daki konu + Devam ediyor + Tüm kaynaklardaki oturumunuz kapatılacak + Kullanılan kaynaklar + Kullanılabilir kaynaklar + Uygunsuz mangayı geçmişten hariç tut + Numaralı sayfalar + Duvar kağıdınızın renk düzeninden oluşturulan bir temayı uygular + Manga içe aktarılıyor: %1$d / %2$d + Arama sonuçları + Ağ bekleniyor… + Parolayı tekrarla + Denetleme + Yanlış parola + GitHub\'da sorun oluştur + Geçmişinizin ve favorilerinizin yedeğini oluşturabilir ve bunları geri yükleyebilirsiniz + Uzun zaman önce + Bugün + Güncelleme yok + Yeni bölümler denetleniyor: %1$d / %2$d + Dinamik tema + Favorilerinizi düzenlemek için kategorileri kullanabilirsiniz. Kategori oluşturmak için «+» düğmesine basın + Tüm favoriler + Okuduklarınızın yeni bölümleri burada gösterilir + Yeni sürüm: %s + Uygulamayı koru + Parolalar eşleşmiyor + Sağdan sola (←) + Yeni kategori + Dosya bulunamadı + Tüm veriler geri yüklendi + Veriler geri yüklendi, ancak hatalar var + Tekrar denemek için dokunun + İleri + Diğer + CAPTCHA gerekli + Tüm çerezler kaldırıldı + Seçilen yapılandırma bu manga için hatırlanacak + Tüm güncelleme geçmişi kalıcı olarak silinsin mi\? + …ve %1$d daha fazlası + Uygulamayı başlatmak için bir parola girin + Tüm son arama sorguları kalıcı olarak kaldırılsın mı\? + Geri bildirim + Yedek kaydedildi + Türler + Tarih biçimi + Öntanımlı + Bir ad girmelisiniz + %s üzerinde oturum açma desteklenmiyor + Daha fazla oku + Bazı aygıtların arka plan görevlerini bozabilecek farklı sistem davranışları vardır. + Ekran görüntüsü politikası + Uygunsuzlarda engelle + Her zaman engelle + İzin ver + Yeni bölümleri denetle + Öneriler + Önerileri etkinleştir + Tercihlerinize göre manga önerileri alın + Tüm veriler aygıt üzerinde yerel olarak işlenir. Kişisel verilerinizin herhangi bir hizmete aktarılması söz konusu değildir + Manga okumaya başladıktan sonra kişiselleştirilmiş öneriler alacaksınız + Uygunsuz manga önerme + Etkin + Devre dışı + Türler listesi yüklenemiyor + Filtreyi sıfırla + Tür bul + Manga okumak istediğiniz dilleri seçin. Daha sonra ayarlardan değiştirebilirsiniz. + Her zaman + Hiçbir zaman + Yalnızca Wi-Fi\'de + Sayfaları önceden yükle + %s olarak oturum açıldı + 18+ + Çeşitli diller + Bölüm bul + Bu mangada bölüm yok + %%%1$s + İçerik + Öneriler güncelleniyor + Görünüm + Türleri hariç tut + Önerilerde görmek istemediğiniz türleri belirtin + Seçilen ögeler aygıttan kalıcı olarak silinsin mi\? + Seçilen tüm mangaları tüm bölümleriyle birlikte indirmek istediğinizden emin misiniz\? Bu işlem çok fazla trafik ve depolama alanı tüketebilir + Kaldırma tamamlandı + Bölümler arka planda kaldırılacaktır. Bu biraz zaman alabilir + Paralel indirmeler + İndirmeyi yavaşlat + IP adresinizin engellenmesinden kaçınmanıza yardımcı olur + Kaydedilen manga işleme + Gizle + Yeni manga kaynakları var + Bildirim almayacaksınız ancak yeni bölümler listelerde vurgulanacak + Bildirimleri etkinleştir + Yeni bölümleri denetle ve bildirim gönder + Okuduğunuz manga güncellemeleri hakkında bildirim alacaksınız + Favori kategori yok + Ad + Düzenle + Kategoriyi düzenle + Yer imi ekle + Yer imini kaldır + Yer imleri + Yer imi kaldırıldı + Yer imi eklendi + Geri al + Geçmişten kaldırıldı + HTTPS üzerinden DNS + Okuyucu modunu otomatik algıla + Manganın webtoon olup olmadığını otomatik olarak algıla + Öntanımlı mod + Pil iyileştirmesini devre dışı bırak + Arka planda güncelleme denetimlerine yardımcı olur + Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin. + Gönder + Tümünü devre dışı bırak + Varsa parmak izi kullan + Favorilerinizden mangalar + Son okuduğunuz mangalar \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 827258f89..2e3e1ceb2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,302 +1,305 @@ - Дочекайтеся завершення завантаження… - Видалити - Нічого не знайдено - Додати до улюблених - Очистити історію - Історії ще немає - Додати - Зберегти - Локальне сховище - Не вдалося підключитися до Інтернету - Деталі - Спробуйте ще раз - Відкрити меню - Улюблених ще немає - Нова категорія - Введіть назву категорії - Завантажено - Уподобання - Історія - Сталася помилка - Розділи - Список - Детальний список - Режим списку - Налаштування - Віддалені джерела - Завантаження… - Обчислення… - Розділ %1$d із %2$d - Закрити - Читати - Таблиця - Поділитися - Створити ярлик… - Поділитися %s - Пошук - Пошук манґи - Обробка… - Ім\'я - Популярна - Оновлена - Нова - Рейтинг - Порядок сортування - Фільтр - Тема - Світла - Темна - Сторінки - Очистити всю історію читання перманентно\? - Видалити - \"%s\" видалено з історії - \"%s\" видалено з локального сховища - Зберегти сторінку - Збережено - Поділитись зображенням - Ця операція не підтримується - Виберіть файл ZIP або CBZ. - Немає опису - Історія та кеш - Очистити кеш сторінок - Кеш - Б|кБ|МБ|ГБ|ТБ - Стандартний - Вебтун - Режим читання - Розмір сітки - Пошук по %s - Видалити манґу - Видалити \"%s\" з пристрою перманентно\? - Налаштування читача - Перегортання сторінок - Кнопки гучності - Скасування… - Помилка - Очистити кеш мініатюр - Очистити історію пошуку - Очищено - Тільки жести - Внутрішнє сховище - Зовнішнє сховище - Домен - Перевірити наявність нових версій додатка - Доступна нова версія додатка - Ця манґа має %s. Зберегти все це\? - Зберегти - Сповіщення - Увімкнено %1$d з %2$d - Нові розділи - Завантажити - Читати з початку - Перезавантажити - Вібрація - Улюблені категорії - Вилучити категорію \"%s\" зі своїх уподобань\? + Дочекайтеся завершення завантаження… + Видалити + Нічого не знайдено + Додати до улюблених + Очистити історію + Історії ще немає + Додати + Зберегти + Локальне сховище + Не вдалося підключитися до Інтернету + Деталі + Спробуйте ще раз + Відкрити меню + Улюблених ще немає + Нова категорія + Введіть назву категорії + Завантажено + Уподобання + Історія + Сталася помилка + Розділи + Список + Детальний список + Режим списку + Налаштування + Віддалені джерела + Завантаження… + Обчислення… + Розділ %1$d із %2$d + Закрити + Читати + Таблиця + Поділитися + Створити ярлик… + Поділитися %s + Пошук + Пошук манґи + Обробка… + Ім\'я + Популярна + Оновлена + Нова + Рейтинг + Порядок сортування + Фільтр + Тема + Світла + Темна + Сторінки + Очистити всю історію читання перманентно\? + Видалити + \"%s\" видалено з історії + \"%s\" видалено з локального сховища + Зберегти сторінку + Збережено + Поділитись зображенням + Ця операція не підтримується + Виберіть файл ZIP або CBZ. + Немає опису + Історія та кеш + Очистити кеш сторінок + Кеш + Б|кБ|МБ|ГБ|ТБ + Стандартний + Вебтун + Режим читання + Розмір сітки + Пошук по %s + Видалити манґу + Видалити \"%s\" з пристрою перманентно\? + Налаштування читача + Перегортання сторінок + Кнопки гучності + Скасування… + Помилка + Очистити кеш мініатюр + Очистити історію пошуку + Очищено + Тільки жести + Внутрішнє сховище + Зовнішнє сховище + Домен + Перевірити наявність нових версій додатка + Доступна нова версія додатка + Ця манґа має %s. Зберегти все це\? + Зберегти + Сповіщення + Увімкнено %1$d з %2$d + Нові розділи + Завантажити + Читати з початку + Перезавантажити + Вібрація + Улюблені категорії + Вилучити категорію \"%s\" зі своїх уподобань\? \nВся манґа в ній буде втрачена. - Видалити - Тут якось пусто… - Спробуйте переформулювати запит. - Те, що ви читаєте, буде показано тут - Знайдіть, що читати, у бічному меню. - Спочатку збережіть щось - Збережіть його з онлайн-джерела або імпортуйте файли. - Полиця - Недавні - Анімація перегортання - Тека для завантажень - Інше сховище - Готово - Усі улюблені - Порожня категорія - Прочитати пізніше - Оновлення - Схожі - Нова версія: %s - Розмір: %s - Очікування мережі… - Очистити стрічку оновлень - Очищено - Повернути екран - Оновити - Оновлення скоро почнеться - Стежити за оновленнями - Не перевіряти - Неправильний пароль - Захистити додаток - Запитувати пароль під час запуску Kotatsu - Повторіть пароль - Паролі не співпадають - Про програму - Версія %s - Перевірити наявність оновлень - Перевірка наявності оновлень… - Не вдалося перевірити оновлення - Немає доступних оновлень - Нова категорія - Режим масштабування - Вмістити в екран - Підігнати по висоті - Підігнати по ширині - Вихідний розмір - Чорна - Споживає менше енергії на екранах AMOLED - Резервне копіювання та відновлення - Відновлено - Підготовка… - Створити проблему на GitHub - Файл не знайдено - Дані відновлено, але є деякі помилки - Ви можете створити резервну копію своєї історії та уподобань і відновити їх - Тільки що - Торкніться, щоб спробувати ще раз - Обраний режим буде запам\'ятован для цієї манги - Потрібна CAPTCHA - Пройти - Очистити кукі - Всі кукі були видалені - Очистити стрічку - Перевірити нові розділи - В зворотньому порядку - Увійти - Увійдіть, щоб переглянути цей вміст - За замовчуванням: %s - …і ще %1$d - Далі - Введіть пароль для запуску програми - Підтвердити - Пароль має містити 4 символи або більше - Пошук лише на %s - Ласкаво просимо - Резервна копія збережена - Докладніше - У черзі - Немає активних завантажень - Допомогти з перекладом програми - Переклад - Тема на 4PDA - Авторизація виконана - Вхід на %s не підтримується - Ви вийдете з усіх джерел - Завершена - Триває - Формат дати - Виключити NSFW манґу з історії - Ви повинні ввести ім’я - Показувати номери сторінок - Включені джерела - Застосовує тему програми, засновану на палітрі кольорів шпалер на пристрої - Імпорт манґи: %1$d з %2$d - Політика щодо знімків екрана - Дозволити - Пропонувати манґу на основі ваших уподобань - Усі дані аналізуються локально на цьому пристрої. Передача ваших персональних даних у будь-які сервіси не здійснюється - Почніть читати манґу, і ви отримаєте персоналізовані пропозиції - Увімкнено - Вимкнено - Скинути фільтр - Знайти жанр - Виберіть мови, якими ви хочете читати манґу. Це можливо змінити пізніше в налаштуваннях. - Тільки по Wi-Fi - Попереднє завантаження сторінок - Ви увійшли як %s - 18+ - Різні мови - Знайти розділ - Немає розділів у цій манзі - %1$s%% - Зміст - Оновлення пропозицій - Видалити вибрані елементи з пристрою назавжди\? - Видалення завершено - Ви впевнені, що хочете завантажити всю вибрану манґу з усіма її розділами\? Це може споживати багато трафіку та пам’яті - Завантажувати паралельно - Сповільнення завантаження - Обробка збереженої манґи - Приховати - Доступні нові джерела манґи - Закрити меню - Завантаження… - Очистити - Завантаження - Як в системі - Завантажте або прочитайте цей відсутній розділ онлайн. - Розділ відсутній - Зворотній зв\'язок - Жанри - За замовчуванням - Завжди - Продовжити - Імпорт - Натискання по краях - Попередження - Це може призвести до витрати великої кількості трафіку - Більше не питати - Налаштування сповіщень - Перейменувати - Показувати сповіщення, якщо доступна нова версія - Відкрити у веб-браузері - Недоступно - Немає доступного сховища - Нові розділи того, що ви читаєте, показано тут - Результати пошуку - Введіть пароль - Звук сповіщень - Світлодіодний індикатор - Категорії… - Ви можете використовувати категорії для впорядкування своїх уподобань. Натисніть «+», щоб створити категорію - Учора - Справа наліво (←) - Створити резервну копію - Відновити з резервної копії - Всі дані були відновлені - Групувати - Сьогодні - Без звуку - Давно - Перевірка наявності нових розділів: %1$d з %2$d - Очистити всю історію оновлень назавжди\? - Деякі пристрої мають різну поведінку системи, що може порушити фонові завдання. - Видалити всі останні пошукові запити назавжди\? - Інше - Доступні джерела - Динамічна тема - Блок на NSFW - Завжди блокувати - Пропозиції - Увімкнути пропозиції - Не пропонувати NSFW манґу - Не вдалося завантажити список жанрів - Ніколи - Зовнішній вигляд - Виключити жанри - Укажіть жанри, які ви не хочете бачити в пропозиціях - Допомагає уникнути блокування вашої IP-адреси - Розділи будуть видалені у фоновому режимі. Це може зайняти деякий час - Перевіряти наявність нових розділів і повідомляти про них - Ви будете отримувати повідомлення про оновлення манґи, яку ви читаєте - Увімкнути сповіщення - Ви не будете отримувати повідомлення, але нові розділи будуть відображатися у списку - Немає улюблених категорій - Назва - Змінити - Змінити категорію - Додати закладку - Видалити закладку - Закладки - Закладка видалена - Додано закладку - Скасувати - Видалено з історії - DNS через HTTPS - Типовий режим - Автоматично визначати, чи є манга вебтуном - Автовизначення режиму читання - Вимкнути оптимізацію акумулятора - Допомагає з перевірками фонових оновлень - Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити. - Надіслати - Вимкнути все + Видалити + Тут якось пусто… + Спробуйте переформулювати запит. + Те, що ви читаєте, буде показано тут + Знайдіть, що читати, у бічному меню. + Спочатку збережіть щось + Збережіть його з онлайн-джерела або імпортуйте файли. + Полиця + Недавні + Анімація перегортання + Тека для завантажень + Інше сховище + Готово + Усі улюблені + Порожня категорія + Прочитати пізніше + Оновлення + Схожі + Нова версія: %s + Розмір: %s + Очікування мережі… + Очистити стрічку оновлень + Очищено + Повернути екран + Оновити + Оновлення скоро почнеться + Стежити за оновленнями + Не перевіряти + Неправильний пароль + Захистити додаток + Запитувати пароль під час запуску Kotatsu + Повторіть пароль + Паролі не співпадають + Про програму + Версія %s + Перевірити наявність оновлень + Перевірка наявності оновлень… + Не вдалося перевірити оновлення + Немає доступних оновлень + Нова категорія + Режим масштабування + Вмістити в екран + Підігнати по висоті + Підігнати по ширині + Вихідний розмір + Чорна + Споживає менше енергії на екранах AMOLED + Резервне копіювання та відновлення + Відновлено + Підготовка… + Створити проблему на GitHub + Файл не знайдено + Дані відновлено, але є деякі помилки + Ви можете створити резервну копію своєї історії та уподобань і відновити їх + Тільки що + Торкніться, щоб спробувати ще раз + Обраний режим буде запам\'ятован для цієї манги + Потрібна CAPTCHA + Пройти + Очистити кукі + Всі кукі були видалені + Очистити стрічку + Перевірити нові розділи + В зворотньому порядку + Увійти + Увійдіть, щоб переглянути цей вміст + За замовчуванням: %s + …і ще %1$d + Далі + Введіть пароль для запуску програми + Підтвердити + Пароль має містити 4 символи або більше + Пошук лише на %s + Ласкаво просимо + Резервна копія збережена + Докладніше + У черзі + Немає активних завантажень + Допомогти з перекладом програми + Переклад + Тема на 4PDA + Авторизація виконана + Вхід на %s не підтримується + Ви вийдете з усіх джерел + Завершена + Триває + Формат дати + Виключити NSFW манґу з історії + Ви повинні ввести ім’я + Показувати номери сторінок + Включені джерела + Застосовує тему програми, засновану на палітрі кольорів шпалер на пристрої + Імпорт манґи: %1$d з %2$d + Політика щодо знімків екрана + Дозволити + Пропонувати манґу на основі ваших уподобань + Усі дані аналізуються локально на цьому пристрої. Передача ваших персональних даних у будь-які сервіси не здійснюється + Почніть читати манґу, і ви отримаєте персоналізовані пропозиції + Увімкнено + Вимкнено + Скинути фільтр + Знайти жанр + Виберіть мови, якими ви хочете читати манґу. Це можливо змінити пізніше в налаштуваннях. + Тільки по Wi-Fi + Попереднє завантаження сторінок + Ви увійшли як %s + 18+ + Різні мови + Знайти розділ + Немає розділів у цій манзі + %1$s%% + Зміст + Оновлення пропозицій + Видалити вибрані елементи з пристрою назавжди\? + Видалення завершено + Ви впевнені, що хочете завантажити всю вибрану манґу з усіма її розділами\? Це може споживати багато трафіку та пам’яті + Завантажувати паралельно + Сповільнення завантаження + Обробка збереженої манґи + Приховати + Доступні нові джерела манґи + Закрити меню + Завантаження… + Очистити + Завантаження + Як в системі + Завантажте або прочитайте цей відсутній розділ онлайн. + Розділ відсутній + Зворотній зв\'язок + Жанри + За замовчуванням + Завжди + Продовжити + Імпорт + Натискання по краях + Попередження + Це може призвести до витрати великої кількості трафіку + Більше не питати + Налаштування сповіщень + Перейменувати + Показувати сповіщення, якщо доступна нова версія + Відкрити у веб-браузері + Недоступно + Немає доступного сховища + Нові розділи того, що ви читаєте, показано тут + Результати пошуку + Введіть пароль + Звук сповіщень + Світлодіодний індикатор + Категорії… + Ви можете використовувати категорії для впорядкування своїх уподобань. Натисніть «+», щоб створити категорію + Учора + Справа наліво (←) + Створити резервну копію + Відновити з резервної копії + Всі дані були відновлені + Групувати + Сьогодні + Без звуку + Давно + Перевірка наявності нових розділів: %1$d з %2$d + Очистити всю історію оновлень назавжди\? + Деякі пристрої мають різну поведінку системи, що може порушити фонові завдання. + Видалити всі останні пошукові запити назавжди\? + Інше + Доступні джерела + Динамічна тема + Блок на NSFW + Завжди блокувати + Пропозиції + Увімкнути пропозиції + Не пропонувати NSFW манґу + Не вдалося завантажити список жанрів + Ніколи + Зовнішній вигляд + Виключити жанри + Укажіть жанри, які ви не хочете бачити в пропозиціях + Допомагає уникнути блокування вашої IP-адреси + Розділи будуть видалені у фоновому режимі. Це може зайняти деякий час + Перевіряти наявність нових розділів і повідомляти про них + Ви будете отримувати повідомлення про оновлення манґи, яку ви читаєте + Увімкнути сповіщення + Ви не будете отримувати повідомлення, але нові розділи будуть відображатися у списку + Немає улюблених категорій + Назва + Змінити + Змінити категорію + Додати закладку + Видалити закладку + Закладки + Закладка видалена + Додано закладку + Відмінити + Видалено з історії + DNS через HTTPS + Режим за замовчуванням + Автоматично визначати, чи є манга вебтуном + Автовизначення режиму читання + Вимкнути оптимізацію акумулятора + Допомагає з перевірками фонових оновлень + Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити. + Надіслати + Вимкнути все + Використовувати відбиток пальця, якщо доступно + Манга з Вашого улюбленого + Манга, яку Ви нещодавно читали \ No newline at end of file From d69b0918584de2c96d39375fd2b053753d236f77 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 29 Jun 2022 10:00:09 +0200 Subject: [PATCH 15/23] Translated using Weblate (Russian) Currently translated at 99.6% (303 of 304 strings) Co-authored-by: Koitharu Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ Translation: Kotatsu/Strings --- app/src/main/res/values-ru/strings.xml | 600 ++++++++++++------------- 1 file changed, 300 insertions(+), 300 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 70d3f0e07..85bfaa9c6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,304 +1,304 @@ - Закрыть меню - Открыть меню - На устройстве - Избранное - История - Произошла ошибка - Не удалось подключиться к интернету - Подробности - Главы - Список - Подробный список - Таблица - Вид списка - Настройки - Онлайн каталоги - Загрузка… - Глава %1$d из %2$d - Закрыть - Повторить - Очистить историю - Ничего не найдено - Истории пока нет - Читать - Избранного пока нет - В избранное - Новая категория - Добавить - Введите название - Сохранить - Поделиться - Создать ярлык… - Поделиться %s - Поиск - Поиск манги - Загрузка… - Обработка… - Загружено - Загрузки - Имя - Популярная - Обновлённая - Новая - Рейтинг - Порядок сортировки - Фильтр - Тема - Светлая - Тёмная - Как в системе - Страницы - Очистить - Очистить всю историю чтения полностью\? - Удалить - «%s» удалено из истории - «%s» удалено с устройства - Дождитесь завершения загрузки… - Сохранить страницу - Сохранено - Поделиться изображением - Импорт - Удалить - Операция не поддерживается - Выберите CBZ-файл или ZIP - Нет описания - История и кэш - Очистить кэш страниц - Кэш - Б|кБ|МБ|ГБ|ТБ - Стандартный - Манхва - Режим чтения - Размер таблицы - Поиск по %s - Удалить мангу - Удалить \"%s\" с устройства навсегда\? - Настройки чтения - Листание страниц - Нажатия по краям - Кнопки громкости - Продолжить - Предупреждение - Это может привести к расходу большого количества трафика - Больше не спрашивать - Отмена… - Ошибка - Очистить кэш миниатюр - Очистить историю поиска - Очищено - Только жесты - Внутренний накопитель - Внешнее хранилище - Домен - Проверять наличие новых версий приложения - Доступна новая версия приложения - Показывать уведомление, если доступна новая версия - Открыть в веб-браузере - В этой манге %s. Сохранить их все\? - Сохранить - Уведомления - Включено %1$d из %2$d - Новые главы - Загрузить - Читать с начала - Перезапустить - Настройки уведомлений - Звук уведомления - Светодиодная индикация - Вибросигнал - Категории избранного - Категории… - Переименовать - Удалить категорию \"%s\" из избранного\? + Закрыть меню + Открыть меню + На устройстве + Избранное + История + Произошла ошибка + Не удалось подключиться к интернету + Подробности + Главы + Список + Подробный список + Таблица + Вид списка + Настройки + Онлайн каталоги + Загрузка… + Глава %1$d из %2$d + Закрыть + Повторить + Очистить историю + Ничего не найдено + Истории пока нет + Читать + Избранного пока нет + В избранное + Новая категория + Добавить + Введите название + Сохранить + Поделиться + Создать ярлык… + Поделиться %s + Поиск + Поиск манги + Загрузка… + Обработка… + Загружено + Загрузки + Имя + Популярная + Обновлённая + Новая + Рейтинг + Порядок сортировки + Фильтр + Тема + Светлая + Тёмная + Как в системе + Страницы + Очистить + Очистить всю историю чтения полностью\? + Удалить + «%s» удалено из истории + «%s» удалено с устройства + Дождитесь завершения загрузки… + Сохранить страницу + Сохранено + Поделиться изображением + Импорт + Удалить + Операция не поддерживается + Выберите CBZ-файл или ZIP + Нет описания + История и кэш + Очистить кэш страниц + Кэш + Б|кБ|МБ|ГБ|ТБ + Стандартный + Манхва + Режим чтения + Размер таблицы + Поиск по %s + Удалить мангу + Удалить \"%s\" с устройства навсегда\? + Настройки чтения + Листание страниц + Нажатия по краям + Кнопки громкости + Продолжить + Предупреждение + Это может привести к расходу большого количества трафика + Больше не спрашивать + Отмена… + Ошибка + Очистить кэш миниатюр + Очистить историю поиска + Очищено + Только жесты + Внутренний накопитель + Внешнее хранилище + Домен + Проверять наличие новых версий приложения + Доступна новая версия приложения + Показывать уведомление, если доступна новая версия + Открыть в веб-браузере + В этой манге %s. Сохранить их все\? + Сохранить + Уведомления + Включено %1$d из %2$d + Новые главы + Загрузить + Читать с начала + Перезапустить + Настройки уведомлений + Звук уведомления + Светодиодная индикация + Вибросигнал + Категории избранного + Категории… + Переименовать + Удалить категорию \"%s\" из избранного\? \nВся манга в ней будет потеряна. - Удалить - Как-то здесь пусто… - Попробуйте переформулировать запрос. - Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию - То, что вы прочитаете, будет отображено здесь - Найдите, что почитать, в боковом меню. - Сохраните что-нибудь - Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. - Полка - Недавнее - Анимация листания - Папка для загрузок - Недоступно - Нет доступного хранилища - Другое хранилище - Готово - Всё избранное - Категория пуста - Прочитать позже - Обновления - Новые главы из того, что вы читаете, будут показаны здесь - Результаты поиска - Похожие - Новая версия: %s - Размер: %s - Ожидание подключения… - Очистить ленту обновлений - Очищено - Повернуть экран - Обновить - Обновление скоро начнётся - Следить за обновлениями - Не проверять - Введите пароль - Неверный пароль - Защитить приложение - Запрашивать пароль при запуске Kotatsu - Повторите пароль - Пароли не совпадают - О программе - Версия %s - Проверить обновления - Проверка обновления… - Не удалось проверить обновления - Нет доступных обновлений - Справа налево (←) - Создать категорию - Масштабирование - Вписать в экран - Подогнать по высоте - Подогнать по ширине - Исходный размер - Чёрная - Потребляет меньше энергии на экранах AMOLED - Резервное копирование и восстановление - Создать резервную копию - Восстановить данные - Восстановлено - Подготовка… - Файл не найден - Все данные были восстановлены - Данные были восстановлены, но возникли некоторые ошибки - Вы можете создать резервную копию избранного и истории и потом восстановить их - Только что - Вчера - Давно - Группировать - Сегодня - Попробовать ещё раз - Выбранный режим будет сохранён для текущей манги - Без звука - Необходимо пройти CAPTCHA - Пройти - Очистить куки - Все файлы cookie были удалены - Проверка новых глав: %1$d из %2$d - Очистить ленту - Удалить всю историю обновлений навсегда\? - Проверка новых глав - В обратном порядке - Войти - Авторизуйтесь, чтобы просмотреть этот контент - По умолчанию: %s - …и ещё %1$d - Далее - Введите пароль для запуска приложения - Подтвердить - Пароль должен состоять из 4 символов или более - Поиск только по %s - Другие - Добро пожаловать - Удалить все последние поисковые запросы навсегда\? - Резервная копия сохранена - Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. - Подробнее - В очереди - Нет активных загрузок - Глава отсутствует - Скачайте или прочитайте эту недостающую главу онлайн. - Помочь с переводом приложения - Перевод - Тема на 4PDA - Обратная связь - Авторизация выполнена - Вход в %s не поддерживается - Вы выйдете из всех источников - Жанры - Завершено - Онгоинг - Формат даты - По умолчанию - Исключить NSFW мангу из истории - Вы должны ввести имя - Показывать номера страницы - Включенные источники - Доступные источники - Динамическая тема - Применяет тему приложения, основанную на цветовой палитре обоев на устройстве - Политика скриншотов - Разрешить - Запретить для NSFW - Всегда блокировать - Рекомендации - Включить рекомендации - Предлагать мангу на основе Ваших предпочтений - Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы - Начните читать мангу, чтобы получать персональные предложения - Не предлагать NSFW мангу - Включено - Выключено - Не удалось загрузить список жанров - Вычисление… - Создать проблему на GitHub - Импорт манги: %1$d из %2$d - Сбросить фильтр - Поиск по жанрам - Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках. - Никогда - Только по Wi-Fi - Всегда - Предварительная загрузка страниц - Вы авторизованы как %s - 18+ - Разные языки - Найти главу - В этой манге нет глав - Оформление - Контент - Обновление рекомендаций - Исключить жанры - Укажите жанры, которые Вы не хотите видеть в рекомендациях - Удалить выбранную мангу с накопителя? - Удаление завершено - Загрузить выбранную мангу со всеми главами? Это может привести к большому расходу трафика и места на накопителе - Загружать параллельно - Замедление загрузки - Помогает избежать блокировки IP-адреса - Обработка сохранённой манги - Главы будут удалены в фоновом режиме. Это может занять какое-то время - Скрыть - Доступны новые источники манги - Проверять новые главы и уведомлять о них - Вы будете получать уведомления об обновлении манги, которую Вы читаете - Вы не будете получать уведомления, но новые главы будут отображаться в списке - Включить уведомления - Название - Изменить - Изменить категорию - Нет категорий избранного - Добавить закладку - Удалить закладку - Закладки - Закладка удалена - Закладка добавлена - Отменить - Удалено из истории - DNS через HTTPS - Режим по умолчанию - Автоопределение режима чтения - Автоматически определяет, является ли манга веб-комиксом - Отключить оптимизацию энергопотребления - Помогает с фоновой проверкой обновлений - Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить - Отправить - Отключить все - Использовать отпечаток пальца, если доступно - Манга из Вашего избранного - Манга, которую Вы недавно читали + Удалить + Как-то здесь пусто… + Попробуйте переформулировать запрос. + Вы можете использовать категории для организации своих избранных. Нажмите «+», чтобы создать категорию + То, что вы прочитаете, будет отображено здесь + Найдите, что почитать, в боковом меню. + Сохраните что-нибудь + Сохраните что-нибудь из онлайн-каталога или импортируйте из файла. + Полка + Недавнее + Анимация листания + Папка для загрузок + Недоступно + Нет доступного хранилища + Другое хранилище + Готово + Всё избранное + Категория пуста + Прочитать позже + Обновления + Новые главы из того, что вы читаете, будут показаны здесь + Результаты поиска + Похожие + Новая версия: %s + Размер: %s + Ожидание подключения… + Очистить ленту обновлений + Очищено + Повернуть экран + Обновить + Обновление скоро начнётся + Следить за обновлениями + Не проверять + Введите пароль + Неверный пароль + Защитить приложение + Запрашивать пароль при запуске Kotatsu + Повторите пароль + Пароли не совпадают + О программе + Версия %s + Проверить обновления + Проверка обновления… + Не удалось проверить обновления + Нет доступных обновлений + Справа налево (←) + Создать категорию + Масштабирование + Вписать в экран + Подогнать по высоте + Подогнать по ширине + Исходный размер + Чёрная + Потребляет меньше энергии на экранах AMOLED + Резервное копирование и восстановление + Создать резервную копию + Восстановить данные + Восстановлено + Подготовка… + Файл не найден + Все данные были восстановлены + Данные были восстановлены, но возникли некоторые ошибки + Вы можете создать резервную копию избранного и истории и потом восстановить их + Только что + Вчера + Давно + Группировать + Сегодня + Попробовать ещё раз + Выбранный режим будет сохранён для текущей манги + Без звука + Необходимо пройти CAPTCHA + Пройти + Очистить куки + Все файлы cookie были удалены + Проверка новых глав: %1$d из %2$d + Очистить ленту + Удалить всю историю обновлений навсегда\? + Проверка новых глав + В обратном порядке + Войти + Авторизуйтесь, чтобы просмотреть этот контент + По умолчанию: %s + …и ещё %1$d + Далее + Введите пароль для запуска приложения + Подтвердить + Пароль должен состоять из 4 символов или более + Поиск только по %s + Другие + Добро пожаловать + Удалить все последние поисковые запросы навсегда\? + Резервная копия сохранена + Некоторые устройства имеют различное поведение системы, что может привести к нарушению фоновых задач. + Подробнее + В очереди + Нет активных загрузок + Глава отсутствует + Скачайте или прочитайте эту недостающую главу онлайн. + Помочь с переводом приложения + Перевод + Тема на 4PDA + Обратная связь + Авторизация выполнена + Вход в %s не поддерживается + Вы выйдете из всех источников + Жанры + Завершено + Онгоинг + Формат даты + По умолчанию + Исключить NSFW мангу из истории + Вы должны ввести имя + Показывать номера страницы + Включенные источники + Доступные источники + Динамическая тема + Применяет тему приложения, основанную на цветовой палитре обоев на устройстве + Политика скриншотов + Разрешить + Запретить для NSFW + Всегда блокировать + Рекомендации + Включить рекомендации + Предлагать мангу на основе Ваших предпочтений + Все данные анализируются локально на устройстве. Ваши персональные данные не передаются в какие-либо сервисы + Начните читать мангу, чтобы получать персональные предложения + Не предлагать NSFW мангу + Включено + Выключено + Не удалось загрузить список жанров + Вычисление… + Создать проблему на GitHub + Импорт манги: %1$d из %2$d + Сбросить фильтр + Поиск по жанрам + Выберите языки, на которых Вы хоите читать мангу. Это можно будет изменить позже в настройках. + Никогда + Только по Wi-Fi + Всегда + Предварительная загрузка страниц + Вы авторизованы как %s + 18+ + Разные языки + Найти главу + В этой манге нет глав + Оформление + Контент + Обновление рекомендаций + Исключить жанры + Укажите жанры, которые Вы не хотите видеть в рекомендациях + Удалить выбранную мангу с накопителя? + Удаление завершено + Загрузить выбранную мангу со всеми главами? Это может привести к большому расходу трафика и места на накопителе + Загружать параллельно + Замедление загрузки + Помогает избежать блокировки IP-адреса + Обработка сохранённой манги + Главы будут удалены в фоновом режиме. Это может занять какое-то время + Скрыть + Доступны новые источники манги + Проверять новые главы и уведомлять о них + Вы будете получать уведомления об обновлении манги, которую Вы читаете + Вы не будете получать уведомления, но новые главы будут отображаться в списке + Включить уведомления + Название + Изменить + Изменить категорию + Нет категорий избранного + Добавить закладку + Удалить закладку + Закладки + Закладка удалена + Закладка добавлена + Отменить + Удалено из истории + DNS через HTTPS + Режим по умолчанию + Автоопределение режима чтения + Автоматически определяет, является ли манга веб-комиксом + Отключить оптимизацию батареи + Помогает с фоновой проверкой обновлений + Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить + Отправить + Отключить все + Использовать отпечаток пальца, если доступно + Манга из Вашего избранного + Манга, которую Вы недавно читали \ No newline at end of file From 0106afc93c09bff428f392cc863f4af4561316c1 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 29 Jun 2022 11:38:33 +0300 Subject: [PATCH 16/23] Fix warnings --- README.md | 2 +- .../kotatsu/base/ui/BasePreferenceFragment.kt | 2 -- .../kotatsu/core/backup/BackupZipOutput.kt | 4 +-- .../CloudFlareProtectedException.kt | 2 -- .../kotatsu/core/prefs/AppSettings.kt | 3 -- .../kotatsu/list/ui/MangaListFragment.kt | 1 - .../kotatsu/reader/ui/pager/BasePageHolder.kt | 1 + .../reader/ui/pager/BaseReaderAdapter.kt | 3 +- .../kotatsu/search/ui/SearchActivity.kt | 1 - .../kotatsu/settings/SettingsActivity.kt | 1 - .../settings/utils/RingtonePickContract.kt | 2 +- .../domain/SuggestionRepository.kt | 10 +++--- .../kotatsu/utils/ScreenOrientationHelper.kt | 2 +- .../koitharu/kotatsu/utils/ext/InsetsExt.kt | 20 ------------ .../koitharu/kotatsu/utils/ext/LiveDataExt.kt | 5 ++- .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 2 -- .../res/color-v23/selector_switch_thumb.xml | 7 ----- .../res/color-v23/selector_switch_track.xml | 7 ----- .../main/res/color/selector_switch_thumb.xml | 7 ----- .../main/res/color/selector_switch_track.xml | 7 ----- app/src/main/res/drawable/badge.xml | 7 ----- app/src/main/res/drawable/ic_list_add.xml | 12 ------- app/src/main/res/drawable/ic_pause.xml | 12 ------- app/src/main/res/drawable/ic_resume.xml | 12 ------- app/src/main/res/drawable/switch_thumb.xml | 16 ---------- app/src/main/res/drawable/switch_track.xml | 13 -------- app/src/main/res/layout/dialog_input.xml | 31 ------------------- .../res/layout/item_category_checkable.xml | 15 --------- app/src/main/res/menu/opt_crash.xml | 12 ------- app/src/main/res/menu/opt_downloads.xml | 18 ----------- app/src/main/res/values/bools.xml | 2 +- .../main/res/xml/network_security_config.xml | 5 +-- metadata/ru/full_description.txt | 2 +- 33 files changed, 20 insertions(+), 226 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt delete mode 100644 app/src/main/res/color-v23/selector_switch_thumb.xml delete mode 100644 app/src/main/res/color-v23/selector_switch_track.xml delete mode 100644 app/src/main/res/color/selector_switch_thumb.xml delete mode 100644 app/src/main/res/color/selector_switch_track.xml delete mode 100644 app/src/main/res/drawable/badge.xml delete mode 100644 app/src/main/res/drawable/ic_list_add.xml delete mode 100644 app/src/main/res/drawable/ic_pause.xml delete mode 100644 app/src/main/res/drawable/ic_resume.xml delete mode 100644 app/src/main/res/drawable/switch_thumb.xml delete mode 100644 app/src/main/res/drawable/switch_track.xml delete mode 100644 app/src/main/res/layout/dialog_input.xml delete mode 100644 app/src/main/res/layout/item_category_checkable.xml delete mode 100644 app/src/main/res/menu/opt_crash.xml delete mode 100644 app/src/main/res/menu/opt_downloads.xml diff --git a/README.md b/README.md index 6714250e3..1d693109e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Kotatsu is a free and open source manga reader for Android. alt="Get it on F-Droid" height="80">](https://f-droid.org/packages/org.koitharu.kotatsu) -Download APK from Github Releases: +Download APK from GitHub Releases: - [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt index 2125d044c..7db0f6e22 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BasePreferenceFragment.kt @@ -6,14 +6,12 @@ import androidx.annotation.CallSuper import androidx.annotation.StringRes import androidx.core.graphics.Insets import androidx.core.view.updatePadding -import androidx.fragment.app.Fragment import androidx.preference.PreferenceFragmentCompat import androidx.recyclerview.widget.RecyclerView import org.koin.android.ext.android.inject import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.settings.SettingsHeadersFragment abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : diff --git a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt index f01dc73d9..8a6217d04 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/backup/BackupZipOutput.kt @@ -15,11 +15,11 @@ class BackupZipOutput(val file: File) : Closeable { private val output = ZipOutput(file, Deflater.BEST_COMPRESSION) - suspend fun put(entry: BackupEntry) { + suspend fun put(entry: BackupEntry) = runInterruptible(Dispatchers.IO) { output.put(entry.name, entry.data.toString(2)) } - suspend fun finish() { + suspend fun finish() = runInterruptible(Dispatchers.IO) { output.finish() } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt index 5a8cd055c..ef20b4fb0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/CloudFlareProtectedException.kt @@ -1,8 +1,6 @@ package org.koitharu.kotatsu.core.exceptions -import androidx.annotation.StringRes import okio.IOException -import org.koitharu.kotatsu.R class CloudFlareProtectedException( val url: String 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 5dd49a44b..45fbb85a4 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 @@ -321,9 +321,6 @@ class AppSettings(context: Context) { const val KEY_APP_UPDATE = "app_update" const val KEY_APP_UPDATE_AUTO = "app_update_auto" const val KEY_APP_TRANSLATION = "about_app_translation" - const val KEY_FEEDBACK_4PDA = "about_feedback_4pda" - const val KEY_FEEDBACK_DISCORD = "about_feedback_discord" - const val KEY_FEEDBACK_GITHUB = "about_feedback_github" private const val NETWORK_NEVER = 0 private const val NETWORK_ALWAYS = 1 diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index 28556ac48..568bb6427 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -9,7 +9,6 @@ import androidx.collection.ArraySet import androidx.core.graphics.Insets import androidx.core.view.isNotEmpty import androidx.core.view.updatePadding -import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.GridLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.snackbar.Snackbar diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt index 30b696297..d3980c687 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt @@ -16,6 +16,7 @@ abstract class BasePageHolder( exceptionResolver: ExceptionResolver ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { + @Suppress("LeakingThis") protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver) protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt index b6adc87b1..d097c1bc2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/BaseReaderAdapter.kt @@ -11,10 +11,11 @@ import org.koitharu.kotatsu.utils.ext.resetTransformations import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +@Suppress("LeakingThis") abstract class BaseReaderAdapter>( private val loader: PageLoader, private val settings: AppSettings, - private val exceptionResolver: ExceptionResolver + private val exceptionResolver: ExceptionResolver, ) : RecyclerView.Adapter() { private val differ = AsyncListDiffer(this, DiffCallback()) diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt index 3d075c1b3..ea5551701 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.search.ui import android.content.Context import android.content.Intent import android.os.Bundle -import android.os.Parcelable import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.core.graphics.Insets diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index 9bd070028..b05b31e76 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -22,7 +22,6 @@ import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource -import org.koitharu.kotatsu.tracker.domain.Tracker import org.koitharu.kotatsu.utils.ext.isScrolledToTop class SettingsActivity : diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt index 1bf8b7856..3920cb32c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt @@ -29,6 +29,6 @@ class RingtonePickContract(private val title: String?) : ActivityResultContract< } override fun parseResult(resultCode: Int, intent: Intent?): Uri? { - return intent?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + return intent?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt index d334f31ef..398a0a0f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt @@ -32,14 +32,14 @@ class SuggestionRepository( suspend fun replace(suggestions: Iterable) { db.withTransaction { db.suggestionDao.deleteAll() - suggestions.forEach { x -> - val tags = x.manga.tags.toEntities() + suggestions.forEach { (manga, relevance) -> + val tags = manga.tags.toEntities() db.tagsDao.upsert(tags) - db.mangaDao.upsert(x.manga.toEntity(), tags) + db.mangaDao.upsert(manga.toEntity(), tags) db.suggestionDao.upsert( SuggestionEntity( - mangaId = x.manga.id, - relevance = x.relevance, + mangaId = manga.id, + relevance = relevance, createdAt = System.currentTimeMillis(), ) ) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt index 6c856f4d4..4cecbd2a8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ScreenOrientationHelper.kt @@ -35,7 +35,7 @@ class ScreenOrientationHelper(private val activity: Activity) { isLandscape = !isLandscape } - fun observeAutoOrientation() = callbackFlow { + fun observeAutoOrientation() = callbackFlow { val observer = object : ContentObserver(Handler(activity.mainLooper)) { override fun onChange(selfChange: Boolean) { trySendBlocking(isAutoRotationEnabled) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt deleted file mode 100644 index 7276dab57..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/InsetsExt.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.koitharu.kotatsu.utils.ext - -import android.view.View -import androidx.core.graphics.Insets - -fun Insets.getStart(view: View): Int { - return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) { - right - } else { - left - } -} - -fun Insets.getEnd(view: View): Int { - return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) { - left - } else { - right - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt index e3cd66b43..03123c692 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/LiveDataExt.kt @@ -4,11 +4,10 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.lifecycle.liveData -import kotlinx.coroutines.Deferred -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.flow.Flow import org.koitharu.kotatsu.utils.BufferedObserver +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext fun LiveData.observeNotNull(owner: LifecycleOwner, observer: Observer) { this.observe(owner) { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index 67c30830e..586e40eef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -5,8 +5,6 @@ import android.graphics.Rect import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager -import androidx.annotation.StringRes -import androidx.appcompat.widget.TooltipCompat import androidx.core.view.children import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/res/color-v23/selector_switch_thumb.xml b/app/src/main/res/color-v23/selector_switch_thumb.xml deleted file mode 100644 index ef1a3cc36..000000000 --- a/app/src/main/res/color-v23/selector_switch_thumb.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color-v23/selector_switch_track.xml b/app/src/main/res/color-v23/selector_switch_track.xml deleted file mode 100644 index 3779a794a..000000000 --- a/app/src/main/res/color-v23/selector_switch_track.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/selector_switch_thumb.xml b/app/src/main/res/color/selector_switch_thumb.xml deleted file mode 100644 index de8892285..000000000 --- a/app/src/main/res/color/selector_switch_thumb.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/selector_switch_track.xml b/app/src/main/res/color/selector_switch_track.xml deleted file mode 100644 index 7b6c7c468..000000000 --- a/app/src/main/res/color/selector_switch_track.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/badge.xml b/app/src/main/res/drawable/badge.xml deleted file mode 100644 index a15864699..000000000 --- a/app/src/main/res/drawable/badge.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_list_add.xml b/app/src/main/res/drawable/ic_list_add.xml deleted file mode 100644 index 26ca07f23..000000000 --- a/app/src/main/res/drawable/ic_list_add.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml deleted file mode 100644 index e63766078..000000000 --- a/app/src/main/res/drawable/ic_pause.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_resume.xml b/app/src/main/res/drawable/ic_resume.xml deleted file mode 100644 index 448628b18..000000000 --- a/app/src/main/res/drawable/ic_resume.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_thumb.xml b/app/src/main/res/drawable/switch_thumb.xml deleted file mode 100644 index 12222e7f5..000000000 --- a/app/src/main/res/drawable/switch_thumb.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_track.xml b/app/src/main/res/drawable/switch_track.xml deleted file mode 100644 index 005647294..000000000 --- a/app/src/main/res/drawable/switch_track.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml deleted file mode 100644 index 812297a8f..000000000 --- a/app/src/main/res/layout/dialog_input.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_category_checkable.xml b/app/src/main/res/layout/item_category_checkable.xml deleted file mode 100644 index 712a1a9e4..000000000 --- a/app/src/main/res/layout/item_category_checkable.xml +++ /dev/null @@ -1,15 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/menu/opt_crash.xml b/app/src/main/res/menu/opt_crash.xml deleted file mode 100644 index 178c696c5..000000000 --- a/app/src/main/res/menu/opt_crash.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/opt_downloads.xml b/app/src/main/res/menu/opt_downloads.xml deleted file mode 100644 index f804ec53f..000000000 --- a/app/src/main/res/menu/opt_downloads.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml index 0940b1dbb..5cb31b523 100644 --- a/app/src/main/res/values/bools.xml +++ b/app/src/main/res/values/bools.xml @@ -1,5 +1,5 @@ - + false true false diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index a1fe42507..d560bd956 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,5 +1,6 @@ - + - + diff --git a/metadata/ru/full_description.txt b/metadata/ru/full_description.txt index 87944e3da..df079ccdd 100644 --- a/metadata/ru/full_description.txt +++ b/metadata/ru/full_description.txt @@ -5,7 +5,7 @@ Kotatsu - приложения для чтения манги с открыты - Поиск манги по имени и жанрам - История чтения - Избранное с пользовательскими категориями -- Возможность сохранять мангу и читать её оффлайн. Поддержка сторонних комиксов в формате CBZ +- Возможность сохранять мангу и читать её офлайн. Поддержка сторонних комиксов в формате CBZ - Интерфейс также оптимизирован для планшетов - Поддержка манхвы (Webtoon) - Уведомления о новых главах и лента обновлений From c281ab5a39ce95f49b500ff4479927d75aa1188a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 29 Jun 2022 12:01:59 +0300 Subject: [PATCH 17/23] Fix widgets size and background --- .../kotatsu/widget/recent/RecentListFactory.kt | 2 ++ .../kotatsu/widget/shelf/ShelfListFactory.kt | 2 ++ app/src/main/res/layout/widget_recent.xml | 5 ++++- app/src/main/res/values/themes.xml | 2 +- app/src/main/res/xml/widget_recent.xml | 12 ++++++++---- app/src/main/res/xml/widget_shelf.xml | 8 +++++--- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt index bf8fbf202..3a2142032 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt @@ -7,6 +7,7 @@ import android.widget.RemoteViewsService import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest +import coil.size.Scale import coil.size.Size import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking @@ -54,6 +55,7 @@ class RecentListFactory( ImageRequest.Builder(context) .data(item.coverUrl) .size(coverSize) + .scale(Scale.FILL) .transformations(transformation) .build() ).requireBitmap() diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt index 2eb942ef5..58b9fef3a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt @@ -7,6 +7,7 @@ import android.widget.RemoteViewsService import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest +import coil.size.Scale import coil.size.Size import coil.transform.RoundedCornersTransformation import kotlinx.coroutines.runBlocking @@ -65,6 +66,7 @@ class ShelfListFactory( ImageRequest.Builder(context) .data(item.coverUrl) .size(coverSize) + .scale(Scale.FILL) .transformations(transformation) .build() ).requireBitmap() diff --git a/app/src/main/res/layout/widget_recent.xml b/app/src/main/res/layout/widget_recent.xml index f65032b83..e79d63786 100644 --- a/app/src/main/res/layout/widget_recent.xml +++ b/app/src/main/res/layout/widget_recent.xml @@ -2,7 +2,10 @@ + android:layout_height="match_parent" + android:background="?android:attr/colorBackground" + android:padding="4dp" + android:theme="@style/Theme.Kotatsu.AppWidgetContainer"> diff --git a/app/src/main/res/xml/widget_recent.xml b/app/src/main/res/xml/widget_recent.xml index 7b6985481..476c83cda 100644 --- a/app/src/main/res/xml/widget_recent.xml +++ b/app/src/main/res/xml/widget_recent.xml @@ -1,13 +1,17 @@ + android:widgetCategory="home_screen" + tools:ignore="UnusedAttribute" /> diff --git a/app/src/main/res/xml/widget_shelf.xml b/app/src/main/res/xml/widget_shelf.xml index b2eedc03e..c1e4879de 100644 --- a/app/src/main/res/xml/widget_shelf.xml +++ b/app/src/main/res/xml/widget_shelf.xml @@ -5,12 +5,14 @@ android:configure="org.koitharu.kotatsu.widget.shelf.ShelfConfigActivity" android:description="@string/appwidget_shelf_description" android:initialLayout="@layout/widget_shelf" - android:minWidth="110dp" - android:minHeight="110dp" - android:minResizeWidth="40dp" + android:minWidth="160dp" + android:minHeight="120dp" + android:minResizeWidth="120dp" android:minResizeHeight="40dp" android:previewImage="@drawable/ic_appwidget_shelf" android:resizeMode="horizontal|vertical" + android:targetCellWidth="3" + android:targetCellHeight="2" android:updatePeriodMillis="0" android:widgetCategory="home_screen" android:widgetFeatures="reconfigurable" From 274a6726377301b9cbe31863486884854ad5bb32 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 29 Jun 2022 12:21:44 +0300 Subject: [PATCH 18/23] Increase version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 67ad71a1c..ad1ec0511 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 32 - versionCode 410 - versionName '3.3.1' + versionCode 411 + versionName '3.3.2' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From cdf06578c1d22d9c02322539b5e7344556c650df Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 30 Jun 2022 18:24:44 +0300 Subject: [PATCH 19/23] [Issue template] Add old version of issue templates This is need for some GitHub clients like Octodroid and something else --- .github/ISSUE_TEMPLATE.md | 31 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/report_issue.yml | 4 +-- .github/ISSUE_TEMPLATE/request_feature.yml | 12 +++++++-- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..3d6ce20cd --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,31 @@ +**PLEASE READ THIS** + +I acknowledge that: + +- I have updated: + - To the latest version of the app (https://github.com/KotatsuApp/Kotatsu/releases/latest) + - All extensions +- If this is an issue with a parser, that I should be opening an issue in https://github.com/KotatsuApp/kotatsu-parsers +- I have searched the existing issues and this is new ticket **NOT** a duplicate or related to another open or closed issue +- I will fill out the title and the information in this template + +Note that the issue will be automatically closed if you do not fill out the title or requested information. + +**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT** + +--- + +## Device information +* Kotatsu version: ? +* Android version: ? +* Device: ? + +## Steps to reproduce +1. First step +2. Second step + +## Issue/Request +? + +## Other details +Additional details and attachments. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/report_issue.yml b/.github/ISSUE_TEMPLATE/report_issue.yml index d0766690f..4bc2d2de9 100644 --- a/.github/ISSUE_TEMPLATE/report_issue.yml +++ b/.github/ISSUE_TEMPLATE/report_issue.yml @@ -44,7 +44,7 @@ body: label: Kotatsu version description: You can find your Kotatsu version in **Settings → About**. placeholder: | - Example: "3.3.1" + Example: "3.3" validations: required: true @@ -87,7 +87,5 @@ body: required: true - label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new). required: true - - label: I have updated the app to version **[3.3.1](https://github.com/KotatsuApp/Kotatsu/releases/latest)**. - required: true - label: I will fill out all of the requested information in this form. required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/request_feature.yml b/.github/ISSUE_TEMPLATE/request_feature.yml index 7bd0e002e..b49ba479b 100644 --- a/.github/ISSUE_TEMPLATE/request_feature.yml +++ b/.github/ISSUE_TEMPLATE/request_feature.yml @@ -21,6 +21,16 @@ body: placeholder: | Additional details and attachments. + - type: input + id: kotatsu-version + attributes: + label: Kotatsu version + description: You can find your Kotatsu version in **Settings → About**. + placeholder: | + Example: "3.3" + validations: + required: true + - type: checkboxes id: acknowledgements attributes: @@ -33,7 +43,5 @@ body: required: true - label: If this is an issue with a source, I should be opening an issue in the [parsers repository](https://github.com/KotatsuApp/kotatsu-parsers/issues/new). required: true - - label: I have updated the app to version **[3.3.1](https://github.com/KotatsuApp/Kotatsu/releases/latest)**. - required: true - label: I will fill out all of the requested information in this form. required: true \ No newline at end of file From 8a8c785a31711d9d1fa28008ac3f364f76c4e95b Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 30 Jun 2022 18:40:31 +0300 Subject: [PATCH 20/23] Add issue moderator action --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/issue_moderator.yml | 29 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/issue_moderator.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b6d4254a1..c7cc0c855 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - name: ⚠️ Source issue - url: https://github.com/nv95/kotatsu-parsers/issues/new + url: https://github.com/KotatsuApp/kotatsu-parsers/issues/new about: Issues and requests for sources should be opened in the kotatsu-parsers repository instead \ No newline at end of file diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml new file mode 100644 index 000000000..ef256ed06 --- /dev/null +++ b/.github/workflows/issue_moderator.yml @@ -0,0 +1,29 @@ +name: Issue moderator + +on: + issues: + types: [opened, edited, reopened] + issue_comment: + types: [created] + +jobs: + moderate: + runs-on: ubuntu-latest + steps: + - name: Moderate issues + uses: tachiyomiorg/issue-moderator-action@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + auto-close-rules: | + [ + { + "type": "body", + "regex": ".*DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT.*", + "message": "The acknowledgment section was not removed." + }, + { + "type": "body", + "regex": ".*\\* (Kotatsu version|Android version|Device): \\?.*", + "message": "Requested information in the template was not filled out." + } + ] \ No newline at end of file From fb0a075c502ace76128205f9d7c10a99c8f0ed18 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 30 Jun 2022 18:42:53 +0300 Subject: [PATCH 21/23] Fix acknowledgment --- .github/ISSUE_TEMPLATE.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 3d6ce20cd..e32589680 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -2,9 +2,7 @@ I acknowledge that: -- I have updated: - - To the latest version of the app (https://github.com/KotatsuApp/Kotatsu/releases/latest) - - All extensions +- I have updated to the latest version of the app (https://github.com/KotatsuApp/Kotatsu/releases/latest) - If this is an issue with a parser, that I should be opening an issue in https://github.com/KotatsuApp/kotatsu-parsers - I have searched the existing issues and this is new ticket **NOT** a duplicate or related to another open or closed issue - I will fill out the title and the information in this template From a48abc56ddf49137ae07ee9a4ef25c25a50909d3 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 1 Jul 2022 16:02:33 +0300 Subject: [PATCH 22/23] Catch HttpException in widgets as well --- .../koitharu/kotatsu/widget/recent/RecentListFactory.kt | 8 ++++---- .../org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt index 3a2142032..04c25f382 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/recent/RecentListFactory.kt @@ -16,7 +16,6 @@ import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.requireBitmap -import java.io.IOException class RecentListFactory( private val context: Context, @@ -50,8 +49,8 @@ class RecentListFactory( override fun getViewAt(position: Int): RemoteViews { val views = RemoteViews(context.packageName, R.layout.item_recent) val item = dataSet[position] - try { - val cover = coil.executeBlocking( + runCatching { + coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) .size(coverSize) @@ -59,8 +58,9 @@ class RecentListFactory( .transformations(transformation) .build() ).requireBitmap() + }.onSuccess { cover -> views.setImageViewBitmap(R.id.imageView_cover, cover) - } catch (e: IOException) { + }.onFailure { views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder) } val intent = Intent() diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt index 58b9fef3a..1676e5a49 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/shelf/ShelfListFactory.kt @@ -17,7 +17,6 @@ import org.koitharu.kotatsu.core.prefs.AppWidgetConfig import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.utils.ext.requireBitmap -import java.io.IOException class ShelfListFactory( private val context: Context, @@ -61,8 +60,8 @@ class ShelfListFactory( val views = RemoteViews(context.packageName, R.layout.item_shelf) val item = dataSet[position] views.setTextViewText(R.id.textView_title, item.title) - try { - val cover = coil.executeBlocking( + runCatching { + coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) .size(coverSize) @@ -70,8 +69,9 @@ class ShelfListFactory( .transformations(transformation) .build() ).requireBitmap() + }.onSuccess { cover -> views.setImageViewBitmap(R.id.imageView_cover, cover) - } catch (e: IOException) { + }.onFailure { views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder) } val intent = Intent() From ce97c8f7d9fd966b02632a8e83df7e94db438feb Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 2 Jul 2022 11:02:03 +0300 Subject: [PATCH 23/23] Ability to report non-fatal exceptions --- .gitignore | 1 + .idea/render.experimental.xml | 6 -- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 1 + .../kotatsu/base/ui/widgets/FadingSnackbar.kt | 87 ++++++++++++++----- .../kotatsu/details/ui/DetailsActivity.kt | 20 ++++- .../kotatsu/details/ui/DetailsViewModel.kt | 2 +- .../details/ui/MangaDetailsDelegate.kt | 5 ++ .../kotatsu/reader/ui/ReaderActivity.kt | 9 +- .../kotatsu/reader/ui/ReaderViewModel.kt | 5 +- .../ext/{CommonExt.kt => ThrowableExt.kt} | 6 +- .../res/layout/fading_snackbar_layout.xml | 19 ++-- app/src/main/res/values/strings.xml | 1 + 12 files changed, 118 insertions(+), 44 deletions(-) delete mode 100644 .idea/render.experimental.xml rename app/src/main/java/org/koitharu/kotatsu/utils/ext/{CommonExt.kt => ThrowableExt.kt} (87%) diff --git a/.gitignore b/.gitignore index 9b63e14e7..5611db9cb 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /.idea/kotlinScripting.xml /.idea/deploymentTargetDropDown.xml /.idea/androidTestResultsUserPreferences.xml +/.idea/render.experimental.xml .DS_Store /build /captures diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml deleted file mode 100644 index 5cad4e0be..000000000 --- a/.idea/render.experimental.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 8035a83fc..a1e9ace1d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -92,6 +92,7 @@ class KotatsuApp : Application() { ReportField.PHONE_MODEL, ReportField.CRASH_CONFIGURATION, ReportField.STACK_TRACE, + ReportField.CUSTOM_DATA, ReportField.SHARED_PREFERENCES, ) dialog { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt index 9c85787a7..909252b48 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt @@ -17,19 +17,28 @@ package org.koitharu.kotatsu.base.ui.widgets import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.LayoutInflater -import android.widget.Button import android.widget.FrameLayout -import android.widget.TextView +import androidx.annotation.ColorInt import androidx.annotation.StringRes +import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.postDelayed -import org.koitharu.kotatsu.R +import com.google.android.material.color.MaterialColors +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel +import com.google.android.material.snackbar.Snackbar +import org.koitharu.kotatsu.databinding.FadingSnackbarLayoutBinding +import org.koitharu.kotatsu.utils.ext.getThemeColorStateList +import com.google.android.material.R as materialR private const val ENTER_DURATION = 300L private const val EXIT_DURATION = 200L -private const val SHORT_DURATION = 1_500L -private const val LONG_DURATION = 2_750L +private const val SHORT_DURATION_MS = 1_500L +private const val LONG_DURATION_MS = 2_750L + /** * A custom snackbar implementation allowing more control over placement and entry/exit animations. * @@ -40,16 +49,13 @@ private const val LONG_DURATION = 2_750L class FadingSnackbar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 + defStyleAttr: Int = 0, ) : FrameLayout(context, attrs, defStyleAttr) { - private val message: TextView - private val action: Button + private val binding = FadingSnackbarLayoutBinding.inflate(LayoutInflater.from(context), this) init { - val view = LayoutInflater.from(context).inflate(R.layout.fading_snackbar_layout, this, true) - message = view.findViewById(R.id.snackbar_text) - action = view.findViewById(R.id.snackbar_action) + binding.snackbarLayout.background = createThemedBackground() } fun dismiss() { @@ -62,33 +68,66 @@ class FadingSnackbar @JvmOverloads constructor( } fun show( - messageText: CharSequence? = null, - @StringRes actionId: Int? = null, - longDuration: Boolean = true, - actionClick: () -> Unit = { dismiss() }, - dismissListener: () -> Unit = { } + messageText: CharSequence?, + @StringRes actionId: Int = 0, + duration: Int = Snackbar.LENGTH_SHORT, + onActionClick: (FadingSnackbar.() -> Unit)? = null, + onDismiss: (() -> Unit)? = null, ) { - message.text = messageText - if (actionId != null) { - action.run { + binding.snackbarText.text = messageText + if (actionId != 0) { + with(binding.snackbarAction) { visibility = VISIBLE text = context.getString(actionId) setOnClickListener { - actionClick() + onActionClick?.invoke(this@FadingSnackbar) ?: dismiss() } } } else { - action.visibility = GONE + binding.snackbarAction.visibility = GONE } alpha = 0f visibility = VISIBLE animate() .alpha(1f) .duration = ENTER_DURATION - val showDuration = ENTER_DURATION + if (longDuration) LONG_DURATION else SHORT_DURATION - postDelayed(showDuration) { + if (duration == Snackbar.LENGTH_INDEFINITE) { + return + } + val durationMs = ENTER_DURATION + if (duration == Snackbar.LENGTH_LONG) LONG_DURATION_MS else SHORT_DURATION_MS + postDelayed(durationMs) { dismiss() - dismissListener() + onDismiss?.invoke() } } + + private fun createThemedBackground(): Drawable { + val backgroundColor = MaterialColors.layer(this, materialR.attr.colorSurface, materialR.attr.colorOnSurface, 1f) + val shapeAppearanceModel = ShapeAppearanceModel.builder( + context, + materialR.style.ShapeAppearance_Material3_Corner_ExtraSmall, + 0 + ).build() + val background = createMaterialShapeDrawableBackground( + backgroundColor, + shapeAppearanceModel, + ) + val backgroundTint = context.getThemeColorStateList(materialR.attr.colorSurfaceInverse) + return if (backgroundTint != null) { + val wrappedDrawable = DrawableCompat.wrap(background) + DrawableCompat.setTintList(wrappedDrawable, backgroundTint) + wrappedDrawable + } else { + DrawableCompat.wrap(background) + } + } + + private fun createMaterialShapeDrawableBackground( + @ColorInt backgroundColor: Int, + shapeAppearanceModel: ShapeAppearanceModel, + ): MaterialShapeDrawable { + val background = MaterialShapeDrawable(shapeAppearanceModel) + background.fillColor = ColorStateList.valueOf(backgroundColor) + return background + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index dc5e6a513..df529038e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -21,9 +21,11 @@ import androidx.core.view.updatePadding import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import kotlinx.coroutines.launch +import org.acra.ktx.sendWithAcra import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -37,6 +39,7 @@ import org.koitharu.kotatsu.core.os.ShortcutsRepository import org.koitharu.kotatsu.databinding.ActivityDetailsBinding import org.koitharu.kotatsu.details.ui.adapter.BranchesAdapter import org.koitharu.kotatsu.download.ui.service.DownloadService +import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.mapNotNullToSet @@ -81,7 +84,7 @@ class DetailsActivity : viewModel.onMangaRemoved.observe(this, ::onMangaRemoved) viewModel.onError.observe(this, ::onError) viewModel.onShowToast.observe(this) { - binding.snackbar.show(messageText = getString(it), longDuration = false) + binding.snackbar.show(messageText = getString(it)) } registerReceiver(downloadReceiver, IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE)) @@ -114,6 +117,21 @@ class DetailsActivity : Toast.makeText(this, e.getDisplayMessage(resources), Toast.LENGTH_LONG).show() finishAfterTransition() } + e is ParseException || e is IllegalArgumentException || e is IllegalStateException -> { + binding.snackbar.show( + messageText = e.getDisplayMessage(resources), + actionId = R.string.report, + duration = if (viewModel.manga.value?.chapters == null) { + Snackbar.LENGTH_INDEFINITE + } else { + Snackbar.LENGTH_LONG + }, + onActionClick = { + e.sendWithAcra() + dismiss() + } + ) + } else -> { binding.snackbar.show(e.getDisplayMessage(resources)) } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 757c70f61..0cab2ea03 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.asFlow import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import java.io.IOException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.* @@ -30,6 +29,7 @@ import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import java.io.IOException class DetailsViewModel( intent: MangaIntent, diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt index 07f03dbda..c6c45ecc1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsDelegate.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.details.ui import androidx.core.os.LocaleListCompat import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import org.acra.ACRA import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.core.exceptions.MangaNotFoundException @@ -13,6 +14,7 @@ import org.koitharu.kotatsu.details.ui.model.ChapterListItem import org.koitharu.kotatsu.details.ui.model.toListItem import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.local.domain.LocalMangaRepository +import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaSource @@ -20,6 +22,7 @@ import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.utils.ext.iterator import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import org.koitharu.kotatsu.utils.ext.setCurrentManga class MangaDetailsDelegate( private val intent: MangaIntent, @@ -32,6 +35,7 @@ class MangaDetailsDelegate( private val mangaData = MutableStateFlow(intent.manga) val selectedBranch = MutableStateFlow(null) + // Remote manga for saved and saved for remote val relatedManga = MutableStateFlow(null) val manga: StateFlow @@ -41,6 +45,7 @@ class MangaDetailsDelegate( suspend fun doLoad() { var manga = mangaDataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") + ACRA.setCurrentManga(manga) mangaData.value = manga manga = MangaRepository(manga.source).getDetails(manga) // find default branch 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 e4a29b948..dfd3af976 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 @@ -24,6 +24,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.acra.ktx.sendWithAcra import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @@ -214,6 +215,8 @@ class ReaderActivity : val resolveTextId = ExceptionResolver.getResolveStringId(e) if (resolveTextId != 0) { dialog.setPositiveButton(resolveTextId, listener) + } else { + dialog.setPositiveButton(R.string.report, listener) } dialog.show() } @@ -368,7 +371,11 @@ class ReaderActivity : override fun onClick(dialog: DialogInterface?, which: Int) { if (which == DialogInterface.BUTTON_POSITIVE) { dialog?.dismiss() - tryResolve(exception) + if (ExceptionResolver.canResolve(exception)) { + tryResolve(exception) + } else { + exception.sendWithAcra() + } } else { onCancel(dialog) } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index 931461de0..bb8555941 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -6,9 +6,9 @@ import androidx.activity.result.ActivityResultLauncher import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import java.util.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* +import org.acra.ACRA import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.domain.MangaDataRepository import org.koitharu.kotatsu.base.domain.MangaIntent @@ -32,6 +32,8 @@ import org.koitharu.kotatsu.utils.SingleLiveEvent import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.processLifecycleScope +import org.koitharu.kotatsu.utils.ext.setCurrentManga +import java.util.* private const val BOUNDS_PAGE_OFFSET = 2 private const val PAGES_TRIM_THRESHOLD = 120 @@ -257,6 +259,7 @@ class ReaderViewModel( private fun loadImpl() { loadingJob = launchLoadingJob(Dispatchers.Default) { var manga = dataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") + ACRA.setCurrentManga(manga) mangaData.value = manga val repo = MangaRepository(manga.source) manga = repo.getDetails(manga) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt similarity index 87% rename from app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt rename to app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt index dc6974749..a71f3b7b3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt @@ -1,12 +1,14 @@ package org.koitharu.kotatsu.utils.ext import android.content.res.Resources +import org.acra.ACRA import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException import org.koitharu.kotatsu.core.exceptions.WrongPasswordException import org.koitharu.kotatsu.parsers.exception.AuthRequiredException +import org.koitharu.kotatsu.parsers.model.Manga import java.io.FileNotFoundException import java.net.SocketTimeoutException @@ -20,4 +22,6 @@ fun Throwable.getDisplayMessage(resources: Resources) = when (this) { is SocketTimeoutException -> resources.getString(R.string.network_error) is WrongPasswordException -> resources.getString(R.string.wrong_password) else -> localizedMessage ?: resources.getString(R.string.error_occurred) -} \ No newline at end of file +} + +fun ACRA.setCurrentManga(manga: Manga?) = errorReporter.putCustomData("manga", manga?.publicUrl.toString()) \ No newline at end of file diff --git a/app/src/main/res/layout/fading_snackbar_layout.xml b/app/src/main/res/layout/fading_snackbar_layout.xml index 4c75ce8b9..0ebbb7bdd 100644 --- a/app/src/main/res/layout/fading_snackbar_layout.xml +++ b/app/src/main/res/layout/fading_snackbar_layout.xml @@ -1,5 +1,4 @@ - -