117 lines
3.9 KiB
Kotlin
117 lines
3.9 KiB
Kotlin
package org.moire.ultrasonic.filepicker
|
|
|
|
import android.content.Context
|
|
import android.content.DialogInterface.BUTTON_NEGATIVE
|
|
import android.content.DialogInterface.BUTTON_NEUTRAL
|
|
import android.content.DialogInterface.BUTTON_POSITIVE
|
|
import android.view.LayoutInflater
|
|
import android.widget.Button
|
|
import android.widget.TextView
|
|
import androidx.appcompat.app.AlertDialog
|
|
import org.moire.ultrasonic.R
|
|
|
|
/**
|
|
* This dialog can be used to pick a file / folder from the filesystem.
|
|
* Currently only supports folders.
|
|
* @author this implementation is loosely based on the work of Yogesh Sundaresan,
|
|
* original license: http://www.apache.org/licenses/LICENSE-2.0
|
|
*/
|
|
class FilePickerDialog {
|
|
|
|
private var alertDialog: AlertDialog? = null
|
|
private var filePickerView: FilePickerView? = null
|
|
private var onFileSelectedListener: OnFileSelectedListener? = null
|
|
private var currentPath: TextView? = null
|
|
private var newFolderButton: Button? = null
|
|
|
|
private constructor(context: Context) {
|
|
alertDialog = AlertDialog.Builder(context).create()
|
|
initialize(context)
|
|
}
|
|
|
|
private constructor(context: Context, themeResId: Int) {
|
|
alertDialog = AlertDialog.Builder(context, themeResId).create()
|
|
initialize(context)
|
|
}
|
|
|
|
private fun initialize(context: Context) {
|
|
val view = LayoutInflater.from(context).inflate(R.layout.filepicker_dialog_main, null)
|
|
|
|
alertDialog!!.setView(view)
|
|
filePickerView = view.findViewById(R.id.file_list_view)
|
|
currentPath = view.findViewById(R.id.current_path)
|
|
|
|
newFolderButton = view.findViewById(R.id.filepicker_create_folder)
|
|
newFolderButton!!.setOnClickListener { filePickerView!!.createNewFolder() }
|
|
|
|
alertDialog!!.setTitle(context.getString(R.string.filepicker_select_folder))
|
|
|
|
alertDialog!!.setButton(BUTTON_POSITIVE, context.getString(R.string.filepicker_select)) {
|
|
dialogInterface, _ ->
|
|
dialogInterface.dismiss()
|
|
if (onFileSelectedListener != null)
|
|
onFileSelectedListener!!.onFileSelected(
|
|
filePickerView!!.selected, filePickerView!!.selected.absolutePath
|
|
)
|
|
}
|
|
alertDialog!!.setButton(BUTTON_NEUTRAL, context.getString(R.string.filepicker_default)) {
|
|
_, _ ->
|
|
filePickerView!!.goToDefaultDirectory()
|
|
}
|
|
alertDialog!!.setButton(BUTTON_NEGATIVE, context.getString(R.string.common_cancel)) {
|
|
dialogInterface, _ ->
|
|
dialogInterface.dismiss()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the FilePickerDialog
|
|
*/
|
|
fun show() {
|
|
filePickerView!!.start { currentDirectory, isRealPath ->
|
|
run {
|
|
currentPath?.text = currentDirectory
|
|
newFolderButton!!.isEnabled = isRealPath
|
|
}
|
|
}
|
|
alertDialog!!.show()
|
|
alertDialog!!.getButton(BUTTON_NEUTRAL).setOnClickListener {
|
|
filePickerView!!.goToDefaultDirectory()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Listener to know which file/directory is selected
|
|
*
|
|
* @param onFileSelectedListener Instance of the Listener
|
|
*/
|
|
fun setOnFileSelectedListener(onFileSelectedListener: OnFileSelectedListener) {
|
|
this.onFileSelectedListener = onFileSelectedListener
|
|
}
|
|
|
|
/**
|
|
* Set the initial directory to show the list of files in that directory
|
|
*
|
|
* @param path String denoting to the directory
|
|
*/
|
|
fun setDefaultDirectory(path: String) {
|
|
filePickerView!!.setDefaultDirectory(path)
|
|
}
|
|
|
|
fun setInitialDirectory(path: String) {
|
|
filePickerView!!.setInitialDirectory(path)
|
|
}
|
|
|
|
companion object {
|
|
/**
|
|
* Creates a default instance of FilePickerDialog
|
|
*
|
|
* @param context Context of the App
|
|
* @return Instance of FileListerDialog
|
|
*/
|
|
fun createFilePickerDialog(context: Context): FilePickerDialog {
|
|
return FilePickerDialog(context)
|
|
}
|
|
}
|
|
}
|