From 0ee851f30e81975a4f34229d105937ac861b8bec Mon Sep 17 00:00:00 2001 From: Floens Date: Sun, 19 Mar 2017 12:00:49 +0100 Subject: [PATCH] Navigate to public storage root if the Clover folder doesn't exist yet. Avoids a crash with StorageHelper.canNavigate because we indeed can't navigate to a nonexistant folder. Move the FileItem and FileItems classes to FileWatcher as inner classes, they're not general models. Closes #239 --- .../org/floens/chan/core/model/FileItem.java | 46 ------------------- .../org/floens/chan/core/model/FileItems.java | 34 -------------- .../floens/chan/core/saver/FileWatcher.java | 46 +++++++++++++++++-- .../floens/chan/ui/adapter/FilesAdapter.java | 23 +++++----- .../ui/controller/SaveLocationController.java | 8 ++-- .../floens/chan/ui/layout/FilesLayout.java | 13 +++--- 6 files changed, 63 insertions(+), 107 deletions(-) delete mode 100644 Clover/app/src/main/java/org/floens/chan/core/model/FileItem.java delete mode 100644 Clover/app/src/main/java/org/floens/chan/core/model/FileItems.java diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/FileItem.java b/Clover/app/src/main/java/org/floens/chan/core/model/FileItem.java deleted file mode 100644 index b6498a42..00000000 --- a/Clover/app/src/main/java/org/floens/chan/core/model/FileItem.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Clover - 4chan browser https://github.com/Floens/Clover/ - * Copyright (C) 2014 Floens - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.floens.chan.core.model; - -import org.floens.chan.core.saver.StorageHelper; - -import java.io.File; - -public class FileItem { - public File file; - - public FileItem(File file) { - this.file = file; - } - - public boolean isFile() { - return file.isFile(); - } - - public boolean isFolder() { - return file.isDirectory(); - } - - public boolean canNavigate() { - return StorageHelper.canNavigate(file); - } - - public boolean canOpen() { - return StorageHelper.canOpen(file); - } -} diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/FileItems.java b/Clover/app/src/main/java/org/floens/chan/core/model/FileItems.java deleted file mode 100644 index 45a97feb..00000000 --- a/Clover/app/src/main/java/org/floens/chan/core/model/FileItems.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Clover - 4chan browser https://github.com/Floens/Clover/ - * Copyright (C) 2014 Floens - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.floens.chan.core.model; - -import java.io.File; -import java.util.List; - -public class FileItems { - public final File path; - public final List fileItems; - - public final boolean canNavigateUp; - - public FileItems(File path, List fileItems, boolean canNavigateUp) { - this.path = path; - this.fileItems = fileItems; - this.canNavigateUp = canNavigateUp; - } -} diff --git a/Clover/app/src/main/java/org/floens/chan/core/saver/FileWatcher.java b/Clover/app/src/main/java/org/floens/chan/core/saver/FileWatcher.java index 7b54a66d..9fa4cd6a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/saver/FileWatcher.java +++ b/Clover/app/src/main/java/org/floens/chan/core/saver/FileWatcher.java @@ -17,12 +17,10 @@ */ package org.floens.chan.core.saver; +import android.os.Environment; import android.os.FileObserver; import android.util.Log; -import org.floens.chan.core.model.FileItem; -import org.floens.chan.core.model.FileItems; - import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -54,6 +52,11 @@ public class FileWatcher { public void initialize() { initialized = true; + + if (!StorageHelper.canNavigate(startingPath)) { + startingPath = Environment.getExternalStorageDirectory(); + } + navigateTo(startingPath); } @@ -126,4 +129,41 @@ public class FileWatcher { public interface FileWatcherCallback { void onFiles(FileItems fileItems); } + + public static class FileItem { + public File file; + + public FileItem(File file) { + this.file = file; + } + + public boolean isFile() { + return file.isFile(); + } + + public boolean isFolder() { + return file.isDirectory(); + } + + public boolean canNavigate() { + return StorageHelper.canNavigate(file); + } + + public boolean canOpen() { + return StorageHelper.canOpen(file); + } + } + + public static class FileItems { + public final File path; + public final List fileItems; + + public final boolean canNavigateUp; + + public FileItems(File path, List fileItems, boolean canNavigateUp) { + this.path = path; + this.fileItems = fileItems; + this.canNavigateUp = canNavigateUp; + } + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/FilesAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/FilesAdapter.java index fe0895ef..2d1de87e 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/FilesAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/FilesAdapter.java @@ -28,8 +28,7 @@ import android.widget.ImageView; import android.widget.TextView; import org.floens.chan.R; -import org.floens.chan.core.model.FileItem; -import org.floens.chan.core.model.FileItems; +import org.floens.chan.core.saver.FileWatcher; import static org.floens.chan.utils.AndroidUtils.getAttrColor; @@ -37,20 +36,20 @@ public class FilesAdapter extends RecyclerView.Adapter private static final int ITEM_TYPE_FOLDER = 0; private static final int ITEM_TYPE_FILE = 1; - private FileItem highlightedItem; - private FileItems fileItems; + private FileWatcher.FileItem highlightedItem; + private FileWatcher.FileItems fileItems; private Callback callback; public FilesAdapter(Callback callback) { this.callback = callback; } - public void setFiles(FileItems fileItems) { + public void setFiles(FileWatcher.FileItems fileItems) { this.fileItems = fileItems; notifyDataSetChanged(); } - public void setHighlightedItem(FileItem highlightedItem) { + public void setHighlightedItem(FileWatcher.FileItem highlightedItem) { this.highlightedItem = highlightedItem; } @@ -69,7 +68,7 @@ public class FilesAdapter extends RecyclerView.Adapter case ITEM_TYPE_FOLDER: { boolean isFile = itemViewType == ITEM_TYPE_FILE; - FileItem item = getItem(position); + FileWatcher.FileItem item = getItem(position); FileViewHolder fileViewHolder = ((FileViewHolder) holder); fileViewHolder.text.setText(item.file.getName()); @@ -104,7 +103,7 @@ public class FilesAdapter extends RecyclerView.Adapter @Override public int getItemViewType(int position) { - FileItem item = getItem(position); + FileWatcher.FileItem item = getItem(position); if (item.isFile()) { return ITEM_TYPE_FILE; } else if (item.isFolder()) { @@ -114,11 +113,11 @@ public class FilesAdapter extends RecyclerView.Adapter } } - public FileItem getItem(int position) { + public FileWatcher.FileItem getItem(int position) { return fileItems.fileItems.get(position); } - private void onItemClicked(FileItem fileItem) { + private void onItemClicked(FileWatcher.FileItem fileItem) { callback.onFileItemClicked(fileItem); } @@ -135,12 +134,12 @@ public class FilesAdapter extends RecyclerView.Adapter @Override public void onClick(View v) { - FileItem item = getItem(getAdapterPosition()); + FileWatcher.FileItem item = getItem(getAdapterPosition()); onItemClicked(item); } } public interface Callback { - void onFileItemClicked(FileItem fileItem); + void onFileItemClicked(FileWatcher.FileItem fileItem); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SaveLocationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SaveLocationController.java index a859ebae..1fc04133 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SaveLocationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SaveLocationController.java @@ -24,8 +24,6 @@ import android.view.View; import org.floens.chan.R; import org.floens.chan.controller.Controller; -import org.floens.chan.core.model.FileItem; -import org.floens.chan.core.model.FileItems; import org.floens.chan.core.saver.FileWatcher; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.activity.StartActivity; @@ -48,7 +46,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi private boolean gotPermission = false; private FileWatcher fileWatcher; - private FileItems fileItems; + private FileWatcher.FileItems fileItems; public SaveLocationController(Context context) { super(context); @@ -88,7 +86,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi } @Override - public void onFiles(FileItems fileItems) { + public void onFiles(FileWatcher.FileItems fileItems) { this.fileItems = fileItems; filesLayout.setFiles(fileItems); } @@ -99,7 +97,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi } @Override - public void onFileItemClicked(FileItem fileItem) { + public void onFileItemClicked(FileWatcher.FileItem fileItem) { if (fileItem.canNavigate()) { fileWatcher.navigateTo(fileItem.file); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilesLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilesLayout.java index 96dd8c28..52a39471 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/FilesLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/FilesLayout.java @@ -30,8 +30,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import org.floens.chan.R; -import org.floens.chan.core.model.FileItem; -import org.floens.chan.core.model.FileItems; +import org.floens.chan.core.saver.FileWatcher; import org.floens.chan.ui.adapter.FilesAdapter; import org.floens.chan.utils.RecyclerUtils; @@ -51,7 +50,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback, private Map history = new HashMap<>(); private FileItemHistory currentHistory; - private FileItems currentFileItems; + private FileWatcher.FileItems currentFileItems; private Callback callback; @@ -91,7 +90,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback, this.callback = callback; } - public void setFiles(FileItems fileItems) { + public void setFiles(FileWatcher.FileItems fileItems) { // Save the associated list position if (currentFileItems != null) { int[] indexTop = RecyclerUtils.getIndexAndTop(recyclerView); @@ -132,7 +131,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback, } @Override - public void onFileItemClicked(FileItem fileItem) { + public void onFileItemClicked(FileWatcher.FileItem fileItem) { currentHistory.clickedItem = fileItem; callback.onFileItemClicked(fileItem); } @@ -147,12 +146,12 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback, private class FileItemHistory { int index, top; - FileItem clickedItem; + FileWatcher.FileItem clickedItem; } public interface Callback { void onBackClicked(); - void onFileItemClicked(FileItem fileItem); + void onFileItemClicked(FileWatcher.FileItem fileItem); } }