From f98f45dc54338bb717e44dc6db2154197b2e1cd7 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 1 Dec 2019 16:58:29 +0900 Subject: [PATCH] Pupil-24 Absence of backing up favorites feature --- .../quaver/pupil/ExampleInstrumentedTest.kt | 6 +- app/src/main/AndroidManifest.xml | 12 +++ .../pupil/adapters/GalleryBlockAdapter.kt | 2 +- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 90 ++++++++++++++++++- .../main/java/xyz/quaver/pupil/util/file.kt | 4 +- app/src/main/res/values-ja/strings.xml | 6 ++ app/src/main/res/values-ko/strings.xml | 6 ++ app/src/main/res/values/strings.xml | 7 +- app/src/main/res/xml/file_paths.xml | 22 +++++ app/src/main/res/xml/root_preferences.xml | 8 ++ 10 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/xml/file_paths.xml diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt index 6d23423b..4f3ce3c8 100644 --- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt @@ -33,6 +33,7 @@ import xyz.quaver.hiyobi.createImgList import xyz.quaver.hiyobi.getReader import xyz.quaver.hiyobi.user_agent import xyz.quaver.pupil.ui.LockActivity +import xyz.quaver.pupil.util.getDownloadDirectory import java.net.URL import javax.net.ssl.HttpsURLConnection @@ -48,6 +49,7 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext + Log.i("PUPILD", getDownloadDirectory(appContext).absolutePath ?: "") assertEquals("xyz.quaver.pupil", appContext.packageName) } @@ -57,8 +59,6 @@ class ExampleInstrumentedTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext activityTestRule.launchActivity(Intent()) - - while(true); } @Test @@ -76,4 +76,4 @@ class ExampleInstrumentedTest { Log.d("Pupil", data.size.toString()) } -} +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index be11229f..ac068015 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,18 @@ android:theme="@style/AppTheme" tools:replace="android:theme"> + + + + + + holder.view.context.getString(R.string.main_download) - else -> holder.view.context.getString(R.string.main_cancel_download) + else -> holder.view.context.getString(android.R.string.cancel) } } 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 0e28613b..0ecf34c0 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -32,10 +32,16 @@ import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager +import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.dialog_default_query.view.* +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.json.Json +import kotlinx.serialization.parseList import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.types.Tags @@ -43,10 +49,13 @@ import xyz.quaver.pupil.util.Lock import xyz.quaver.pupil.util.LockManager import xyz.quaver.pupil.util.getDownloadDirectory import java.io.File +import java.nio.charset.Charset +import java.util.* class SettingsActivity : AppCompatActivity() { val REQUEST_LOCK = 38238 + val REQUEST_RESTORE = 16546 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -154,7 +163,7 @@ class SettingsActivity : AppCompatActivity() { with(findPreference("delete_downloads")) { this!! - val dir = getDownloadDirectory(context)!! + val dir = getDownloadDirectory(context) summary = getDirSize(dir) @@ -278,7 +287,7 @@ class SettingsActivity : AppCompatActivity() { s ?: return if (s.any { it.isUpperCase() }) - s.replace(0, s.length, s.toString().toLowerCase()) + s.replace(0, s.length, s.toString().toLowerCase(Locale.getDefault())) } }) } @@ -352,6 +361,55 @@ class SettingsActivity : AppCompatActivity() { true } } + + with(findPreference("backup")) { + this!! + + onPreferenceClickListener = Preference.OnPreferenceClickListener { + File(ContextCompat.getDataDir(context), "favorites.json").copyTo( + File(getDownloadDirectory(context), "favorites.json"), + true + ) + + Snackbar.make(this@SettingsFragment.listView, R.string.settings_backup_snackbar, Snackbar.LENGTH_LONG) + .setAction(R.string.settings_backup_checkout) { + + //Open folder that contains copied favorite file + val intent = Intent(Intent.ACTION_VIEW).apply { + val uri = FileProvider.getUriForFile(context, + "xyz.quaver.pupil.fileprovider", + getDownloadDirectory(context) + ) + + context.grantUriPermission(context.packageName, uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + + setDataAndType(uri, "resource/folder") + } + + startActivity(Intent.createChooser(intent , "Open folder")) + + }.show() + + true + } + } + + with(findPreference("restore")) { + this!! + + onPreferenceClickListener = Preference.OnPreferenceClickListener { + val intent = Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "*/*" + } + + activity?.startActivityForResult(intent, (activity as SettingsActivity).REQUEST_RESTORE) + + true + } + } } } @@ -415,6 +473,7 @@ class SettingsActivity : AppCompatActivity() { return true } + @UseExperimental(ImplicitReflectionSerializer::class) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when(requestCode) { REQUEST_LOCK -> { @@ -426,6 +485,33 @@ class SettingsActivity : AppCompatActivity() { .commitAllowingStateLoss() } } + REQUEST_RESTORE -> { + if (resultCode == Activity.RESULT_OK) { + val uri = data?.data ?: return + + try { + val json = contentResolver.openInputStream(uri).use { inputStream -> + inputStream!! + + inputStream.readBytes().toString(Charset.defaultCharset()) + } + + (application as Pupil).favorites.addAll(Json.parseList(json).also { + Snackbar.make( + window.decorView, + getString(R.string.settings_restore_successful, it.size), + Snackbar.LENGTH_LONG + ).show() + }) + } catch (e: Exception) { + Snackbar.make( + window.decorView, + R.string.settings_restore_failed, + Snackbar.LENGTH_LONG + ).show() + } + } + } else -> super.onActivityResult(requestCode, resultCode, data) } } 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 d1f3ba47..84342718 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/file.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/file.kt @@ -33,9 +33,9 @@ fun getCachedGallery(context: Context, galleryID: Int): File { } @Suppress("DEPRECATION") -fun getDownloadDirectory(context: Context): File? { +fun getDownloadDirectory(context: Context): File { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) - context.getExternalFilesDir("Pupil") + context.getExternalFilesDir("Pupil")!! else File(Environment.getExternalStorageDirectory(), "Pupil") } \ 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 4cf3b38f..0c7f4353 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -105,4 +105,10 @@ 削除 ダウンロード キャンセル + お気に入りバックアップ + お気に入り復元 + バックアップファイルを作成しました + 確認 + 復元に失敗しました + %1$d項目を復元しました \ 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 5d8411d1..2965ce52 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -105,4 +105,10 @@ 삭제 다운로드 취소 + 즐겨찾기 백업 + 즐겨찾기 복원 + 백업 파일을 생성하였습니다 + 확인 + 복원에 실패했습니다 + %1$d개 항목을 복원했습니다 \ 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 513ec686..5f695d13 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,7 +72,6 @@ Error occurred during export DOWNLOAD - CANCEL DELETE Update available @@ -133,6 +132,12 @@ Protect yourself against light attacks! Hide image from gallery Hides image from gallery + Backup favorites + Backup file created + Check out + Restore favorites + Restore failed + %1$d entries restored None Pattern diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 00000000..5992f8d4 --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 26738748..244a015f 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -74,6 +74,14 @@ app:title="@string/settings_nomedia_title" app:summary="@string/settings_nomedia_title"/> + + + +