mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Fix backup on A13 (#280)
This commit is contained in:
parent
0073ad8c81
commit
5f1e790163
3 changed files with 62 additions and 54 deletions
|
@ -4,6 +4,7 @@ import android.content.ComponentName
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.lagradost.cloudstream3.utils
|
package com.lagradost.cloudstream3.utils
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
@ -74,7 +75,7 @@ object BackupUtils {
|
||||||
return !nonTransferableKeys.contains(this)
|
return !nonTransferableKeys.contains(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
var restoreFileSelector: ActivityResultLauncher<Array<String>>? = null
|
private var restoreFileSelector: ActivityResultLauncher<Array<String>>? = null
|
||||||
|
|
||||||
// Kinda hack, but I couldn't think of a better way
|
// Kinda hack, but I couldn't think of a better way
|
||||||
data class BackupVars(
|
data class BackupVars(
|
||||||
|
@ -91,6 +92,7 @@ object BackupUtils {
|
||||||
@JsonProperty("settings") val settings: BackupVars
|
@JsonProperty("settings") val settings: BackupVars
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun Context.getBackup(): BackupFile {
|
fun Context.getBackup(): BackupFile {
|
||||||
val allData = getSharedPrefs().all.filter { it.key.isTransferable() }
|
val allData = getSharedPrefs().all.filter { it.key.isTransferable() }
|
||||||
val allSettings = getDefaultSharedPrefs().all.filter { it.key.isTransferable() }
|
val allSettings = getDefaultSharedPrefs().all.filter { it.key.isTransferable() }
|
||||||
|
@ -143,64 +145,66 @@ object BackupUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SimpleDateFormat")
|
||||||
fun FragmentActivity.backup() {
|
fun FragmentActivity.backup() {
|
||||||
try {
|
try {
|
||||||
if (checkWrite()) {
|
if (!checkWrite()) {
|
||||||
val subDir = getBasePath().first
|
|
||||||
val date = SimpleDateFormat("yyyy_MM_dd_HH_mm").format(Date(currentTimeMillis()))
|
|
||||||
val ext = "json"
|
|
||||||
val displayName = "CS3_Backup_${date}"
|
|
||||||
val backupFile = getBackup()
|
|
||||||
|
|
||||||
val steam =
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && subDir?.isDownloadDir() == true) {
|
|
||||||
val cr = this.contentResolver
|
|
||||||
val contentUri =
|
|
||||||
MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) // USE INSTEAD OF MediaStore.Downloads.EXTERNAL_CONTENT_URI
|
|
||||||
//val currentMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
|
|
||||||
|
|
||||||
val newFile = ContentValues().apply {
|
|
||||||
put(MediaStore.MediaColumns.DISPLAY_NAME, displayName)
|
|
||||||
put(MediaStore.MediaColumns.TITLE, displayName)
|
|
||||||
// While it a json file we store as txt because not
|
|
||||||
// all file managers support mimetype json
|
|
||||||
put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")
|
|
||||||
//put(MediaStore.MediaColumns.RELATIVE_PATH, folder)
|
|
||||||
}
|
|
||||||
|
|
||||||
val newFileUri = cr.insert(
|
|
||||||
contentUri,
|
|
||||||
newFile
|
|
||||||
) ?: throw IOException("Error creating file uri")
|
|
||||||
cr.openOutputStream(newFileUri, "w")
|
|
||||||
?: throw IOException("Error opening stream")
|
|
||||||
} else {
|
|
||||||
val fileName = "$displayName.$ext"
|
|
||||||
val rFile = subDir?.findFile(fileName)
|
|
||||||
if (rFile?.exists() == true) {
|
|
||||||
rFile.delete()
|
|
||||||
}
|
|
||||||
val file =
|
|
||||||
subDir?.createFile(fileName)
|
|
||||||
?: throw IOException("Error creating file")
|
|
||||||
if (!file.exists()) throw IOException("File does not exist")
|
|
||||||
file.openOutputStream()
|
|
||||||
}
|
|
||||||
|
|
||||||
val printStream = PrintWriter(steam)
|
|
||||||
printStream.print(mapper.writeValueAsString(backupFile))
|
|
||||||
printStream.close()
|
|
||||||
|
|
||||||
showToast(
|
|
||||||
this,
|
|
||||||
R.string.backup_success,
|
|
||||||
Toast.LENGTH_LONG
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
showToast(this, getString(R.string.backup_failed), Toast.LENGTH_LONG)
|
showToast(this, getString(R.string.backup_failed), Toast.LENGTH_LONG)
|
||||||
requestRW()
|
requestRW()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val subDir = getBasePath().first
|
||||||
|
val date = SimpleDateFormat("yyyy_MM_dd_HH_mm").format(Date(currentTimeMillis()))
|
||||||
|
val ext = "json"
|
||||||
|
val displayName = "CS3_Backup_${date}"
|
||||||
|
val backupFile = getBackup()
|
||||||
|
|
||||||
|
val steam = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
|
&& subDir?.isDownloadDir() == true
|
||||||
|
) {
|
||||||
|
val cr = this.contentResolver
|
||||||
|
val contentUri =
|
||||||
|
MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) // USE INSTEAD OF MediaStore.Downloads.EXTERNAL_CONTENT_URI
|
||||||
|
//val currentMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
|
||||||
|
|
||||||
|
val newFile = ContentValues().apply {
|
||||||
|
put(MediaStore.MediaColumns.DISPLAY_NAME, displayName)
|
||||||
|
put(MediaStore.MediaColumns.TITLE, displayName)
|
||||||
|
// While it a json file we store as txt because not
|
||||||
|
// all file managers support mimetype json
|
||||||
|
put(MediaStore.MediaColumns.MIME_TYPE, "text/plain")
|
||||||
|
//put(MediaStore.MediaColumns.RELATIVE_PATH, folder)
|
||||||
|
}
|
||||||
|
|
||||||
|
val newFileUri = cr.insert(
|
||||||
|
contentUri,
|
||||||
|
newFile
|
||||||
|
) ?: throw IOException("Error creating file uri")
|
||||||
|
cr.openOutputStream(newFileUri, "w")
|
||||||
|
?: throw IOException("Error opening stream")
|
||||||
|
} else {
|
||||||
|
val fileName = "$displayName.$ext"
|
||||||
|
val rFile = subDir?.findFile(fileName)
|
||||||
|
if (rFile?.exists() == true) {
|
||||||
|
rFile.delete()
|
||||||
|
}
|
||||||
|
val file =
|
||||||
|
subDir?.createFile(fileName)
|
||||||
|
?: throw IOException("Error creating file")
|
||||||
|
if (!file.exists()) throw IOException("File does not exist")
|
||||||
|
file.openOutputStream()
|
||||||
|
}
|
||||||
|
|
||||||
|
val printStream = PrintWriter(steam)
|
||||||
|
printStream.print(mapper.writeValueAsString(backupFile))
|
||||||
|
printStream.close()
|
||||||
|
|
||||||
|
showToast(
|
||||||
|
this,
|
||||||
|
R.string.backup_success,
|
||||||
|
Toast.LENGTH_LONG
|
||||||
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logError(e)
|
logError(e)
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -57,7 +57,10 @@ object UIHelper {
|
||||||
this,
|
this,
|
||||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||||
)
|
)
|
||||||
== PackageManager.PERMISSION_GRANTED)
|
== PackageManager.PERMISSION_GRANTED
|
||||||
|
// Since Android 13, we can't request external storage permission,
|
||||||
|
// so don't check it.
|
||||||
|
|| Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Activity.requestRW() {
|
fun Activity.requestRW() {
|
||||||
|
|
Loading…
Reference in a new issue