v1.0.56: allow root folder selection + MANAGE_EXTERNAL_STORAGE prompt
Remove root folder block from the browser — user can now select /storage/emulated/0 exactly like Autosync. If MANAGE_EXTERNAL_STORAGE is not granted a red banner appears with a direct "Grant" button that opens the Android All files access settings screen. Root guard removed from SyncEngine; individual file failures (e.g. root-level writes) are already caught and logged per-file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -34,17 +34,6 @@ class SyncEngine @Inject constructor(
|
||||
@ApplicationContext private val context: Context,
|
||||
) {
|
||||
suspend fun sync(pair: SyncPair, provider: CloudProvider): SyncResult {
|
||||
if (!pair.localPath.startsWith("content://") &&
|
||||
pair.syncDirection != SyncDirection.UPLOAD_ONLY) {
|
||||
val canonical = runCatching { File(pair.localPath).canonicalPath }.getOrElse { pair.localPath }
|
||||
if (canonical == "/storage/emulated/0") {
|
||||
val msg = "Local folder is the storage root — Android blocks writes here. Use Upload Only direction, or select a subfolder."
|
||||
syncPairDao.updateSyncResult(pair.id, Instant.now(), SyncStatus.FAILED, 0)
|
||||
logEvent(pair.id, SyncEventType.SYNC_FAILED, null, msg, 0)
|
||||
return SyncResult(failedFiles = 1, error = Exception(msg))
|
||||
}
|
||||
}
|
||||
|
||||
syncPairDao.updateStatus(pair.id, SyncStatus.SYNCING)
|
||||
logEvent(pair.id, SyncEventType.SYNC_STARTED, null, null, 0)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user