diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
index 663d6fc3..6d4686e3 100644
--- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
+++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt
@@ -20,8 +20,8 @@
package xyz.quaver.pupil
-import android.content.Intent
import android.util.Log
+import androidx.core.content.ContextCompat
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
@@ -64,7 +64,9 @@ class ExampleInstrumentedTest {
val activityTestRule = ActivityTestRule(LockActivity::class.java)
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- activityTestRule.launchActivity(Intent())
+ ContextCompat.getExternalFilesDirs(appContext, null).forEachIndexed { index, file ->
+ Log.i("PUPILD", "$index: ${file?.absolutePath}")
+ }
}
@Test
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d4cf3be9..4db90b6f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,9 +4,6 @@
package="xyz.quaver.pupil">
-
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 f268d9a0..41812f1a 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt
@@ -72,6 +72,7 @@ import xyz.quaver.pupil.adapters.GalleryBlockAdapter
import xyz.quaver.pupil.types.Tag
import xyz.quaver.pupil.types.TagSuggestion
import xyz.quaver.pupil.types.Tags
+import xyz.quaver.pupil.ui.dialog.GalleryDialog
import xyz.quaver.pupil.util.*
import java.io.File
import java.io.FileOutputStream
@@ -613,7 +614,10 @@ class MainActivity : AppCompatActivity() {
val galleryID = galleries[position].first.id
- GalleryDialog(this@MainActivity, galleryID).apply {
+ GalleryDialog(
+ this@MainActivity,
+ galleryID
+ ).apply {
onChipClickedHandler.add {
runOnUiThread {
query = it.toQuery()
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 229a5836..291c7753 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt
@@ -44,8 +44,10 @@ import kotlinx.serialization.parseList
import xyz.quaver.pupil.Pupil
import xyz.quaver.pupil.R
import xyz.quaver.pupil.types.Tags
+import xyz.quaver.pupil.ui.dialog.DownloadLocationDialog
import xyz.quaver.pupil.util.Lock
import xyz.quaver.pupil.util.LockManager
+import xyz.quaver.pupil.util.byteToString
import xyz.quaver.pupil.util.getDownloadDirectory
import java.io.File
import java.nio.charset.Charset
@@ -85,14 +87,6 @@ class SettingsActivity : AppCompatActivity() {
class SettingsFragment : PreferenceFragmentCompat() {
- private val suffix = listOf(
- "B",
- "kB",
- "MB",
- "GB",
- "TB" //really?
- )
-
override fun onResume() {
super.onResume()
@@ -112,15 +106,9 @@ class SettingsActivity : AppCompatActivity() {
}
private fun getDirSize(dir: File) : String {
- var size = dir.walk().map { it.length() }.sum()
- var suffixIndex = 0
+ val size = dir.walk().map { it.length() }.sum()
- while (size >= 1024) {
- size /= 1024
- suffixIndex++
- }
-
- return getString(R.string.settings_clear_summary, size, suffix[suffixIndex])
+ return getString(R.string.settings_clear_summary, byteToString(size))
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -214,6 +202,14 @@ class SettingsActivity : AppCompatActivity() {
summary = getDownloadDirectory(context).absolutePath
onPreferenceClickListener = Preference.OnPreferenceClickListener {
+ DownloadLocationDialog(context).apply {
+ onDownloadLocationChangedListener = { value ->
+ PreferenceManager.getDefaultSharedPreferences(context).edit()
+ .putInt(key, value)
+ .apply()
+ summary = getDownloadDirectory(context).absolutePath
+ }
+ }.show()
true
}
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialog.kt
new file mode 100644
index 00000000..3fcae22a
--- /dev/null
+++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialog.kt
@@ -0,0 +1,78 @@
+/*
+ * Pupil, Hitomi.la viewer for Android
+ * Copyright (C) 2020 tom5079
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package xyz.quaver.pupil.ui.dialog
+
+import android.annotation.SuppressLint
+import android.app.Dialog
+import android.content.Context
+import android.widget.LinearLayout
+import android.widget.RadioButton
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.ContextCompat
+import androidx.preference.PreferenceManager
+import kotlinx.android.synthetic.main.item_dl_location.view.*
+import xyz.quaver.pupil.R
+import xyz.quaver.pupil.util.byteToString
+
+@SuppressLint("InflateParams")
+class DownloadLocationDialog(context: Context) : AlertDialog(context) {
+
+ private val preference = PreferenceManager.getDefaultSharedPreferences(context)
+ private val buttons = mutableListOf()
+ var onDownloadLocationChangedListener : ((Int) -> (Unit))? = null
+
+ init {
+ val view = layoutInflater.inflate(R.layout.dialog_dl_location, null) as LinearLayout
+
+ ContextCompat.getExternalFilesDirs(context, null).forEachIndexed { index, dir ->
+
+ dir ?: return@forEachIndexed
+
+ view.addView(layoutInflater.inflate(R.layout.item_dl_location, view, false).apply {
+ location_type.text = context.getString(when (index) {
+ 0 -> R.string.settings_dl_location_internal
+ else -> R.string.settings_dl_location_removable
+ })
+ location_available.text = context.getString(
+ R.string.settings_dl_location_available,
+ byteToString(dir.freeSpace)
+ )
+ setOnClickListener {
+ buttons.forEach { button ->
+ button.isChecked = false
+ }
+ button.performClick()
+ onDownloadLocationChangedListener?.invoke(index)
+ }
+ buttons.add(button)
+ })
+ }
+
+ buttons[preference.getInt("dl_location", 0)].isChecked = true
+
+ setTitle(R.string.settings_dl_location)
+
+ setView(view)
+
+ setButton(Dialog.BUTTON_POSITIVE, context.getText(android.R.string.ok)) { _, _ ->
+ dismiss()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt
similarity index 97%
rename from app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt
rename to app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt
index aa02bbea..8896a4f8 100644
--- a/app/src/main/java/xyz/quaver/pupil/ui/GalleryDialog.kt
+++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt
@@ -1,6 +1,6 @@
/*
* Pupil, Hitomi.la viewer for Android
- * Copyright (C) 2019 tom5079
+ * Copyright (C) 2020 tom5079
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package xyz.quaver.pupil.ui
+package xyz.quaver.pupil.ui.dialog
import android.app.Dialog
import android.content.Context
@@ -46,6 +46,7 @@ import xyz.quaver.pupil.R
import xyz.quaver.pupil.adapters.GalleryBlockAdapter
import xyz.quaver.pupil.adapters.ThumbnailAdapter
import xyz.quaver.pupil.types.Tag
+import xyz.quaver.pupil.ui.ReaderActivity
import xyz.quaver.pupil.util.ItemClickSupport
import xyz.quaver.pupil.util.wordCapitalize
@@ -256,7 +257,10 @@ class GalleryDialog(context: Context, private val galleryID: Int) : Dialog(conte
(context.applicationContext as Pupil).histories.add(galleries[position].first.id)
}
.setOnItemLongClickListener { _, position, _ ->
- GalleryDialog(context, galleries[position].first.id).apply {
+ GalleryDialog(
+ context,
+ galleries[position].first.id
+ ).apply {
onChipClickedHandler.add { tag ->
this@GalleryDialog.onChipClickedHandler.forEach { it.invoke(tag) }
}
diff --git a/app/src/main/java/xyz/quaver/pupil/util/misc.kt b/app/src/main/java/xyz/quaver/pupil/util/misc.kt
index 05deb0fc..87b38bb6 100644
--- a/app/src/main/java/xyz/quaver/pupil/util/misc.kt
+++ b/app/src/main/java/xyz/quaver/pupil/util/misc.kt
@@ -24,6 +24,7 @@ import android.os.Build
import androidx.core.content.ContextCompat
import java.util.*
import kotlin.collections.ArrayList
+import kotlin.math.round
//Android Q+ uses scoped storage thus not requiring permission
fun Context.hasPermission(permission: String) =
@@ -37,4 +38,33 @@ fun String.wordCapitalize() : String {
result.add(word.capitalize(Locale.getDefault()))
return result.joinToString(" ")
+}
+
+
+//https://discuss.kotlinlang.org/t/how-do-you-round-a-number-to-n-decimal-places/8843(fvasco)
+fun Double.round(decimals: Int): Double {
+ var multiplier = 1.0
+ repeat(decimals) { multiplier *= 10 }
+ return round(this * multiplier) / multiplier
+}
+
+fun byteToString(byte: Long, precision : Int = 1) : String {
+
+ val suffix = listOf(
+ "B",
+ "kB",
+ "MB",
+ "GB",
+ "TB" //really?
+ )
+ var size = byte.toDouble()
+ var suffixIndex = 0
+
+ while (size >= 1024) {
+ size /= 1024
+ suffixIndex++
+ }
+
+ return "${size.round(precision)} ${suffix[suffixIndex]}"
+
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_dl_location.xml b/app/src/main/res/layout/dialog_dl_location.xml
new file mode 100644
index 00000000..fde6c7d9
--- /dev/null
+++ b/app/src/main/res/layout/dialog_dl_location.xml
@@ -0,0 +1,25 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_dl_location.xml b/app/src/main/res/layout/item_dl_location.xml
new file mode 100644
index 00000000..50335e91
--- /dev/null
+++ b/app/src/main/res/layout/item_dl_location.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index f161508d..066bfaa1 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -9,7 +9,7 @@
ギャラリー検索
キャッシュクリア
キャッシュをクリアするとイメージのロード速度に影響を与えます。実行しますか?
- サイズ: %1$d%2$s
+ サイズ: %s
デフォルトキーワード
一回にロードするギャラリー数
検索設定
@@ -111,4 +111,7 @@
復元に失敗しました
%1$d項目を復元しました
ダウンロード場所
+ 内部ストレージ
+ 外部SDカード
+ %s 使用可能
\ No newline at end of file
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 03d91747..7085b22c 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -8,7 +8,7 @@
기본 검색어
캐시 정리하기
캐시를 정리하면 이미지 로딩속도가 느려질 수 있습니다. 계속하시겠습니까?
- 사용량: %1$d%2$s
+ 사용량: %s
한 번에 로드할 갤러리 수
검색 설정
설정
@@ -111,4 +111,7 @@
복원에 실패했습니다
%1$d개 항목을 복원했습니다
다운로드 위치
+ 내부 저장공간
+ 외부 SD카드
+ %s 사용 가능
\ 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 47d7b3b6..305bcc6d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -123,13 +123,16 @@
Storage
Clear cache
Deleting cache can affect image loading speed. Do you want to continue?
- Currently using %1$d%2$s
+ Currently using %s
Clear downloads
Delete all downloaded galleries.\nDo you want to continue?
Clear history
Do you want to clear histories?
%1$d histories saved
Download directory
+ Removable Storage
+ Internal Storage
+ %s available
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 5730bbfa..4cf82f4e 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -20,7 +20,7 @@
+ app:useSimpleSummaryProvider="true"/>