Cómo filtrar archivos por su extensión en rosuH AndroidFilePicker con la implementación de Java

Cómo filtrar archivos por su extensión en rosuH AndroidFilePicker con la implementación de Java

AndroidFilePicker de rosuH es una biblioteca de selección de archivos / carpetas muy útil que está en constante evolución con el objetivo de una rápida integración, alta personalización y capacidad de configuración. Lo he estado usando en un proyecto personal donde el usuario debería poder seleccionar archivos y directorios del sistema. En este caso, necesitaba implementar alguna forma de filtrar la lista de archivos por extensiones específicas (mostrar solo archivos JavaScript o archivos de texto sin formato), así que comencé con la implementación del filtro. Como mencioné en tutoriales anteriores sobre este complemento, está destinado a ser manejado con Kotlin, pero estoy trabajando en un complemento de CapacitorJS, así que me quedaré con Java y te explicaré cómo hacerlo en este breve artículo.

1. Implementar Filtro por clase de extensión

Lo primero que debes hacer es implementar la clase de filtro, que en este caso nos permitirá filtrar los archivos de la lista por su extensión. La clase esperará como argumento del constructor una lista de cadenas de texto que contendrá todas las extensiones que pueden aparecer en el buscador de archivos. Esta clase extenderá la clase AbstractFileFilter del complemento y sobreescribira el método doFilter donde se ejecutará la lógica personalizada, que en mi caso simplemente agrega el archivo a la lista del navegador de archivos si su extensión está en la lista de extensiones permitidas:

// FilterByExtension.java
package com.useyourown.package.name;

import java.util.ArrayList;
import java.util.List;
import me.rosuh.filepicker.bean.FileItemBeanImpl;
import me.rosuh.filepicker.config.AbstractFileFilter;

public class FilterByExtension extends AbstractFileFilter{
    public List<String> allowedExtensions;

    public FilterByExtension(List<String> _extensions){
        this.allowedExtensions = _extensions;
    }

    // Sobreescribir el método doFilter
    @Override
    public ArrayList<FileItemBeanImpl> doFilter(ArrayList<FileItemBeanImpl> listData){
        // Si no hay filtros, devuelve la misma lista
        if(this.allowedExtensions.size() <= 0) return listData;

        // En esta lógica, devolveremos una nueva lista que contendrá solo los elementos que deseamos
        ArrayList<FileItemBeanImpl> newList = new ArrayList<>();

        // Iterar sobre cada elemento de la lista
        for (FileItemBeanImpl fileItem: listData) {
            // De lo contrario, agregue el directorio a la lista
            if(fileItem.isDir()){
                newList.add(fileItem);

            // Si el elemento es un archivo, fíltrelo por su extensión
            }else{
                String extension = this.getFileExtension(fileItem.getFileName());

                // Si la extensión del archivo está permitida, agréguela a la lista
                if(this.allowedExtensions.contains(extension)){
                    newList.add(fileItem);
                }
            }
        }

        return newList;
    }

    public String getFileExtension(String fileName) {
        String extension = "";

        int i = fileName.lastIndexOf('.');
        int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

        if (i > p) {
            extension = fileName.substring(i + 1);
        }

        return extension;
    }
}

Ten en cuenta que el método getFileExtension es una autoimplementación, funciona en la mayoría de los casos y definitivamente debería funcionar para ti. En caso de tener un caso especial, puedes personalizarlo.

2. Inicia el filtrado de FilePicker por extensiones

Para aplicar el filtro, simplemente debes proporcionar una nueva instancia de nuestra clase de filtro como primer argumento del método de filtro:

import java.util.List;
import java.util.ArrayList;

// 1. Crear lista de extensiones permitidas
List<String> allowedExtensions = new ArrayList<String>();

// Agregue a las extensiones permitidas los archivos de texto y javascript
allowedExtensions.add("js");
allowedExtensions.add("txt");

// 2. Aplicar filtro por extensión
FilePickerManager.INSTANCE
    .from(this)
    .filter(new FilterByExtension(allowedExtensions))
    .forResult(FilePickerManager.REQUEST_CODE);

Entonces, cuando inicies el explorador de archivos, solo los archivos con las extensiones de la lista aparecerán en el selector. Si la lista está vacía, se permitirán todas las extensiones.

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable