ultrasonic-app-subsonic-and.../ultrasonic/src/main/kotlin/org/moire/ultrasonic/filepicker/FilePickerDialog.kt

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)
}
}
}