Skip to content

Commit

Permalink
fixes cgeo#4957 new approach for local storage
Browse files Browse the repository at this point in the history
  • Loading branch information
pstorch committed Mar 12, 2017
1 parent 80f0300 commit 05643b3
Show file tree
Hide file tree
Showing 21 changed files with 692 additions and 554 deletions.
1 change: 1 addition & 0 deletions main/res/values/preference_keys.xml
Expand Up @@ -85,6 +85,7 @@
<string translatable="false" name="pref_defaultNavigationTool2">defaultNavigationTool2</string>
<string translatable="false" name="pref_gpxExportDir">gpxExportDir</string>
<string translatable="false" name="pref_gpxImportDir">gpxImportDir</string>
<string translatable="false" name="pref_dataDir">pref_dataDir</string>
<string translatable="false" name="pref_loaddirectionimg">loaddirectionimg</string>
<string translatable="false" name="pref_fakekey_preference_backup_info">fakekey_preference_backup_info</string>
<string translatable="false" name="pref_fakekey_preference_backup">fakekey_preference_backup</string>
Expand Down
6 changes: 6 additions & 0 deletions main/res/values/strings.xml
Expand Up @@ -436,6 +436,7 @@
<string name="settings_title_map_data">Map Data</string>
<string name="settings_title_map_content">Map Content</string>
<string name="settings_title_gpx">GPX</string>
<string name="settings_title_data_dir">Geocache Data</string>
<string name="settings_title_basicmembers">Options for Basic Members</string>
<string name="settings_title_navigation">Navigation</string>
<string name="settings_summary_navigation">Choose preferred navigation methods and select external navigation apps.</string>
Expand Down Expand Up @@ -585,6 +586,7 @@
<string name="init_map_directory_description">Directory with offline maps</string>
<string name="init_gpx_exportdir">GPX Export Directory</string>
<string name="init_gpx_importdir">GPX Import Directory</string>
<string name="init_dataDir">Select Geocache data directory</string>
<string name="init_maptrail">Show Trail</string>
<string name="init_summary_maptrail">Show trail on Map</string>
<string name="init_share_after_export">Open share menu after GPX export</string>
Expand All @@ -610,6 +612,10 @@
<string name="init_dbmove_running">Moving Database</string>
<string name="init_dbmove_success">Successfully moved the database.</string>
<string name="init_dbmove_failed">Failed to move database</string>
<string name="init_datadirmove_datadirmove">Moving Geocache data directory</string>
<string name="init_datadirmove_running">Moving Geocache data directory</string>
<string name="init_datadirmove_success">Successfully moved Geocache data directory.</string>
<string name="init_datadirmove_failed">Failed to move Geocache data directory</string>
<string name="init_plain_logs">Plain Logs</string>
<string name="init_summary_plain_logs">Display log entries without colors</string>
<string name="init_use_native_ua">Android browser</string>
Expand Down
7 changes: 7 additions & 0 deletions main/res/xml/preferences.xml
Expand Up @@ -781,6 +781,13 @@
android:icon="?attr/settings_nut"
android:title="@string/settings_title_system"
android:summary="@string/settings_summary_system" >
<PreferenceCategory android:title="@string/settings_title_data_dir" >
<ListPreference
android:defaultValue="0"
android:dialogTitle="@string/init_dataDir"
android:key="@string/pref_dataDir"
android:title="@string/init_dataDir" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/settings_title_gpx" >
<Preference
android:key="@string/pref_gpxExportDir"
Expand Down
8 changes: 4 additions & 4 deletions main/src/cgeo/geocaching/ImageSelectActivity.java
Expand Up @@ -28,8 +28,8 @@
import android.widget.Spinner;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

