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
multisite^2
Floens 8 years ago
parent 8e11f039a9
commit 0ee851f30e
  1. 46
      Clover/app/src/main/java/org/floens/chan/core/model/FileItem.java
  2. 34
      Clover/app/src/main/java/org/floens/chan/core/model/FileItems.java
  3. 46
      Clover/app/src/main/java/org/floens/chan/core/saver/FileWatcher.java
  4. 23
      Clover/app/src/main/java/org/floens/chan/ui/adapter/FilesAdapter.java
  5. 8
      Clover/app/src/main/java/org/floens/chan/ui/controller/SaveLocationController.java
  6. 13
      Clover/app/src/main/java/org/floens/chan/ui/layout/FilesLayout.java

@ -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 <http://www.gnu.org/licenses/>.
*/
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);
}
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.model;
import java.io.File;
import java.util.List;
public class FileItems {
public final File path;
public final List<FileItem> fileItems;
public final boolean canNavigateUp;
public FileItems(File path, List<FileItem> fileItems, boolean canNavigateUp) {
this.path = path;
this.fileItems = fileItems;
this.canNavigateUp = canNavigateUp;
}
}

@ -17,12 +17,10 @@
*/ */
package org.floens.chan.core.saver; package org.floens.chan.core.saver;
import android.os.Environment;
import android.os.FileObserver; import android.os.FileObserver;
import android.util.Log; import android.util.Log;
import org.floens.chan.core.model.FileItem;
import org.floens.chan.core.model.FileItems;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -54,6 +52,11 @@ public class FileWatcher {
public void initialize() { public void initialize() {
initialized = true; initialized = true;
if (!StorageHelper.canNavigate(startingPath)) {
startingPath = Environment.getExternalStorageDirectory();
}
navigateTo(startingPath); navigateTo(startingPath);
} }
@ -126,4 +129,41 @@ public class FileWatcher {
public interface FileWatcherCallback { public interface FileWatcherCallback {
void onFiles(FileItems fileItems); 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<FileItem> fileItems;
public final boolean canNavigateUp;
public FileItems(File path, List<FileItem> fileItems, boolean canNavigateUp) {
this.path = path;
this.fileItems = fileItems;
this.canNavigateUp = canNavigateUp;
}
}
} }

@ -28,8 +28,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.model.FileItem; import org.floens.chan.core.saver.FileWatcher;
import org.floens.chan.core.model.FileItems;
import static org.floens.chan.utils.AndroidUtils.getAttrColor; import static org.floens.chan.utils.AndroidUtils.getAttrColor;
@ -37,20 +36,20 @@ public class FilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private static final int ITEM_TYPE_FOLDER = 0; private static final int ITEM_TYPE_FOLDER = 0;
private static final int ITEM_TYPE_FILE = 1; private static final int ITEM_TYPE_FILE = 1;
private FileItem highlightedItem; private FileWatcher.FileItem highlightedItem;
private FileItems fileItems; private FileWatcher.FileItems fileItems;
private Callback callback; private Callback callback;
public FilesAdapter(Callback callback) { public FilesAdapter(Callback callback) {
this.callback = callback; this.callback = callback;
} }
public void setFiles(FileItems fileItems) { public void setFiles(FileWatcher.FileItems fileItems) {
this.fileItems = fileItems; this.fileItems = fileItems;
notifyDataSetChanged(); notifyDataSetChanged();
} }
public void setHighlightedItem(FileItem highlightedItem) { public void setHighlightedItem(FileWatcher.FileItem highlightedItem) {
this.highlightedItem = highlightedItem; this.highlightedItem = highlightedItem;
} }
@ -69,7 +68,7 @@ public class FilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
case ITEM_TYPE_FOLDER: { case ITEM_TYPE_FOLDER: {
boolean isFile = itemViewType == ITEM_TYPE_FILE; boolean isFile = itemViewType == ITEM_TYPE_FILE;
FileItem item = getItem(position); FileWatcher.FileItem item = getItem(position);
FileViewHolder fileViewHolder = ((FileViewHolder) holder); FileViewHolder fileViewHolder = ((FileViewHolder) holder);
fileViewHolder.text.setText(item.file.getName()); fileViewHolder.text.setText(item.file.getName());
@ -104,7 +103,7 @@ public class FilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
FileItem item = getItem(position); FileWatcher.FileItem item = getItem(position);
if (item.isFile()) { if (item.isFile()) {
return ITEM_TYPE_FILE; return ITEM_TYPE_FILE;
} else if (item.isFolder()) { } else if (item.isFolder()) {
@ -114,11 +113,11 @@ public class FilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
} }
} }
public FileItem getItem(int position) { public FileWatcher.FileItem getItem(int position) {
return fileItems.fileItems.get(position); return fileItems.fileItems.get(position);
} }
private void onItemClicked(FileItem fileItem) { private void onItemClicked(FileWatcher.FileItem fileItem) {
callback.onFileItemClicked(fileItem); callback.onFileItemClicked(fileItem);
} }
@ -135,12 +134,12 @@ public class FilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@Override @Override
public void onClick(View v) { public void onClick(View v) {
FileItem item = getItem(getAdapterPosition()); FileWatcher.FileItem item = getItem(getAdapterPosition());
onItemClicked(item); onItemClicked(item);
} }
} }
public interface Callback { public interface Callback {
void onFileItemClicked(FileItem fileItem); void onFileItemClicked(FileWatcher.FileItem fileItem);
} }
} }

