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"/>