Reputation: 1
I wanted to implement the same File Manager app on android devices. That is: on the page there will be files and folders, above which is the hierarchical address of the current page (GalleryFragment).
I am new to android and java. I tried some things but it doesn't work:
GalleryFragment.java:
`
public class GalleryFragment extends Fragment {
private FragmentGalleryBinding binding;
private FileAdapter fileAdapter;
private View rootView;
private ArrayList<File> folderStack = new ArrayList<>();
private HashMap<String, String> folderHierarchyMap = new HashMap<>();
private RecyclerView folderHierarchyRecyclerView;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
GalleryViewModel galleryViewModel =
new ViewModelProvider(this).get(GalleryViewModel.class);
binding = FragmentGalleryBinding.inflate(inflater, container, false);
rootView = binding.getRoot();
return rootView;
}
@Override
public void onResume() {
super.onResume();
CreateFileManager();
String path = Environment.getExternalStorageDirectory().getPath();
File root = new File(path);
File[] files = root.listFiles();
folderStack.add(root);
setupFolderHierarchyRecyclerView();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
private void requestPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(requireContext(), "Storage permission is required, please allow from settings", Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 111);
ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 111);
}
}
private boolean checkPermission() {
int res = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
return res == PackageManager.PERMISSION_GRANTED;
}
private void CreateFileManager() {
String path = Environment.getExternalStorageDirectory().getPath();
RecyclerView recyclerView = rootView.findViewById(R.id.recycler_view);
TextView noFilestextView = rootView.findViewById(R.id.no_files_found);
File root = new File(path);
File[] files = root.listFiles();
fileAdapter = new FileAdapter(requireContext(), files);
if (files == null || files.length == 0) {
noFilestextView.setVisibility(View.VISIBLE);
recyclerView.setAdapter(new FileAdapter(requireContext(), new File[0]));
} else {
noFilestextView.setVisibility(View.INVISIBLE);
recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
recyclerView.setAdapter(fileAdapter);
}
}
private void setupFolderHierarchyRecyclerView() {
folderHierarchyRecyclerView = rootView.findViewById(R.id.folder_hierarchy_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false);
folderHierarchyRecyclerView.setLayoutManager(layoutManager);
if (folderStack != null && !folderStack.isEmpty()) {
Log.d("FolderHierarchyAdapter", "FolderStack size: " + folderStack.size());
FolderHierarchyAdapter folderHierarchyAdapter = new FolderHierarchyAdapter(requireContext(), folderStack);
folderHierarchyRecyclerView.setAdapter(folderHierarchyAdapter);
folderHierarchyAdapter.setOnItemClickListener(new FolderHierarchyAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// Get the selected folder from the folder stack
File selectedFolder = folderStack.get(position);
// Navigate to the selected folder
navigateToFolder(selectedFolder);
}
});
} else {
Log.d("FolderHierarchyAdapter", "FolderStack is empty or null");
}
}
private void navigateToFolder(File folder) {
if (folder.exists() && folder.isDirectory()) {
folderStack.add(folder);
File[] files = folder.listFiles();
if (files != null && files.length > 0) {
fileAdapter.setFilesAndFolders(files);
fileAdapter.notifyDataSetChanged();
// Add folder to the hierarchy dictionary
folderHierarchyMap.put(folder.getName(), folder.getAbsolutePath());
// Update the folder hierarchy list
updateFolderHierarchyList();
} else {
Toast.makeText(requireContext(), "Folder is empty or cannot be accessed", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(requireContext(), "Folder does not exist or is not a directory", Toast.LENGTH_SHORT).show();
}
}
private void updateFolderHierarchyList() {
ArrayList<File> hierarchyFolders = new ArrayList<>();
for (String folderName : folderHierarchyMap.keySet()) {
String folderPath = folderHierarchyMap.get(folderName);
hierarchyFolders.add(new File(folderPath));
}
// Update the folder hierarchy list adapter
FolderHierarchyAdapter folderHierarchyAdapter = new FolderHierarchyAdapter(requireContext(), hierarchyFolders);
folderHierarchyRecyclerView.setAdapter(folderHierarchyAdapter);
}
}
`
FileAdapter.java:
`
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.ViewHolder> {
Context context;
File[] filesAndFolders;
private Stack<File> folderStack = new Stack<>();
public FileAdapter (Context context, File[] files) {
this.context = context;
this.filesAndFolders = files;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.file_list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
File selectedFile = filesAndFolders[position];
holder.filename.setText(selectedFile.getName());
if (selectedFile.isDirectory()) {
holder.fileicon.setImageResource(R.drawable.baseline_folder_24);
} else {
String filename = selectedFile.getName();
String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
if (extension.equals("zip") || extension.equals("rar")) {
holder.fileicon.setImageResource(R.drawable.baseline_folder_zip_24);
} else if (isAudioFile(extension)) {
holder.fileicon.setImageResource(R.drawable.baseline_file_audio_24);
} else if (isVideoFile(extension)) {
holder.fileicon.setImageResource(R.drawable.baseline_file_video_24);
} else if (isImageFile(extension)) {
holder.fileicon.setImageResource(R.drawable.baseline_file_image_24);
} else {
// Set a default icon for other file types
holder.fileicon.setImageResource(R.drawable.baseline_file_other_24);
}
}
// Set click listener for item
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedFile.isDirectory()) {
// If it's a directory, navigate into it
navigateIntoFolder(selectedFile);
} else {
// If it's a file, show Toast with file information
showFileInformation(selectedFile);
}
}
});
}
@Override
public int getItemCount() {
return filesAndFolders.length;
}
public void setFilesAndFolders(File[] files) {
this.filesAndFolders = files;
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView filename;
ImageView fileicon;
public ViewHolder(View view) {
super(view);
filename = view.findViewById(R.id.file_name_text_view);
fileicon = view.findViewById(R.id.file_icon_view);
}
}
private void navigateIntoFolder(File folder) {
// Check if the folder exists and is a directory
if (folder.exists() && folder.isDirectory()) {
// Push the current folder to the stack
folderStack.add(folder);
// Get the list of files and folders inside the selected folder
File[] files = folder.listFiles();
if (files != null && files.length > 0) {
// Update the filesAndFolders array with the contents of the selected folder
filesAndFolders = files;
// Notify the adapter that the data set has changed
notifyDataSetChanged();
} else {
// Handle the case where the folder is empty or cannot be accessed
Toast.makeText(context, "Folder is empty or cannot be accessed", Toast.LENGTH_SHORT).show();
}
} else {
// Handle the case where the selected folder does not exist or is not a directory
Toast.makeText(context, "Folder does not exist or is not a directory", Toast.LENGTH_SHORT).show();
}
}
private void showFileInformation(File file) {
// Display information about the file via Toast message
String message = "File Name: " + file.getName() + "\nFile Path: " + file.getAbsolutePath();
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
private boolean isAudioFile(String extension) {
return extension.equalsIgnoreCase("mp3") || extension.equalsIgnoreCase("wav") ||
extension.equalsIgnoreCase("ogg") || extension.equalsIgnoreCase("flac") ||
extension.equalsIgnoreCase("m4a") || extension.equalsIgnoreCase("aac") ||
extension.equalsIgnoreCase("wma") || extension.equalsIgnoreCase("alac") ||
extension.equalsIgnoreCase("amr") || extension.equalsIgnoreCase("opus");
}
private boolean isVideoFile(String extension) {
return extension.equalsIgnoreCase("mp4") || extension.equalsIgnoreCase("avi") ||
extension.equalsIgnoreCase("mkv") || extension.equalsIgnoreCase("mov") ||
extension.equalsIgnoreCase("wmv") || extension.equalsIgnoreCase("flv") ||
extension.equalsIgnoreCase("webm") || extension.equalsIgnoreCase("3gp");
}
private boolean isImageFile(String extension) {
return extension.equalsIgnoreCase("jpg") || extension.equalsIgnoreCase("jpeg") ||
extension.equalsIgnoreCase("png") || extension.equalsIgnoreCase("gif") ||
extension.equalsIgnoreCase("bmp") || extension.equalsIgnoreCase("tiff") ||
extension.equalsIgnoreCase("svg") || extension.equalsIgnoreCase("webp");
}
}
`
FolderHierarchyAdapter.java:
`
public class FolderHierarchyAdapter extends RecyclerView.Adapter<FolderHierarchyAdapter.ViewHolder> {
private Context context;
private ArrayList<File> folderStack;
private OnItemClickListener listener;
public FolderHierarchyAdapter(Context context, ArrayList<File> folderStack) {
this.context = context;
this.folderStack = folderStack;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.folder_hierarchy_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
File folder = folderStack.get(position);
holder.folderName.setText(folder.getName());
holder.itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onItemClick(position);
}
});
}
@Override
public int getItemCount() {
return folderStack.size();
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView folderName;
public ViewHolder(View itemView) {
super(itemView);
folderName = itemView.findViewById(R.id.folder_name_text_view);
}
}
}\`
Upvotes: 0
Views: 24