1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-23 00:33:09 +02:00

Merge pull request #208 from erijo/export

Export
This commit is contained in:
OliE
2018-02-28 17:36:02 +01:00
committed by GitHub
16 changed files with 126 additions and 57 deletions

View File

@@ -6,7 +6,7 @@ android {
defaultConfig {
applicationId "com.health.openscale"
testApplicationId "com.health.openscale.test"
minSdkVersion 18
minSdkVersion 19
targetSdkVersion 27
versionCode 23
versionName "1.7"

View File

@@ -49,10 +49,11 @@ import com.health.openscale.core.utils.CsvHelper;
import com.health.openscale.gui.fragments.FragmentUpdateListener;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
@@ -194,6 +195,18 @@ public class OpenScale {
public void deleteScaleUser(int id) {
userDAO.delete(userDAO.get(id));
selectedScaleUser = null;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
// Remove user specific settings
SharedPreferences.Editor editor = prefs.edit();
final String prefix = ScaleUser.getPreferenceKey(id, "");
for (String key : prefs.getAll().keySet()) {
if (key.startsWith(prefix)) {
editor.remove(key);
}
}
editor.apply();
}
public void updateScaleUser(ScaleUser user) {
@@ -332,7 +345,7 @@ public class OpenScale {
updateScaleData();
}
private String getFilenameFromUri(Uri uri) {
public String getFilenameFromUri(Uri uri) {
Cursor cursor = context.getContentResolver().query(
uri, null, null, null, null);
cursor.moveToFirst();
@@ -362,9 +375,10 @@ public class OpenScale {
}
}
public boolean exportData(String filename) {
public boolean exportData(Uri uri) {
try {
CsvHelper.exportTo(new FileWriter(filename), scaleMeasurementList);
OutputStream output = context.getContentResolver().openOutputStream(uri);
CsvHelper.exportTo(new OutputStreamWriter(output), scaleMeasurementList);
return true;
} catch (IOException e) {
Toast.makeText(context, context.getResources().getString(R.string.error_exporting) + " " + e.getMessage(), Toast.LENGTH_SHORT).show();

View File

@@ -152,6 +152,14 @@ public class ScaleUser {
return Converters.fromKilogram(initialWeight, scaleUnit);
}
public static String getPreferenceKey(int userId, String key) {
return String.format("user.%d.%s", userId, key);
}
public String getPreferenceKey(String key) {
return getPreferenceKey(getId(), key);
}
@Override
public String toString()
{

View File

@@ -26,7 +26,6 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
@@ -48,7 +47,6 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.health.openscale.BuildConfig;
@@ -81,6 +79,7 @@ public class MainActivity extends AppCompatActivity
private MenuItem bluetoothStatus;
private static final int IMPORT_DATA_REQUEST = 100;
private static final int EXPORT_DATA_REQUEST = 101;
private DrawerLayout drawerLayout;
private Toolbar toolbar;
@@ -400,9 +399,7 @@ public class MainActivity extends AppCompatActivity
importCsvFile();
return true;
case R.id.exportData:
if (PermissionHelper.requestWritePermission(this)) {
exportCsvFile();
}
exportCsvFile();
return true;
case R.id.shareData:
shareCsvFile();
@@ -556,7 +553,7 @@ public class MainActivity extends AppCompatActivity
else {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/*");
intent.setType("*/*");
startActivityForResult(
Intent.createChooser(intent, getResources().getString(R.string.label_import)),
@@ -564,50 +561,95 @@ public class MainActivity extends AppCompatActivity
}
}
private void exportCsvFile() {
AlertDialog.Builder filenameDialog = new AlertDialog.Builder(this);
private String getExportFilename(ScaleUser selectedScaleUser) {
return String.format("openScale %s.csv", selectedScaleUser.getUserName());
}
filenameDialog.setTitle(getResources().getString(R.string.info_set_filename) + " "
+ Environment.getExternalStorageDirectory().getPath());
private void startActionCreateDocumentForExportIntent() {
OpenScale openScale = OpenScale.getInstance(getApplicationContext());
ScaleUser selectedScaleUser = openScale.getSelectedScaleUser();
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/csv");
intent.putExtra(Intent.EXTRA_TITLE, getExportFilename(selectedScaleUser));
startActivityForResult(intent, EXPORT_DATA_REQUEST);
}
private boolean doExportData(Uri uri) {
OpenScale openScale = OpenScale.getInstance(getApplicationContext());
if (openScale.exportData(uri)) {
String filename = openScale.getFilenameFromUri(uri);
Toast.makeText(this,
getResources().getString(R.string.info_data_exported) + " " + filename,
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
private String getExportPreferenceKey(ScaleUser selectedScaleUser) {
return selectedScaleUser.getPreferenceKey("exportUri");
}
private void exportCsvFile() {
OpenScale openScale = OpenScale.getInstance(getApplicationContext());
final ScaleUser selectedScaleUser = openScale.getSelectedScaleUser();
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
final ScaleUser selectedScaleUser = OpenScale.getInstance(getApplicationContext()).getSelectedScaleUser();
String exportFilename = prefs.getString("exportFilename" + selectedScaleUser.getId(),
"openScale_data_" + selectedScaleUser.getUserName() + ".csv");
Uri uri;
try {
String exportUri = prefs.getString(getExportPreferenceKey(selectedScaleUser), "");
uri = Uri.parse(exportUri);
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
catch (Exception ex) {
uri = null;
}
final EditText txtFilename = new EditText(this);
txtFilename.setText(exportFilename);
if (uri == null) {
startActionCreateDocumentForExportIntent();
return;
}
filenameDialog.setView(txtFilename);
AlertDialog.Builder exportDialog = new AlertDialog.Builder(this);
exportDialog.setTitle(R.string.label_export);
exportDialog.setMessage(getResources().getString(R.string.label_export_overwrite,
openScale.getFilenameFromUri(uri)));
filenameDialog.setPositiveButton(getResources().getString(R.string.label_export), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
String fullPath = Environment.getExternalStorageDirectory().getPath() + "/" + txtFilename.getText().toString();
if (OpenScale.getInstance(getApplicationContext()).exportData(fullPath)) {
prefs.edit().putString("exportFilename" + selectedScaleUser.getId(), txtFilename.getText().toString()).commit();
Toast.makeText(getApplicationContext(), getResources().getString(
R.string.info_data_exported) + " " + fullPath, Toast.LENGTH_SHORT).show();
final Uri exportUri = uri;
exportDialog.setPositiveButton(R.string.label_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (!doExportData(exportUri)) {
prefs.edit().remove(getExportPreferenceKey(selectedScaleUser)).apply();
}
}
});
filenameDialog.setNegativeButton(getResources().getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
exportDialog.setNegativeButton(R.string.label_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActionCreateDocumentForExportIntent();
}
});
exportDialog.setNeutralButton(R.string.label_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
filenameDialog.show();
exportDialog.show();
}
private void shareCsvFile() {
final ScaleUser selectedScaleUser = OpenScale.getInstance(getApplicationContext()).getSelectedScaleUser();
File shareFile = new File(getApplicationContext().getCacheDir(),
String.format("openScale %s.csv", selectedScaleUser.getUserName()));
if (!OpenScale.getInstance(getApplicationContext()).exportData(shareFile.getPath())) {
getExportFilename(selectedScaleUser));
if (!OpenScale.getInstance(getApplicationContext()).exportData(Uri.fromFile(shareFile))) {
return;
}
@@ -629,8 +671,30 @@ public class MainActivity extends AppCompatActivity
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMPORT_DATA_REQUEST && resultCode == RESULT_OK && data != null) {
OpenScale.getInstance(getApplicationContext()).importData(data.getData());
if (resultCode != RESULT_OK || data == null) {
return;
}
OpenScale openScale = OpenScale.getInstance(getApplicationContext());
switch (requestCode) {
case IMPORT_DATA_REQUEST:
openScale.importData(data.getData());
break;
case EXPORT_DATA_REQUEST:
if (doExportData(data.getData())) {
try {
getContentResolver().takePersistableUriPermission(
data.getData(), Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
String key = getExportPreferenceKey(openScale.getSelectedScaleUser());
PreferenceManager.getDefaultSharedPreferences(this).edit()
.putString(key, data.getData().toString()).apply();
}
catch (Exception ex) {
// Ignore
}
}
break;
}
}
@@ -646,13 +710,6 @@ public class MainActivity extends AppCompatActivity
permissionGranted = false;
}
break;
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
exportCsvFile();
} else {
permissionGranted = false;
}
break;
}
if (!permissionGranted) {

View File

@@ -78,7 +78,6 @@
<string name="info_data_all_deleted">Totes les entrades eliminades</string>
<string name="info_data_exported">Dades exportades a</string>
<string name="info_data_imported">Dades importades de</string>
<string name="info_set_filename">Establir nom d\'arxiu a</string>
<string name="info_enter_value_cm">Valor en cm</string>
<string name="info_enter_value_unit">Valor en</string>
<string name="info_enter_comment">Comentari opcional</string>

View File

@@ -18,7 +18,6 @@
<string name="info_is_not_available">ist nicht verfügbar</string>
<string name="info_no_selected_user">Kein Benutzer vorhanden. Bitte erzeugen Sie ein neuen Benutzer unter Einstellungen.</string>
<string name="info_on_date">am</string>
<string name="info_set_filename">Setzte Dateiname auf</string>
<string name="label_birthday">Geburtstag</string>
<string name="label_bluetooth_enable">Suche nach Waage beim Start</string>
<string name="label_bluetooth_title">Bluetooth</string>

View File

@@ -78,7 +78,6 @@
<string name="info_data_all_deleted">Todas las entradas borradas</string>
<string name="info_data_exported">Datos exportados a</string>
<string name="info_data_imported">Datos importados de</string>
<string name="info_set_filename">Establecer nombre de archivo a</string>
<string name="info_enter_value_cm">Introduzca valor en cm</string>
<string name="info_enter_value_unit">Introduzca valor en</string>
<string name="info_enter_comment">Introduzca un comentario opcional</string>

View File

@@ -72,7 +72,6 @@
<string name="info_data_all_deleted">Toutes les entrées ont été supprimées de la base de données</string>
<string name="info_data_exported">Données exportées vers</string>
<string name="info_data_imported">Donnéees importées depuis</string>
<string name="info_set_filename">Définir le nom du fichier vers</string>
<string name="info_enter_value_cm">Entrez la valeur en cm</string>
<string name="info_enter_value_unit">Entrez la valeur en</string>
<string name="info_enter_comment">Ajouter un commentaire optionnel</string>

View File

@@ -54,7 +54,6 @@
<string name="info_on_date">でした -</string>
<string name="info_no_selected_user">ユーザーは存在しません!設定で新しいユーザを入れてください</string>
<string name="label_add_user">ユーザーの追加する</string>
<string name="info_set_filename">にファイル名を設定</string>
<string name="label_enable_labels">メモの上にデータ点</string>
<string name="info_is_visible">表示されています</string>
<string name="info_is_not_visible">表示されていません</string>

View File

@@ -80,7 +80,6 @@
<string name="info_data_all_deleted">Alle database vermeldingen verwijderd</string>
<string name="info_data_exported">Data geexporteerd naar</string>
<string name="info_data_imported">Data geinporteerd van</string>
<string name="info_set_filename">Zet bestandsnaam op</string>
<string name="info_enter_value_cm">Geef waarde op cm\'s in</string>
<string name="info_enter_value_unit">Geef waaarde op</string>
<string name="info_enter_comment">Voeg een optionele opmerking toe.</string>

View File

@@ -75,7 +75,6 @@
<string name="info_data_all_deleted">Wszytkie wpisy w bazie danych usunięte</string>
<string name="info_data_exported">Dane wyeksportowane do</string>
<string name="info_data_imported">Dane zaimportowane z</string>
<string name="info_set_filename">Ustaw nazwę pliku na</string>
<string name="info_enter_value_cm">Wprowadź wartość w cm</string>
<string name="info_enter_value_unit">Wprowadź wartość w</string>
<string name="info_enter_comment">Wprowadź opcjonlany komentarz</string>

View File

@@ -44,7 +44,6 @@
<string name="info_no_evaluation_available">Valor não pode ser processado</string>
<string name="info_on_date">em</string>
<string name="info_no_selected_user">Nenhum usuário existe. Por favor, crie um novo usuário em Configurações.</string>
<string name="info_set_filename">Definir nome de arquivo para</string>
<string name="info_step_on_scale">Por favor suba na balança para medidas de referência</string>
<string name="label_add_user">Adicionar usuário</string>
<string name="label_backup">Backup</string>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_overview">Prehľad</string>
<string name="title_overview">Prehľad</string>
<string name="title_graph">Graf</string>
<string name="title_table">Tabuľka</string>
<string name="title_statistics">Štatistiky</string>
@@ -64,7 +64,6 @@
<string name="info_data_all_deleted">Všetkých položky boli vymazané z databázy</string>
<string name="info_data_exported">Údaje boli exportované do</string>
<string name="info_data_imported">Údaje boli importované z</string>
<string name="info_set_filename">Nastaviť názov súboru na</string>
<string name="info_enter_value_cm">Zadajte hodnotu v cm</string>
<string name="info_enter_value_unit">Zadajte hodnotu v palcoch</string>
<string name="info_enter_comment">Zadajte voliteľný komentár</string>

View File

@@ -80,7 +80,6 @@
<string name="info_data_all_deleted">Alla databasposter borttagna</string>
<string name="info_data_exported">Data exporterad till</string>
<string name="info_data_imported">Data importerad från</string>
<string name="info_set_filename">Sätt filnamn till</string>
<string name="info_enter_value_cm">Ange värde i cm</string>
<string name="info_enter_value_unit">Ange värde i</string>
<string name="info_enter_comment">Ange en frivillig kommentar</string>
@@ -187,5 +186,6 @@
<string name="label_set_default_order">Ställ in standardordning</string>
<string name="label_weeks_view">Veckovy</string>
<string name="label_export_overwrite">Skriv över föregående export \"%s\"?</string>
</resources>

View File

@@ -76,7 +76,6 @@
<string name="info_data_all_deleted">Veri tabaný giriþi silindi</string>
<string name="info_data_exported">Veri dýþarý aktarma</string>
<string name="info_data_imported">Veri içeri aktarma</string>
<string name="info_set_filename">Dosya adýný ayarla</string>
<string name="info_enter_value_cm">Deðeri cm olarak girin</string>
<string name="info_enter_value_unit">Ýçine deðer girin</string>
<string name="info_enter_comment">Ýsteðebaðlý açýklama girin</string>

View File

@@ -88,7 +88,6 @@
<string name="info_data_all_deleted">All database entries deleted</string>
<string name="info_data_exported">Data exported to</string>
<string name="info_data_imported">Data imported from</string>
<string name="info_set_filename">Set filename to</string>
<string name="info_enter_value_cm">Enter value in cm</string>
<string name="info_enter_value_unit">Enter value in</string>
<string name="info_enter_comment">Enter an optional comment</string>
@@ -211,6 +210,7 @@
<string name="label_measurement_order">Measurement order</string>
<string name="label_press_hold_reorder">Press and hold to reorder</string>
<string name="label_set_default_order">Set default order</string>
<string name="label_export_overwrite">Overwrite previous export \"%s\"?</string>
</resources>