forked from hardcoresushi/DroidFS
Allow importing from ClipData
This commit is contained in:
parent
d1e042c347
commit
bd60e62635
@ -104,17 +104,17 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":libpdfviewer:app")
|
implementation project(":libpdfviewer:app")
|
||||||
implementation 'androidx.core:core-ktx:1.12.0'
|
implementation 'androidx.core:core-ktx:1.13.1'
|
||||||
implementation "androidx.appcompat:appcompat:1.6.1"
|
implementation "androidx.appcompat:appcompat:1.7.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
||||||
def lifecycle_version = "2.6.2"
|
def lifecycle_version = "2.8.1"
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
||||||
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
|
||||||
|
|
||||||
implementation "androidx.sqlite:sqlite-ktx:2.3.1"
|
implementation "androidx.sqlite:sqlite-ktx:2.4.0"
|
||||||
implementation "androidx.preference:preference-ktx:1.2.1"
|
implementation "androidx.preference:preference-ktx:1.2.1"
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||||
implementation 'com.google.android.material:material:1.9.0'
|
implementation 'com.google.android.material:material:1.12.0'
|
||||||
implementation 'com.github.bumptech.glide:glide:4.16.0'
|
implementation 'com.github.bumptech.glide:glide:4.16.0'
|
||||||
implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05"
|
implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05"
|
||||||
|
|
||||||
|
@ -268,6 +268,27 @@ open class BaseExplorerActivity : BaseActivity(), ExplorerElementAdapter.Listene
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun createNewFile(callback: (Long) -> Unit) {
|
||||||
|
EditTextDialog(this, R.string.enter_file_name) {
|
||||||
|
if (it.isEmpty()) {
|
||||||
|
Toast.makeText(this, R.string.error_filename_empty, Toast.LENGTH_SHORT).show()
|
||||||
|
createNewFile(callback)
|
||||||
|
} else {
|
||||||
|
val filePath = PathUtils.pathJoin(currentDirectoryPath, it)
|
||||||
|
val handleID = encryptedVolume.openFileWriteMode(filePath)
|
||||||
|
if (handleID == -1L) {
|
||||||
|
CustomAlertDialogBuilder(this, theme)
|
||||||
|
.setTitle(R.string.error)
|
||||||
|
.setMessage(R.string.file_creation_failed)
|
||||||
|
.setPositiveButton(R.string.ok, null)
|
||||||
|
.show()
|
||||||
|
} else {
|
||||||
|
callback(handleID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.show()
|
||||||
|
}
|
||||||
|
|
||||||
private fun setVolumeNameTitle() {
|
private fun setVolumeNameTitle() {
|
||||||
titleText.text = getString(R.string.volume, volumeName)
|
titleText.text = getString(R.string.volume, volumeName)
|
||||||
}
|
}
|
||||||
|
@ -189,9 +189,11 @@ class ExplorerActivity : BaseExplorerActivity() {
|
|||||||
pickImportDirectory.launch(null)
|
pickImportDirectory.launch(null)
|
||||||
}
|
}
|
||||||
"createFile" -> {
|
"createFile" -> {
|
||||||
EditTextDialog(this, R.string.enter_file_name) {
|
createNewFile {
|
||||||
createNewFile(it)
|
encryptedVolume.closeFile(it)
|
||||||
}.show()
|
setCurrentPath(currentDirectoryPath)
|
||||||
|
invalidateOptionsMenu()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
"createFolder" -> {
|
"createFolder" -> {
|
||||||
openDialogCreateFolder()
|
openDialogCreateFolder()
|
||||||
@ -219,26 +221,6 @@ class ExplorerActivity : BaseExplorerActivity() {
|
|||||||
cancelItemAction()
|
cancelItemAction()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createNewFile(fileName: String){
|
|
||||||
if (fileName.isEmpty()) {
|
|
||||||
Toast.makeText(this, R.string.error_filename_empty, Toast.LENGTH_SHORT).show()
|
|
||||||
} else {
|
|
||||||
val filePath = PathUtils.pathJoin(currentDirectoryPath, fileName)
|
|
||||||
val handleID = encryptedVolume.openFileWriteMode(filePath)
|
|
||||||
if (handleID == -1L) {
|
|
||||||
CustomAlertDialogBuilder(this, theme)
|
|
||||||
.setTitle(R.string.error)
|
|
||||||
.setMessage(R.string.file_creation_failed)
|
|
||||||
.setPositiveButton(R.string.ok, null)
|
|
||||||
.show()
|
|
||||||
} else {
|
|
||||||
encryptedVolume.closeFile(handleID)
|
|
||||||
setCurrentPath(currentDirectoryPath)
|
|
||||||
invalidateOptionsMenu()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
menuInflater.inflate(R.menu.explorer, menu)
|
menuInflater.inflate(R.menu.explorer, menu)
|
||||||
val result = super.onCreateOptionsMenu(menu)
|
val result = super.onCreateOptionsMenu(menu)
|
||||||
|
@ -9,6 +9,8 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
|
|||||||
import sushi.hardcore.droidfs.R
|
import sushi.hardcore.droidfs.R
|
||||||
import sushi.hardcore.droidfs.util.IntentUtils
|
import sushi.hardcore.droidfs.util.IntentUtils
|
||||||
import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder
|
import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder
|
||||||
|
import java.nio.CharBuffer
|
||||||
|
import java.nio.charset.StandardCharsets
|
||||||
|
|
||||||
class ExplorerActivityDrop : BaseExplorerActivity() {
|
class ExplorerActivityDrop : BaseExplorerActivity() {
|
||||||
|
|
||||||
@ -30,15 +32,15 @@ class ExplorerActivityDrop : BaseExplorerActivity() {
|
|||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
R.id.validate -> {
|
R.id.validate -> {
|
||||||
val extras = intent.extras
|
val extras = intent.extras
|
||||||
val errorMsg: String? = if (extras != null && extras.containsKey(Intent.EXTRA_STREAM)) {
|
val success = if (extras != null && extras.containsKey(Intent.EXTRA_STREAM)) {
|
||||||
when (intent.action) {
|
when (intent.action) {
|
||||||
Intent.ACTION_SEND -> {
|
Intent.ACTION_SEND -> {
|
||||||
val uri = IntentUtils.getParcelableExtra<Uri>(intent, Intent.EXTRA_STREAM)
|
val uri = IntentUtils.getParcelableExtra<Uri>(intent, Intent.EXTRA_STREAM)
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
getString(R.string.share_intent_parsing_failed)
|
false
|
||||||
} else {
|
} else {
|
||||||
importFilesFromUris(listOf(uri), ::onImported)
|
importFilesFromUris(listOf(uri), ::onImported)
|
||||||
null
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Intent.ACTION_SEND_MULTIPLE -> {
|
Intent.ACTION_SEND_MULTIPLE -> {
|
||||||
@ -50,20 +52,34 @@ class ExplorerActivityDrop : BaseExplorerActivity() {
|
|||||||
}
|
}
|
||||||
if (uris != null) {
|
if (uris != null) {
|
||||||
importFilesFromUris(uris, ::onImported)
|
importFilesFromUris(uris, ::onImported)
|
||||||
null
|
true
|
||||||
} else {
|
} else {
|
||||||
getString(R.string.share_intent_parsing_failed)
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> getString(R.string.share_intent_parsing_failed)
|
else -> false
|
||||||
}
|
}
|
||||||
|
} else if ((intent.clipData?.itemCount ?: 0) > 0) {
|
||||||
|
val byteBuffer = StandardCharsets.UTF_8.encode(CharBuffer.wrap(intent.clipData!!.getItemAt(0).text))
|
||||||
|
val byteArray = ByteArray(byteBuffer.remaining())
|
||||||
|
byteBuffer.get(byteArray)
|
||||||
|
val size = byteArray.size.toLong()
|
||||||
|
createNewFile {
|
||||||
|
var offset = 0L
|
||||||
|
while (offset < size) {
|
||||||
|
offset += encryptedVolume.write(it, offset, byteArray, offset, size-offset)
|
||||||
|
}
|
||||||
|
encryptedVolume.closeFile(it)
|
||||||
|
onImported()
|
||||||
|
}
|
||||||
|
true
|
||||||
} else {
|
} else {
|
||||||
getString(R.string.share_intent_parsing_failed)
|
false
|
||||||
}
|
}
|
||||||
errorMsg?.let {
|
if (!success) {
|
||||||
CustomAlertDialogBuilder(this, theme)
|
CustomAlertDialogBuilder(this, theme)
|
||||||
.setTitle(R.string.error)
|
.setTitle(R.string.error)
|
||||||
.setMessage(it)
|
.setMessage(R.string.share_intent_parsing_failed)
|
||||||
.setPositiveButton(R.string.ok, null)
|
.setPositiveButton(R.string.ok, null)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user