diff --git a/app/build.gradle b/app/build.gradle index be2fd917..56855fab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ dependencies { implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation "androidx.biometric:biometric:1.0.1" + implementation "androidx.documentfile:documentfile:1.0.1" implementation 'com.android.support:multidex:1.0.3' implementation "com.daimajia.swipelayout:library:1.2.0@aar" implementation 'com.google.android.material:material:1.2.0-alpha04' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 09fe339b..e363d1e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,9 +6,7 @@ - + { if (resultCode == Activity.RESULT_OK) { data?.data?.also { uri -> - val takeFlags: Int = intent.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - contentResolver.takePersistableUriPermission(uri, takeFlags) + contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) if (DocumentFile.fromTreeUri(this, uri)?.canWrite() == false) Snackbar.make(settings, R.string.settings_dl_location_not_writable, Snackbar.LENGTH_LONG).show() 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 index d6c2b8b1..9542b981 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialog.kt @@ -37,6 +37,7 @@ import xyz.quaver.pupil.R import xyz.quaver.pupil.util.REQUEST_DOWNLOAD_FOLDER import xyz.quaver.pupil.util.REQUEST_DOWNLOAD_FOLDER_OLD import xyz.quaver.pupil.util.byteToString +import xyz.quaver.pupil.util.getDownloadDirectory @SuppressLint("InflateParams") class DownloadLocationDialog(val activity: Activity) : AlertDialog(activity) { @@ -106,9 +107,9 @@ class DownloadLocationDialog(val activity: Activity) : AlertDialog(activity) { buttons.add(button to null) }) - val pref = Uri.parse(preference.getString("dl_location", null)) + val pref = getDownloadDirectory(context) val index = externalFilesDirs.indexOfFirst { - Uri.fromFile(it).toString() == pref.toString() + Uri.fromFile(it).toString() == pref.uri.toString() } if (index < 0) diff --git a/app/src/main/java/xyz/quaver/pupil/util/ConstValues.kt b/app/src/main/java/xyz/quaver/pupil/util/ConstValues.kt index 807c1379..57cbf9c9 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/ConstValues.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/ConstValues.kt @@ -21,4 +21,5 @@ package xyz.quaver.pupil.util const val REQUEST_LOCK = 38238 const val REQUEST_RESTORE = 16546 const val REQUEST_DOWNLOAD_FOLDER = 3874 -const val REQUEST_DOWNLOAD_FOLDER_OLD = 3425 \ No newline at end of file +const val REQUEST_DOWNLOAD_FOLDER_OLD = 3425 +const val REQUEST_DOWNLOAD_FOLDER_AND_PERMISSION = 34257 \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt index 0224c36d..ff103c63 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/Cache.kt @@ -207,10 +207,7 @@ class Cache(context: Context) : ContextWrapper(context) { throw IllegalArgumentException("File name is not a number") cache.let { - if (it.findFile(name) != null) - it - else - it.createFile("null", name) + it.findFile(name) ?: it.createFile("null", name) }?.writeBytes(this, data) } @@ -221,11 +218,14 @@ class Cache(context: Context) : ContextWrapper(context) { val download = getDownloadDirectory(this) if (!download.isParentOf(cache)) { + val target = getDownloadDirectory(this).let { + it.findFile(galleryID.toString()) ?: it.createDirectory(galleryID.toString()) + } + cache.copyRecursively(this, download) cache.deleteRecursively() } - } else - getDownloadDirectory(this).createDirectory(galleryID.toString()) + } } fun isDownloading(galleryID: Int) = getCachedMetadata(galleryID)?.isDownloading == true diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index 647571b3..fa0cd5f0 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -23,6 +23,7 @@ import android.content.Context import android.content.ContextWrapper import android.content.Intent import android.content.SharedPreferences +import android.util.Log import android.util.SparseArray import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -152,12 +153,6 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont val request = chain.request() var response = chain.proceed(request) - var retry = preferences.getInt("retry", 3) - while (!response.isSuccessful && retry > 0) { - response = chain.proceed(request) - retry-- - } - response.newBuilder() .body(ProgressResponseBody(request.tag(), response.body(), progressListener)) .build() @@ -288,6 +283,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont for (i in reader.galleryInfo.indices) { val callback = object : Callback { override fun onFailure(call: Call, e: IOException) { + Log.i("PUPILD", "FAILED $i") if (Fabric.isInitialized()) Crashlytics.logException(e) @@ -307,6 +303,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont } override fun onResponse(call: Call, response: Response) { + Log.i("PUPILD", "SUCCESS $i") response.body().use { val res = it.bytes() val ext = 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 a27629c0..8cf67847 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/file.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/file.kt @@ -33,17 +33,22 @@ fun getCachedGallery(context: Context, galleryID: Int) = DocumentFile.fromFile(File(context.cacheDir, "imageCache/$galleryID")) fun getDownloadDirectory(context: Context) : DocumentFile { - val uri = PreferenceManager.getDefaultSharedPreferences(context).getString("dl_location", null).let { + return runCatching { + val uri = PreferenceManager.getDefaultSharedPreferences(context).getString("dl_location", null).let { if (it != null) Uri.parse(it) else Uri.fromFile(context.getExternalFilesDir(null)) - } + } - return if (uri.toString().startsWith("file")) - DocumentFile.fromFile(File(uri.path!!)) - else - DocumentFile.fromTreeUri(context, uri) ?: DocumentFile.fromFile(context.getExternalFilesDir(null)!!) + if (uri.toString().startsWith("file")) + DocumentFile.fromFile(File(uri.path!!)) + else + DocumentFile.fromTreeUri(context, uri) ?: DocumentFile.fromFile(context.getExternalFilesDir(null)!!) + }.getOrElse { + PreferenceManager.getDefaultSharedPreferences(context).edit().remove("dl_location").apply() + DocumentFile.fromFile(context.getExternalFilesDir(null)!!) + } } fun convertUpdateUri(context: Context, uri: Uri) : Uri = @@ -104,32 +109,26 @@ fun DocumentFile.copyRecursively( if (!exists()) throw Exception("The source file doesn't exist.") - if (this.isFile) { - target.let { - if (it.findFile(name!!) != null) - it - else - createFile("null", name!!)!! - }.writeBytes( - context, - readBytes(context) - ) - } else if (this.isDirectory) { - target.createDirectory(name!!).also { newTarget -> - listFiles().forEach { child -> - child.copyRecursively(context, newTarget!!) + this.listFiles().forEach { child -> + try { + if (child.isFile) { + target.findFile(name!!) ?: target.createFile("null", name!!)!! + .writeBytes( + context, + readBytes(context) + ) + } else if (child.isDirectory) { + target.findFile(name!!) ?: target.createDirectory(name!!).also { newTarget -> + child.copyRecursively(context, newTarget!!) + } } + } catch (e: Exception) { + e.printStackTrace() } } } fun DocumentFile.deleteRecursively() { - - if (this.isDirectory) - listFiles().forEach { - it.deleteRecursively() - } - this.delete() } diff --git a/app/src/main/java/xyz/quaver/pupil/util/saf/DocumentFileX.kt b/app/src/main/java/xyz/quaver/pupil/util/saf/DocumentFileX.kt index 776c4ea3..385515fa 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/saf/DocumentFileX.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/saf/DocumentFileX.kt @@ -28,7 +28,6 @@ abstract class DocumentFileX { abstract fun createDirectory(displayName: String): DocumentFileX? abstract fun getUri(): Uri abstract fun getName(): String - abstract fun getParentFile(): DocumentFileX? abstract fun isDirectory(): Boolean abstract fun isFile(): Boolean abstract fun length(): Long diff --git a/app/src/main/java/xyz/quaver/pupil/util/saf/RawDocumentFileX.kt b/app/src/main/java/xyz/quaver/pupil/util/saf/RawDocumentFileX.kt index fa8d754e..030487de 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/saf/RawDocumentFileX.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/saf/RawDocumentFileX.kt @@ -45,7 +45,7 @@ class RawDocumentFileX(private var file: File) : DocumentFileX() { override fun getName() = file.name - override fun getParentFile() = + fun getParentFile() = file.parentFile.let { if (it == null) null diff --git a/app/src/main/java/xyz/quaver/pupil/util/saf/TreeDocumentFileX.kt b/app/src/main/java/xyz/quaver/pupil/util/saf/TreeDocumentFileX.kt index 08978165..b8f1e209 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/saf/TreeDocumentFileX.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/saf/TreeDocumentFileX.kt @@ -73,21 +73,25 @@ class TreeDocumentFileX( val uri = kotlin.runCatching { DocumentsContract.createDocument(context.contentResolver, uri, "null", displayName) }.getOrNull() ?: return null + + return TreeDocumentFileX(context, uri, displayName, DocumentsContract.getDocumentId(uri), 0) } override fun getUri() = uri override fun getName() = name ?: "null" - override fun getParentFile(): DocumentFileX? - override fun isDirectory() = name?.contains('.') == false override fun isFile() = name?.contains('.') == true override fun length() = length ?: -1 - override fun canRead(): Boolean - override fun canWrite(): Boolean + override fun canRead(): Boolean { + TODO("Not impelmented") + } + override fun canWrite(): Boolean { + TODO("Not impelmented") + } override fun delete() = kotlin.runCatching { @@ -111,8 +115,12 @@ class TreeDocumentFileX( ).use { } + + TODO("Not impelmented") } - override fun findFile(displayName: String): DocumentFileX? + override fun findFile(displayName: String): DocumentFileX? { + TODO("Not impelmented") + } } \ No newline at end of file