Expand Down Expand Up @@ -274,11 +274,11 @@ protected void onActivityResult(final int requestCode, final int resultCode, fin
final File outputFile = ImageUtils.getOutputImageFile();
if (outputFile != null) {
output = new FileOutputStream(outputFile);
LocalStorage.copy(input, output);
IOUtils.copy(input, output);
image = new Image.Builder().setUrl(outputFile).build();
}
} catch (final FileNotFoundException e) {
Log.e("ImageSelectActivity.onStartResult", e);
} catch (final IOException e) {
Log.e("ImageSelectActivity.onActivityResult", e);
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
Expand Down
14 changes: 3 additions & 11 deletions main/src/cgeo/geocaching/SelectMapfileActivity.java
Expand Up @@ -7,8 +7,6 @@
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.LocalStorage;

import org.openintents.intents.FileManagerIntents;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
Expand All @@ -17,11 +15,11 @@
import android.widget.Button;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import org.openintents.intents.FileManagerIntents;

public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectionListAdapter> implements IFileSelectionView {

Expand Down Expand Up @@ -56,7 +54,7 @@ public void onClick(final View v) {
} catch (final android.content.ActivityNotFoundException ignored) {
// OI file manager not available
final Intent dirChooser = new Intent(SelectMapfileActivity.this, SimpleDirChooser.class);
dirChooser.putExtra(Intents.EXTRA_START_DIR, LocalStorage.getStorage().getAbsolutePath());
dirChooser.putExtra(Intents.EXTRA_START_DIR, LocalStorage.getExternalPublicCgeoDirectory().getAbsolutePath());
startActivityForResult(dirChooser, REQUEST_DIRECTORY);
}
}
Expand All @@ -83,13 +81,7 @@ protected FileSelectionListAdapter getAdapter(final List<File> files) {

@Override
protected List<File> getBaseFolders() {
final List<File> folders = new ArrayList<>();
for (final File dir : LocalStorage.getStorages()) {
folders.add(new File(dir, "mfmaps"));
folders.add(new File(new File(dir, "Locus"), "mapsVector"));
folders.add(new File(dir, LocalStorage.CACHE_DIRNAME));
}
return folders;
return LocalStorage.getMapDirectories();
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions main/src/cgeo/geocaching/export/FieldNoteExport.java
Expand Up @@ -10,6 +10,7 @@
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.DataStore;
import cgeo.geocaching.storage.LocalStorage;
import cgeo.geocaching.utils.AsyncTaskWithProgress;
import cgeo.geocaching.utils.Formatter;
import cgeo.geocaching.utils.Log;
Expand All @@ -19,7 +20,6 @@
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
Expand All @@ -39,7 +39,7 @@
*
*/
public class FieldNoteExport extends AbstractExport {
private static final File exportLocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/field-notes");
private static final File exportLocation = LocalStorage.getFieldNotesDirectory();
private static int fieldNotesCount = 0;
private final String fileName;

Expand Down
5 changes: 3 additions & 2 deletions main/src/cgeo/geocaching/export/GpxExport.java
Expand Up @@ -5,6 +5,7 @@
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.LocalStorage;
import cgeo.geocaching.utils.AsyncTaskWithProgress;
import cgeo.geocaching.utils.EnvironmentUtils;
import cgeo.geocaching.utils.FileUtils;
Expand Down Expand Up @@ -119,7 +120,7 @@ public ExportTask(final Activity activity) {
}

private File getExportFile() {
return FileUtils.getUniqueNamedFile(new File(Settings.getGpxExportDir(), fileName));
return FileUtils.getUniqueNamedFile(new File(LocalStorage.getGpxExportDirectory(), fileName));
}

@Override
Expand All @@ -136,7 +137,7 @@ protected File doInBackgroundInternal(final String[] geocodes) {
final File exportFile = getExportFile();
BufferedWriter writer = null;
try {
final File exportLocation = new File(Settings.getGpxExportDir());
final File exportLocation = LocalStorage.getGpxExportDirectory();
FileUtils.mkdirs(exportLocation);

writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(exportFile), CharEncoding.UTF_8));
Expand Down
9 changes: 4 additions & 5 deletions main/src/cgeo/geocaching/models/Geocache.java
Expand Up @@ -36,6 +36,7 @@
import cgeo.geocaching.staticmaps.StaticMapsProvider;
import cgeo.geocaching.storage.DataStore;
import cgeo.geocaching.storage.DataStore.StorageLocation;
import cgeo.geocaching.storage.LocalStorage;
import cgeo.geocaching.utils.CalendarUtils;
import cgeo.geocaching.utils.DisposableHandler;
import cgeo.geocaching.utils.ImageUtils;
Expand All @@ -47,7 +48,6 @@
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
Expand Down Expand Up @@ -1869,16 +1869,15 @@ public Collection<Image> getNonStaticImages() {
}

/**
* Add spoilers stored locally in <tt>/sdcard/GeocachePhotos</tt>. If a cache is named GC123ABC, the
* directory will be <tt>/sdcard/GeocachePhotos/C/B/GC123ABC/</tt>.
* Add spoilers stored locally in <tt>/sdcard/cgeo/GeocachePhotos</tt>. If a cache is named GC123ABC, the
* directory will be <tt>/sdcard/cgeo/GeocachePhotos/C/B/GC123ABC/</tt>.
*
* @param spoilers the list to add to
*/
private void addLocalSpoilersTo(final List<Image> spoilers) {
if (StringUtils.length(geocode) >= 2) {
final String suffix = StringUtils.right(geocode, 2);
final File baseDir = new File(Environment.getExternalStorageDirectory(), "GeocachePhotos");
final File lastCharDir = new File(baseDir, suffix.substring(1));
final File lastCharDir = new File(LocalStorage.getLocalSpoilersDirectory(), suffix.substring(1));
final File secondToLastCharDir = new File(lastCharDir, suffix.substring(0, 1));
final File finalDir = new File(secondToLastCharDir, geocode);
final File[] files = finalDir.listFiles();
Expand Down
10 changes: 4 additions & 6 deletions main/src/cgeo/geocaching/network/HtmlImage.java
Expand Up @@ -255,7 +255,7 @@ private ImmutablePair<BitmapDrawable, Boolean> loadFromDisk() {
}

private void downloadAndSave(final ObservableEmitter<BitmapDrawable> emitter, final Disposable disposable) {
final File file = LocalStorage.getStorageFile(pseudoGeocode, url, true, true);
final File file = LocalStorage.getGeocacheDataFile(pseudoGeocode, url, true, true);
if (url.startsWith("data:image/")) {
if (url.contains(";base64,")) {
ImageUtils.decodeBase64ToFile(StringUtils.substringAfter(url, ";base64,"), file);
Expand Down Expand Up @@ -319,7 +319,7 @@ private boolean downloadOrRefreshCopy(@NonNull final String url, final File file
try {
final Response httpResponse = Network.getRequest(absoluteURL, null, file).blockingGet();
if (httpResponse.isSuccessful()) {
LocalStorage.saveEntityToFile(httpResponse, file);
FileUtils.saveEntityToFile(httpResponse, file);
} else if (httpResponse.code() == 304) {
if (!file.setLastModified(System.currentTimeMillis())) {
makeFreshCopy(file);
Expand All @@ -345,7 +345,7 @@ private boolean downloadOrRefreshCopy(@NonNull final String url, final File file
private static void makeFreshCopy(final File file) {
final File tempFile = new File(file.getParentFile(), file.getName() + "-temp");
if (file.renameTo(tempFile)) {
LocalStorage.copy(tempFile, file);
FileUtils.copy(tempFile, file);
FileUtils.deleteIgnoringFailure(tempFile);
} else {
Log.e("Could not reset timestamp of file " + file.getAbsolutePath());
Expand All @@ -363,13 +363,11 @@ private static void makeFreshCopy(final File file) {
@NonNull
private ImmutablePair<Bitmap, Boolean> loadImageFromStorage(final String url, @NonNull final String pseudoGeocode, final boolean forceKeep) {
try {
final File file = LocalStorage.getStorageFile(pseudoGeocode, url, true, false);
final File file = LocalStorage.getGeocacheDataFile(pseudoGeocode, url, true, false);
final ImmutablePair<Bitmap, Boolean> image = loadCachedImage(file, forceKeep);
if (image.right || image.left != null) {
return image;
}
final File fileSec = LocalStorage.getStorageSecFile(pseudoGeocode, url, true);
return loadCachedImage(fileSec, forceKeep);
} catch (final Exception e) {
Log.w("HtmlImage.loadImageFromStorage", e);
}
Expand Down
6 changes: 3 additions & 3 deletions main/src/cgeo/geocaching/network/Network.java
Expand Up @@ -2,7 +2,7 @@

import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.storage.LocalStorage;
import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.JsonUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.RxOkHttpUtils;
Expand Down Expand Up @@ -259,14 +259,14 @@ private static Parameters cacheHeaders(@Nullable final File cacheFile) {
return null;
}

final String etag = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_ETAG);
final String etag = FileUtils.getSavedHeader(cacheFile, FileUtils.HEADER_ETAG);
if (etag != null) {
// The ETag is a more robust check than a timestamp. If we have an ETag, it is enough
// to identify the right version of the resource.
return new Parameters("If-None-Match", etag);
}

final String lastModified = LocalStorage.getSavedHeader(cacheFile, LocalStorage.HEADER_LAST_MODIFIED);
final String lastModified = FileUtils.getSavedHeader(cacheFile, FileUtils.HEADER_LAST_MODIFIED);
if (lastModified != null) {
return new Parameters("If-Modified-Since", lastModified);
}
Expand Down
66 changes: 60 additions & 6 deletions main/src/cgeo/geocaching/settings/Settings.java
Expand Up @@ -22,10 +22,13 @@
import cgeo.geocaching.maps.mapsforge.MapsforgeMapProvider.OfflineMapSource;
import cgeo.geocaching.maps.routing.Routing;
import cgeo.geocaching.maps.routing.RoutingMode;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.playservices.GooglePlayServices;
import cgeo.geocaching.sensors.MagnetometerAndAccelerometerProvider;
import cgeo.geocaching.sensors.OrientationProvider;
import cgeo.geocaching.sensors.RotationProvider;
import cgeo.geocaching.storage.DataStore;
import cgeo.geocaching.storage.LocalStorage;
import cgeo.geocaching.utils.CryptUtils;
import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.FileUtils.FileSelector;
Expand All @@ -35,12 +38,12 @@
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
Expand Down Expand Up @@ -113,7 +116,7 @@ protected Settings() {
}

private static void migrateSettings() {
final int latestPreferencesVersion = 2;
final int latestPreferencesVersion = 3;
final int currentVersion = getInt(R.string.pref_settingsversion, 0);

// No need to migrate if we are up to date.
Expand Down Expand Up @@ -220,12 +223,55 @@ private static void migrateSettings() {
e.putString(getKey(R.string.pref_defaultNavigationTool2), String.valueOf(dnt2));

// defaults for gpx directories
e.putString(getKey(R.string.pref_gpxImportDir), getGpxImportDir());
e.putString(getKey(R.string.pref_gpxExportDir), getGpxExportDir());
e.putString(getKey(R.string.pref_gpxImportDir), LocalStorage.getDefaultGpxDirectory().getPath());
e.putString(getKey(R.string.pref_gpxExportDir), LocalStorage.getDefaultGpxDirectory().getPath());

e.putInt(getKey(R.string.pref_settingsversion), 2); // mark migrated
e.apply();
}

if (currentVersion < 3) {
final Editor e = sharedPrefs.edit();

// move field-notes
FileUtils.renameIfNotExists(LocalStorage.getLegacyFieldNotesDirectory(), LocalStorage.getFieldNotesDirectory());

// move gpx files
if (getGpxExportDir().equals(LocalStorage.getLegacyGpxDirectory().getPath())) {
e.putString(getKey(R.string.pref_gpxExportDir), LocalStorage.getDefaultGpxDirectory().getPath());
}
if (getGpxImportDir().equals(LocalStorage.getLegacyGpxDirectory().getPath())) {
e.putString(getKey(R.string.pref_gpxImportDir), LocalStorage.getDefaultGpxDirectory().getPath());
}
FileUtils.renameIfNotExists(LocalStorage.getLegacyGpxDirectory(), LocalStorage.getDefaultGpxDirectory());

// local spoilers
FileUtils.renameIfNotExists(LocalStorage.getLegacyLocalSpoilersDirectory(), LocalStorage.getLocalSpoilersDirectory());

// move db files
FileUtils.moveTo(new File(LocalStorage.getLegacyExternalCgeoDirectory(), DataStore.DB_FILE_NAME_BACKUP), LocalStorage.getExternalDbDirectory());
FileUtils.moveTo(new File(LocalStorage.getLegacyExternalCgeoDirectory(), DataStore.DB_FILE_NAME), LocalStorage.getExternalDbDirectory());
FileUtils.moveTo(new File(LocalStorage.getLegacyExternalCgeoDirectory(), DataStore.DB_FILE_NAME_BACKUP + DataStore.DB_FILE_CORRUPTED_EXTENSION), LocalStorage.getBackupDirectory());
FileUtils.moveTo(new File(LocalStorage.getLegacyExternalCgeoDirectory(), DataStore.DB_FILE_NAME + DataStore.DB_FILE_CORRUPTED_EXTENSION), LocalStorage.getBackupDirectory());

// move geocache data files
final FileFilter geocacheDirectories = new FileFilter() {
@Override
public boolean accept(final File pathname) {
final String name = pathname.getName();
return pathname.isDirectory() &&
(HtmlImage.SHARED.equals(name) || LocalStorage.GEOCACHE_FILE_PATTERN.matcher(name).find());
}
};
final File[] list = LocalStorage.getLegacyExternalCgeoDirectory().listFiles(geocacheDirectories);
for (final File file : list) {
FileUtils.moveTo(file, LocalStorage.getGeocacheDataDirectory());
}

e.putString(getKey(R.string.pref_dataDir), LocalStorage.getExternalPrivateCgeoDirectory().getAbsolutePath());
e.putInt(getKey(R.string.pref_settingsversion), 3); // mark migrated
e.apply();
}
}

private static String getKey(final int prefKeyId) {
Expand Down Expand Up @@ -1009,12 +1055,20 @@ public static void setDbOnSDCard(final boolean dbOnSDCard) {

public static String getGpxExportDir() {
return getString(R.string.pref_gpxExportDir,
Environment.getExternalStorageDirectory().getPath() + "/gpx");
LocalStorage.getDefaultGpxDirectory().getPath());
}

public static String getGpxImportDir() {
return getString(R.string.pref_gpxImportDir,
Environment.getExternalStorageDirectory().getPath() + "/gpx");
LocalStorage.getDefaultGpxDirectory().getPath());
}

public static String getExternalPrivateCgeoDirectory() {
return getString(R.string.pref_dataDir, null);
}

public static void setExternalPrivateCgeoDirectory(final String extDir) {
putString(R.string.pref_dataDir, extDir);
}

public static boolean getShareAfterExport() {
Expand Down

0 comments on commit 05643b3

Please sign in to comment.