@ -24,8 +24,6 @@ import android.view.View;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.controller.Controller; 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.saver.FileWatcher;
import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.activity.StartActivity; import org.floens.chan.ui.activity.StartActivity;
@ -48,7 +46,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi
private boolean gotPermission = false; private boolean gotPermission = false;
private FileWatcher fileWatcher; private FileWatcher fileWatcher;
private FileItems fileItems; private FileWatcher.FileItems fileItems;
public SaveLocationController(Context context) { public SaveLocationController(Context context) {
super(context); super(context);
@ -88,7 +86,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi
} }
@Override @Override
public void onFiles(FileItems fileItems) { public void onFiles(FileWatcher.FileItems fileItems) {
this.fileItems = fileItems; this.fileItems = fileItems;
filesLayout.setFiles(fileItems); filesLayout.setFiles(fileItems);
} }
@ -99,7 +97,7 @@ public class SaveLocationController extends Controller implements FileWatcher.Fi
} }
@Override @Override
public void onFileItemClicked(FileItem fileItem) { public void onFileItemClicked(FileWatcher.FileItem fileItem) {
if (fileItem.canNavigate()) { if (fileItem.canNavigate()) {
fileWatcher.navigateTo(fileItem.file); fileWatcher.navigateTo(fileItem.file);
} }

@ -30,8 +30,7 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.model.FileItem; import org.floens.chan.core.saver.FileWatcher;
import org.floens.chan.core.model.FileItems;
import org.floens.chan.ui.adapter.FilesAdapter; import org.floens.chan.ui.adapter.FilesAdapter;
import org.floens.chan.utils.RecyclerUtils; import org.floens.chan.utils.RecyclerUtils;
@ -51,7 +50,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback,
private Map<String, FileItemHistory> history = new HashMap<>(); private Map<String, FileItemHistory> history = new HashMap<>();
private FileItemHistory currentHistory; private FileItemHistory currentHistory;
private FileItems currentFileItems; private FileWatcher.FileItems currentFileItems;
private Callback callback; private Callback callback;
@ -91,7 +90,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback,
this.callback = callback; this.callback = callback;
} }
public void setFiles(FileItems fileItems) { public void setFiles(FileWatcher.FileItems fileItems) {
// Save the associated list position // Save the associated list position
if (currentFileItems != null) { if (currentFileItems != null) {
int[] indexTop = RecyclerUtils.getIndexAndTop(recyclerView); int[] indexTop = RecyclerUtils.getIndexAndTop(recyclerView);
@ -132,7 +131,7 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback,
} }
@Override @Override
public void onFileItemClicked(FileItem fileItem) { public void onFileItemClicked(FileWatcher.FileItem fileItem) {
currentHistory.clickedItem = fileItem; currentHistory.clickedItem = fileItem;
callback.onFileItemClicked(fileItem); callback.onFileItemClicked(fileItem);
} }
@ -147,12 +146,12 @@ public class FilesLayout extends LinearLayout implements FilesAdapter.Callback,
private class FileItemHistory { private class FileItemHistory {
int index, top; int index, top;
FileItem clickedItem; FileWatcher.FileItem clickedItem;
} }
public interface Callback { public interface Callback {
void onBackClicked(); void onBackClicked();
void onFileItemClicked(FileItem fileItem); void onFileItemClicked(FileWatcher.FileItem fileItem);
} }
} }

Loading…
Cancel
Save