Pupil-24 Absence of backing up favorites feature
This commit is contained in:
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,18 @@
|
||||
android:theme="@style/AppTheme"
|
||||
tools:replace="android:theme">
|
||||
|
||||
<provider
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true">
|
||||
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths"/>
|
||||
|
||||
</provider>
|
||||
|
||||
<activity android:name=".ui.LockActivity"/>
|
||||
<activity
|
||||
android:name=".ui.ReaderActivity"
|
||||
|
||||
@@ -338,7 +338,7 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri
|
||||
|
||||
holder.view.galleryblock_download.text = when(GalleryDownloader.get(gallery.first.id)) {
|
||||
null -> 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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Preference>("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<Preference>("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<Preference>("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<Int>(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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
@@ -105,4 +105,10 @@
|
||||
<string name="main_delete">削除</string>
|
||||
<string name="main_download">ダウンロード</string>
|
||||
<string name="main_cancel_download">キャンセル</string>
|
||||
<string name="settings_backup_title">お気に入りバックアップ</string>
|
||||
<string name="settings_restore_title">お気に入り復元</string>
|
||||
<string name="settings_backup_snackbar">バックアップファイルを作成しました</string>
|
||||
<string name="settings_backup_checkout">確認</string>
|
||||
<string name="settings_restore_failed">復元に失敗しました</string>
|
||||
<string name="settings_restore_successful">%1$d項目を復元しました</string>
|
||||
</resources>
|
||||
@@ -105,4 +105,10 @@
|
||||
<string name="main_delete">삭제</string>
|
||||
<string name="main_download">다운로드</string>
|
||||
<string name="main_cancel_download">취소</string>
|
||||
<string name="settings_backup_title">즐겨찾기 백업</string>
|
||||
<string name="settings_restore_title">즐겨찾기 복원</string>
|
||||
<string name="settings_backup_snackbar">백업 파일을 생성하였습니다</string>
|
||||
<string name="settings_backup_checkout">확인</string>
|
||||
<string name="settings_restore_failed">복원에 실패했습니다</string>
|
||||
<string name="settings_restore_successful">%1$d개 항목을 복원했습니다</string>
|
||||
</resources>
|
||||
@@ -72,7 +72,6 @@
|
||||
<string name="main_export_error">Error occurred during export</string>
|
||||
|
||||
<string name="main_download">DOWNLOAD</string>
|
||||
<string name="main_cancel_download">CANCEL</string>
|
||||
<string name="main_delete">DELETE</string>
|
||||
|
||||
<string name="update_title">Update available</string>
|
||||
@@ -133,6 +132,12 @@
|
||||
<string name="settings_dark_mode_summary">Protect yourself against light attacks!</string>
|
||||
<string name="settings_nomedia_title">Hide image from gallery</string>
|
||||
<string name="settings_nomedia_summary">Hides image from gallery</string>
|
||||
<string name="settings_backup_title">Backup favorites</string>
|
||||
<string name="settings_backup_snackbar">Backup file created</string>
|
||||
<string name="settings_backup_checkout">Check out</string>
|
||||
<string name="settings_restore_title">Restore favorites</string>
|
||||
<string name="settings_restore_failed">Restore failed</string>
|
||||
<string name="settings_restore_successful">%1$d entries restored</string>
|
||||
|
||||
<string name="settings_lock_none">None</string>
|
||||
<string name="settings_lock_pattern">Pattern</string>
|
||||
|
||||
22
app/src/main/res/xml/file_paths.xml
Normal file
22
app/src/main/res/xml/file_paths.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Pupil, Hitomi.la viewer for Android
|
||||
~ Copyright (C) 2019 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 <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<external-path name="external" path="/"/>
|
||||
</paths>
|
||||
@@ -74,6 +74,14 @@
|
||||
app:title="@string/settings_nomedia_title"
|
||||
app:summary="@string/settings_nomedia_title"/>
|
||||
|
||||
<Preference
|
||||
app:key="backup"
|
||||
app:title="@string/settings_backup_title"/>
|
||||
|
||||
<Preference
|
||||
app:key="restore"
|
||||
app:title="@string/settings_restore_title"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
</androidx.preference.PreferenceScreen>
|
||||
|
||||
Reference in New Issue
Block a user