Skip to content

Commit 65c8ed8

Browse files
committed
perform file IO relative to shared documents dir
1 parent 33bb89c commit 65c8ed8

File tree

3 files changed

+56
-33
lines changed

3 files changed

+56
-33
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
88
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
99
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
10-
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>
10+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1111

1212
<application
1313
android:allowBackup="true"

app/src/main/java/replete/Main.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,15 @@ class MainActivity : AppCompatActivity() {
131131
}
132132
}
133133

134-
private fun toAbsolutePath(path: String): File {
135-
return filesDir.resolve(if (path.startsWith("/")) path.drop(1) else path)
134+
private fun toAbsolutePath(path: String): File? {
135+
return if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
136+
val rpath = if (path.startsWith("/")) path.drop(1) else path
137+
val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
138+
dir.mkdirs()
139+
dir.resolve(rpath)
140+
} else {
141+
null
142+
}
136143
}
137144

138145
private var selectedPosition = -1

app/src/main/java/replete/VMHandler.kt

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package replete
22

33
import android.os.*
44
import com.eclipsesource.v8.*
5+
import com.eclipsesource.v8.utils.V8Runnable
56
import java.io.*
67
import java.lang.StringBuilder
78
import java.net.HttpURLConnection
@@ -41,7 +42,7 @@ class VMHandler(
4142
val mainLooper: Looper,
4243
val sendUIMessage: (Messages, Any?) -> Unit,
4344
val bundleGetContents: (String) -> String?,
44-
val toAbsolutePath: (String) -> File
45+
val toAbsolutePath: (String) -> File?
4546
) : Handler(mainLooper) {
4647
var vm: V8? = null
4748

@@ -501,19 +502,25 @@ class VMHandler(
501502

502503
private val repleteIsDirectory = JavaCallback { receiver, params ->
503504
if (params.length() == 1) {
504-
val path = params.getString(0)
505-
return@JavaCallback toAbsolutePath(path).isDirectory
505+
val path = toAbsolutePath(params.getString(0))
506+
507+
if (path != null) {
508+
return@JavaCallback path.isDirectory
509+
} else {
510+
return@JavaCallback V8.getUndefined()
511+
}
512+
506513
} else {
507514
return@JavaCallback V8.getUndefined()
508515
}
509516
}
510517

511518
private val repleteListFiles = JavaCallback { receiver, params ->
512519
if (params.length() == 1) {
513-
val path = params.getString(0)
520+
val path = toAbsolutePath(params.getString(0))
514521
val ret = V8Array(vm)
515522

516-
toAbsolutePath(path).list().forEach { p -> ret.push(p.toString()) }
523+
path?.list()?.forEach { p -> ret.push(p.toString()) }
517524

518525
return@JavaCallback ret
519526
} else {
@@ -526,7 +533,7 @@ class VMHandler(
526533
val path = params.getString(0)
527534

528535
try {
529-
toAbsolutePath(path).delete()
536+
toAbsolutePath(path)?.delete()
530537
} catch (e: IOException) {
531538
sendUIMessage(Messages.ADD_ERROR_ITEM, e.toString())
532539
}
@@ -539,19 +546,20 @@ class VMHandler(
539546
if (params.length() == 2) {
540547
val fromPath = params.getString(0)
541548
val toPath = params.getString(1)
542-
val fromStream = toAbsolutePath(fromPath).inputStream()
543-
val toStream = toAbsolutePath(toPath).outputStream()
549+
val fromStream = toAbsolutePath(fromPath)?.inputStream()
550+
val toStream = toAbsolutePath(toPath)?.outputStream()
544551

545-
try {
546-
fromStream.copyTo(toStream)
547-
fromStream.close()
548-
toStream.close()
549-
} catch (e: IOException) {
550-
fromStream.close()
551-
toStream.close()
552-
sendUIMessage(Messages.ADD_ERROR_ITEM, e.toString())
552+
if (fromStream != null && toStream != null) {
553+
try {
554+
fromStream.copyTo(toStream)
555+
fromStream.close()
556+
toStream.close()
557+
} catch (e: IOException) {
558+
fromStream.close()
559+
toStream.close()
560+
sendUIMessage(Messages.ADD_ERROR_ITEM, e.toString())
561+
}
553562
}
554-
555563
}
556564
return@JavaCallback V8.getUndefined()
557565
}
@@ -562,7 +570,7 @@ class VMHandler(
562570
val absPath = toAbsolutePath(path)
563571

564572
try {
565-
if (!absPath.exists()) {
573+
if (absPath != null && !absPath.exists()) {
566574
absPath.mkdirs()
567575
}
568576
} catch (e: Exception) {
@@ -644,14 +652,13 @@ class VMHandler(
644652
if (params.length() == 1) {
645653
val path = params.getString(0)
646654
val item = toAbsolutePath(path)
647-
648-
val itemType = if (item.isFile) "file" else if (item.isDirectory) "directory" else "unknown"
649-
650655
val ret = V8Object(vm)
651656

652-
ret.add("type", itemType)
653-
ret.add("modified", item.lastModified().toDouble())
654-
657+
if (item != null) {
658+
val itemType = if (item.isFile) "file" else if (item.isDirectory) "directory" else "unknown"
659+
ret.add("type", itemType)
660+
ret.add("modified", item.lastModified().toDouble())
661+
}
655662

656663
return@JavaCallback ret
657664
} else {
@@ -678,7 +685,6 @@ class VMHandler(
678685

679686
openWriteFiles[path] =
680687
FileOutputStream(toAbsolutePath(path), append).writer(Charsets.UTF_8)
681-
682688
return@JavaCallback path
683689
} else {
684690
return@JavaCallback "0"
@@ -738,9 +744,15 @@ class VMHandler(
738744
private val repleteFileInputStreamOpen = JavaCallback { receiver, params ->
739745
if (params.length() == 1) {
740746
val path = params.getString(0)
741-
openInputStreams[path] = toAbsolutePath(path).inputStream()
747+
val apath = toAbsolutePath(path)
748+
749+
if (apath != null) {
750+
openInputStreams[path] = apath.inputStream()
751+
return@JavaCallback path
752+
} else {
753+
return@JavaCallback "0"
754+
}
742755

743-
return@JavaCallback path
744756
} else {
745757
return@JavaCallback "0"
746758
}
@@ -782,11 +794,15 @@ class VMHandler(
782794
private val repleteFileReaderOpen = JavaCallback { receiver, params ->
783795
if (params.length() == 2) {
784796
val path = params.getString(0)
797+
val apath = toAbsolutePath(path)
785798
val encoding = params.getString(1)
786799

787-
openReadFiles[path] = toAbsolutePath(path).inputStream().reader(Charsets.UTF_8)
788-
789-
return@JavaCallback path
800+
if (apath != null) {
801+
openReadFiles[path] = apath.inputStream().reader(Charsets.UTF_8)
802+
return@JavaCallback path
803+
} else {
804+
return@JavaCallback "0"
805+
}
790806
} else {
791807
return@JavaCallback "0"
792808
}

0 commit comments

Comments
 (0)