diff --git a/app/build.gradle b/app/build.gradle
index 97cb1eb5..64be68c8 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,10 +12,11 @@ android {
applicationId "xyz.quaver.pupil"
minSdkVersion 16
targetSdkVersion 29
- versionCode 17
- versionName "2.10-alpha"
+ versionCode 19
+ versionName "2.11"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
+ vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
@@ -37,23 +38,22 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.11.0"
- implementation 'com.android.support:multidex:1.0.3'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.preference:preference:1.1.0-beta01'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.firebase:firebase-core:17.0.0'
implementation 'com.google.firebase:firebase-perf:18.0.1'
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
implementation 'com.github.arimorty:floatingsearchview:2.1.1'
- implementation 'com.andrognito.patternlockview:patternlockview:1.0.0'
- implementation 'androidx.appcompat:appcompat:1.0.2'
- implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
- implementation "ru.noties.markwon:core:${markwonVersion}"
implementation 'com.github.clans:fab:1.6.4'
- implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
- implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
+ implementation 'com.andrognito.patternlockview:patternlockview:1.0.0'
+ implementation "ru.noties.markwon:core:${markwonVersion}"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:rules:1.2.0'
diff --git a/app/release/output.json b/app/release/output.json
index f084575a..6020ec9f 100644
--- a/app/release/output.json
+++ b/app/release/output.json
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":17,"versionName":"2.9.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":18,"versionName":"2.10.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
index facb9b50..f7decdb4 100644
--- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
+++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
@@ -9,6 +9,7 @@ import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import xyz.quaver.hitomi.fetchNozomi
import xyz.quaver.hiyobi.cookie
import xyz.quaver.hiyobi.getReader
import xyz.quaver.hiyobi.user_agent
@@ -29,6 +30,8 @@ class ExampleInstrumentedTest {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("xyz.quaver.pupil", appContext.packageName)
+
+ Log.d("Pupil", fetchNozomi().first.size.toString())
}
@Test
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c3e6686f..89e70b1e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,7 +6,7 @@
= Build.VERSION_CODES.O) {
@@ -41,6 +54,8 @@ class Pupil : MultiDexApplication() {
preference.edit().putBoolean("channel_created", true).apply()
}
+
+ super.onCreate()
}
}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt
index 9cf73343..68b23485 100644
--- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt
+++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt
@@ -2,7 +2,8 @@ package xyz.quaver.pupil.adapters
import android.app.AlertDialog
import android.graphics.BitmapFactory
-import android.graphics.drawable.Animatable
+import android.graphics.drawable.Drawable
+import android.util.Log
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
@@ -12,6 +13,7 @@ import android.widget.LinearLayout
import androidx.cardview.widget.CardView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import com.google.android.material.chip.Chip
import kotlinx.android.synthetic.main.item_galleryblock.view.*
@@ -24,7 +26,7 @@ import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.list
import xyz.quaver.hitomi.GalleryBlock
import xyz.quaver.hitomi.ReaderItem
-import xyz.quaver.pupil.ui.Pupil
+import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.R
import xyz.quaver.pupil.types.Tag
import xyz.quaver.pupil.util.Histories
@@ -68,7 +70,7 @@ class GalleryBlockAdapter(private val galleries: List favorites.add(galleryBlock.id)
- else -> favorites.remove(galleryBlock.id)
- }
- }
- setOnCheckedChangeListener { _, isChecked ->
- when {
- isChecked -> (background as Animatable).start()
- else -> background = AnimatedVectorDrawableCompat.create(context, R.drawable.avd_star)
+ favorites.contains(galleryBlock.id) -> {
+ favorites.remove(galleryBlock.id)
+
+ setImageResource(R.drawable.ic_star_empty)
+ }
+ else -> {
+ favorites.add(galleryBlock.id)
+
+ setImageDrawable(AnimatedVectorDrawableCompat.create(context, R.drawable.avd_star).apply {
+ this ?: return@apply
+
+ registerAnimationCallback(object: Animatable2Compat.AnimationCallback() {
+ override fun onAnimationEnd(drawable: Drawable?) {
+ setImageResource(R.drawable.ic_star_filled)
+ }
+ })
+ start()
+ })
+ }
}
}
}
diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt
index e75617c4..991828de 100644
--- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt
+++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt
@@ -1,6 +1,8 @@
package xyz.quaver.pupil.adapters
+import android.graphics.Bitmap
import android.graphics.BitmapFactory
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -10,6 +12,8 @@ import xyz.quaver.pupil.R
class ReaderAdapter(private val images: List) : RecyclerView.Adapter() {
+ var isFullScreen = false
+
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@@ -21,19 +25,49 @@ class ReaderAdapter(private val images: List) : RecyclerView.Adapter reqHeight || width > reqWidth) {
+
+ val halfHeight: Int = height / 2
+ val halfWidth: Int = width / 2
+
+ // Calculate the largest inSampleSize value that is a power of 2 and keeps both
+ // height and width larger than the requested height and width.
+ while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
+ inSampleSize *= 2
+ }
+ }
+
+ return inSampleSize
+ }
+
with(holder.view as ImageView) {
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(images[position], options)
- options.inSampleSize = options.outWidth /
- context.resources.displayMetrics.widthPixels
+ val (reqWidth, reqHeight) = context.resources.displayMetrics.let {
+ Pair(it.widthPixels, it.heightPixels)
+ }
+
+ options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
+
+ options.inPreferredConfig = Bitmap.Config.RGB_565
options.inJustDecodeBounds = false
val image = BitmapFactory.decodeFile(images[position], options)
+ Log.d("Pupil", image.byteCount.toString())
+ Log.d("Pupil", "${image.width}x${image.height}")
+ Log.d("Pupil", "deviceWidth ${context.resources.displayMetrics.widthPixels}")
+
setImageBitmap(image)
}
}
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt
index d8eee511..57f9ed9a 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/LockActivity.kt
@@ -1,14 +1,12 @@
package xyz.quaver.pupil.ui
import android.app.Activity
-import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
-import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
import com.andrognito.patternlockview.PatternLockView
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_lock.*
import kotlinx.android.synthetic.main.fragment_pattern_lock.*
-import kotlinx.android.synthetic.main.settings_activity.*
import xyz.quaver.pupil.R
import xyz.quaver.pupil.util.Lock
import xyz.quaver.pupil.util.LockManager
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt
index 8b59da1c..a19254a9 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt
@@ -42,6 +42,7 @@ import kotlinx.serialization.stringify
import ru.noties.markwon.Markwon
import xyz.quaver.hitomi.*
import xyz.quaver.pupil.BuildConfig
+import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.R
import xyz.quaver.pupil.adapters.GalleryBlockAdapter
import xyz.quaver.pupil.types.Tag
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt
index 990f7b50..e29b3111 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt
@@ -28,6 +28,7 @@ import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import xyz.quaver.hitomi.GalleryBlock
import xyz.quaver.hitomi.getGalleryBlock
+import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.R
import xyz.quaver.pupil.adapters.ReaderAdapter
import xyz.quaver.pupil.util.GalleryDownloader
@@ -46,6 +47,8 @@ class ReaderActivity : AppCompatActivity() {
set(value) {
field = value
+ (reader_recyclerview.adapter as ReaderAdapter).isFullScreen = value
+
reader_progressbar.visibility = when {
value -> View.VISIBLE
else -> View.GONE
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt
index 1f995222..e4229365 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt
@@ -17,10 +17,12 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import kotlinx.android.synthetic.main.dialog_default_query.view.*
+import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.R
import xyz.quaver.pupil.types.Tags
import xyz.quaver.pupil.util.Lock
import xyz.quaver.pupil.util.LockManager
+import xyz.quaver.pupil.util.getDownloadDirectory
import java.io.File
class SettingsActivity : AppCompatActivity() {
@@ -133,7 +135,7 @@ class SettingsActivity : AppCompatActivity() {
with(findPreference("delete_downloads")) {
this!!
- val dir = context.getExternalFilesDir("Pupil") ?: return@with
+ val dir = getDownloadDirectory(context)!!
summary = getDirSize(dir)
diff --git a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt
index fda31db8..9be00515 100644
--- a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt
+++ b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt
@@ -4,7 +4,6 @@ import android.app.PendingIntent
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
-import android.util.Log
import android.util.SparseArray
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
@@ -18,8 +17,8 @@ import kotlinx.serialization.list
import xyz.quaver.hitomi.*
import xyz.quaver.hiyobi.cookie
import xyz.quaver.hiyobi.user_agent
-import xyz.quaver.pupil.ui.Pupil
import xyz.quaver.pupil.R
+import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.ui.ReaderActivity
import java.io.File
import java.io.FileOutputStream
@@ -218,7 +217,7 @@ class GalleryDownloader(
if (download) {
File(cacheDir, "imageCache/${galleryBlock.id}").let {
if (it.exists()) {
- val target = File(getExternalFilesDir("Pupil"), galleryBlock.id.toString())
+ val target = File(getDownloadDirectory(this@GalleryDownloader), galleryBlock.id.toString())
if (!target.exists())
target.mkdirs()
@@ -230,10 +229,10 @@ class GalleryDownloader(
notificationManager.notify(galleryBlock.id, notificationBuilder.build())
- onCompleteHandler?.invoke()
-
download = false
}
+
+ onCompleteHandler?.invoke()
}
remove(galleryBlock.id)
diff --git a/app/src/main/java/xyz/quaver/pupil/util/file.kt b/app/src/main/java/xyz/quaver/pupil/util/file.kt
index f351dcd2..a1823442 100644
--- a/app/src/main/java/xyz/quaver/pupil/util/file.kt
+++ b/app/src/main/java/xyz/quaver/pupil/util/file.kt
@@ -1,15 +1,24 @@
package xyz.quaver.pupil.util
import android.content.Context
+import android.os.Build
import android.os.Environment
import android.provider.MediaStore
+import androidx.core.content.ContextCompat
import java.io.File
fun getCachedGallery(context: Context, galleryID: Int): File {
- return File(context.getExternalFilesDir("Pupil"), galleryID.toString()).let {
+ return File(getDownloadDirectory(context), galleryID.toString()).let {
when {
it.exists() -> it
else -> File(context.cacheDir, "imageCache/$galleryID")
}
}
+}
+
+fun getDownloadDirectory(context: Context): File? {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+ context.getExternalFilesDir("Pupil")
+ else
+ File(Environment.getExternalStorageDirectory(), "Pupil")
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-anydpi/ic_progressbar_complete.xml b/app/src/main/res/drawable-anydpi/ic_progressbar_complete.xml
deleted file mode 100644
index 85cae265..00000000
--- a/app/src/main/res/drawable-anydpi/ic_progressbar_complete.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_progressbar.xml b/app/src/main/res/drawable/ic_progressbar.xml
index 3899286b..17f172e9 100644
--- a/app/src/main/res/drawable/ic_progressbar.xml
+++ b/app/src/main/res/drawable/ic_progressbar.xml
@@ -1,21 +1,22 @@
-
-
+xmlns:android="http://schemas.android.com/apk/res/android"
+android:name="vector"
+android:width="24dp"
+android:height="24dp"
+android:viewportWidth="24"
+android:viewportHeight="24"
+android:tintMode="multiply">
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_progressbar_complete.xml b/app/src/main/res/drawable/ic_progressbar_complete.xml
new file mode 100644
index 00000000..5fbef6ac
--- /dev/null
+++ b/app/src/main/res/drawable/ic_progressbar_complete.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/numeric.xml b/app/src/main/res/drawable/numeric.xml
new file mode 100644
index 00000000..fc54c34a
--- /dev/null
+++ b/app/src/main/res/drawable/numeric.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_lock.xml b/app/src/main/res/layout/activity_lock.xml
index e4632044..b570d386 100644
--- a/app/src/main/res/layout/activity_lock.xml
+++ b/app/src/main/res/layout/activity_lock.xml
@@ -27,7 +27,7 @@
android:id="@+id/lock_pattern"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/lock_pattern"
+ app:srcCompat="@drawable/lock_pattern"
app:backgroundTint="@color/colorPrimary"
app:fabSize="mini"/>
@@ -35,7 +35,7 @@
android:id="@+id/lock_pin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/numeric"
+ app:srcCompat="@drawable/numeric"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:backgroundTint="@color/dark_gray"
@@ -45,7 +45,7 @@
android:id="@+id/lock_fingerprint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/fingerprint"
+ app:srcCompat="@drawable/fingerprint"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:backgroundTint="@color/dark_gray"
@@ -55,7 +55,7 @@
android:id="@+id/lock_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/lastpass"
+ app:srcCompat="@drawable/lastpass"
app:backgroundTint="@color/dark_gray"
app:fabSize="mini"/>
diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml
index b1cd6c1d..789f04f3 100644
--- a/app/src/main/res/layout/activity_reader.xml
+++ b/app/src/main/res/layout/activity_reader.xml
@@ -55,7 +55,7 @@
android:id="@+id/reader_fab_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/ic_downloading"
+ app:srcCompat="@drawable/ic_downloading"
app:fab_label="@string/reader_fab_download"
app:fab_size="mini"/>
@@ -63,7 +63,7 @@
android:id="@+id/reader_fab_fullscreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/ic_fullscreen"
+ app:srcCompat="@drawable/ic_fullscreen"
app:fab_label="@string/reader_fab_fullscreen"
app:fab_size="mini"/>
diff --git a/app/src/main/res/layout/item_galleryblock.xml b/app/src/main/res/layout/item_galleryblock.xml
index 7e05f4c2..7fbe3d7d 100644
--- a/app/src/main/res/layout/item_galleryblock.xml
+++ b/app/src/main/res/layout/item_galleryblock.xml
@@ -158,15 +158,13 @@
android:layout_height="1dp"
android:layout_weight="1"/>
-
+ app:srcCompat="@drawable/ic_star_empty"
+ app:backgroundTint="@color/material_orange_500"/>
diff --git a/app/src/main/res/layout/item_next.xml b/app/src/main/res/layout/item_next.xml
index ec429ad8..4b647b6c 100644
--- a/app/src/main/res/layout/item_next.xml
+++ b/app/src/main/res/layout/item_next.xml
@@ -1,5 +1,6 @@
diff --git a/app/src/main/res/layout/item_prev.xml b/app/src/main/res/layout/item_prev.xml
index c01cc5da..60299e63 100644
--- a/app/src/main/res/layout/item_prev.xml
+++ b/app/src/main/res/layout/item_prev.xml
@@ -1,5 +1,6 @@
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index bdab1daf..8ea7ac44 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -7,7 +7,7 @@
検索
ギャラリー検索
ギャラリー検索
- イメージキャッシュクリア
+ キャッシュクリア
キャッシュをクリアするとイメージのロード速度に影響を与えます。実行しますか?
サイズ: %1$d%2$s
デフォルトキーワード
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d7c7956d..a1fe7f96 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -6,7 +6,7 @@
갤러리 검색
갤러리 검색
기본 검색어
- 이미지 캐시 정리하기
+ 캐시 정리하기
캐시를 정리하면 이미지 로딩속도가 느려질 수 있습니다. 계속하시겠습니까?
사용량: %1$d%2$s
한 번에 로드할 갤러리 수
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c8ef231d..3a2738d3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -85,7 +85,7 @@
Galleries per page
Default query
Storage
- Clear image cache
+ Clear cache
Deleting cache can affect image loading speed. Do you want to continue?
Currently using %1$d%2$s
Clear downloads
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 5a802f27..e823e4fb 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -29,7 +29,7 @@
app:title="@string/settings_storage">