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