1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-29 19:20:36 +02:00
This commit is contained in:
OliE
2018-02-24 07:39:16 +01:00
12 changed files with 187 additions and 237 deletions

View File

@@ -26,6 +26,7 @@ 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;
@@ -36,6 +37,7 @@ import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.FileProvider;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
@@ -45,12 +47,15 @@ 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;
import com.health.openscale.R;
import com.health.openscale.core.OpenScale;
import com.health.openscale.core.bluetooth.BluetoothCommunication;
import com.health.openscale.core.datatypes.ScaleMeasurement;
import com.health.openscale.core.datatypes.ScaleUser;
import com.health.openscale.gui.activities.DataEntryActivity;
import com.health.openscale.gui.activities.SettingsActivity;
import com.health.openscale.gui.activities.UserSettingsActivity;
@@ -60,6 +65,7 @@ import com.health.openscale.gui.fragments.StatisticsFragment;
import com.health.openscale.gui.fragments.TableFragment;
import com.health.openscale.gui.utils.PermissionHelper;
import java.io.File;
import java.lang.reflect.Field;
import cat.ereza.customactivityoncrash.config.CaocConfig;
@@ -71,6 +77,8 @@ public class MainActivity extends AppCompatActivity
private static int bluetoothStatusIcon = R.drawable.ic_bluetooth_disabled;
private static MenuItem bluetoothStatus;
private static final int IMPORT_DATA_REQUEST = 100;
private Fragment currentFragment;
private DrawerLayout drawerLayout;
private Toolbar toolbar;
@@ -383,6 +391,17 @@ public class MainActivity extends AppCompatActivity
case R.id.action_bluetooth_status:
invokeSearchBluetoothDevice();
return true;
case R.id.importData:
importCsvFile();
return true;
case R.id.exportData:
if (PermissionHelper.requestWritePermission(this)) {
exportCsvFile();
}
return true;
case R.id.shareData:
shareCsvFile();
return true;
}
return super.onOptionsItemSelected(item);
@@ -507,24 +526,128 @@ public class MainActivity extends AppCompatActivity
bluetoothStatus.setIcon(getResources().getDrawable(bluetoothStatusIcon));
}
private void importCsvFile() {
int selectedUserId = OpenScale.getInstance(getApplicationContext()).getSelectedScaleUserId();
if (selectedUserId == -1) {
AlertDialog.Builder infoDialog = new AlertDialog.Builder(this);
infoDialog.setMessage(getResources().getString(R.string.info_no_selected_user));
infoDialog.setPositiveButton(getResources().getString(R.string.label_ok), null);
infoDialog.show();
}
else {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/*");
startActivityForResult(
Intent.createChooser(intent, getResources().getString(R.string.label_import)),
IMPORT_DATA_REQUEST);
}
}
private void exportCsvFile() {
AlertDialog.Builder filenameDialog = new AlertDialog.Builder(this);
filenameDialog.setTitle(getResources().getString(R.string.info_set_filename) + " "
+ Environment.getExternalStorageDirectory().getPath());
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");
final EditText txtFilename = new EditText(this);
txtFilename.setText(exportFilename);
filenameDialog.setView(txtFilename);
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();
}
}
});
filenameDialog.setNegativeButton(getResources().getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
filenameDialog.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())) {
return;
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("text/csv");
final Uri uri = FileProvider.getUriForFile(
getApplicationContext(), BuildConfig.APPLICATION_ID + ".fileprovider", shareFile);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.putExtra(Intent.EXTRA_SUBJECT,
getResources().getString(R.string.label_share_subject, selectedScaleUser.getUserName()));
startActivity(Intent.createChooser(intent, getResources().getString(R.string.label_share)));
}
@Override
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());
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
boolean permissionGranted = true;
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
invokeSearchBluetoothDevice();
} else {
setBluetoothStatusIcon(R.drawable.ic_bluetooth_disabled);
Toast.makeText(getApplicationContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
permissionGranted = false;
}
break;
break;
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
exportCsvFile();
} else {
permissionGranted = false;
}
break;
}
if (!permissionGranted) {
Toast.makeText(getApplicationContext(), getResources().getString(
R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
}
currentFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@SuppressLint("RestrictedApi")
public static void disableShiftMode(BottomNavigationView view) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);

View File

@@ -15,75 +15,52 @@
*/
package com.health.openscale.gui.fragments;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import com.health.openscale.BuildConfig;
import com.health.openscale.R;
import com.health.openscale.core.OpenScale;
import com.health.openscale.core.datatypes.ScaleMeasurement;
import com.health.openscale.core.datatypes.ScaleUser;
import com.health.openscale.gui.activities.DataEntryActivity;
import com.health.openscale.gui.utils.PermissionHelper;
import com.health.openscale.gui.views.MeasurementView;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static android.app.Activity.RESULT_OK;
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
public class TableFragment extends Fragment implements FragmentUpdateListener {
private View tableView;
private ListView tableDataView;
private LinearLayout tableHeaderView;
private SharedPreferences prefs;
private LinearLayout subpageView;
private ImageView optionMenu;
private PopupMenu popup;
private List<MeasurementView> measurementViews;
private int selectedSubpageNr;
private static final String SELECTED_SUBPAGE_NR_KEY = "selectedSubpageNr";
private static final int IMPORT_DATA_REQUEST = 100;
public TableFragment() {
}
@@ -101,10 +78,6 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
tableDataView.setAdapter(new ListViewAdapter());
tableDataView.setOnItemClickListener(new onClickListenerRow());
optionMenu = (ImageView) tableView.findViewById(R.id.optionMenu);
prefs = PreferenceManager.getDefaultSharedPreferences(tableView.getContext());
if (savedInstanceState == null) {
selectedSubpageNr = 0;
}
@@ -119,37 +92,6 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
measurement.setUpdateViews(false);
}
optionMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popup.show();
}
});
popup = new PopupMenu(getContext(), optionMenu);
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.importData:
importTable();
return true;
case R.id.exportData:
if (PermissionHelper.requestWritePermission(getActivity())) {
exportTable();
}
return true;
case R.id.shareData:
shareTable();
return true;
default:
return false;
}
}
});
popup.getMenuInflater().inflate(R.menu.table_menu, popup.getMenu());
OpenScale.getInstance(getContext()).registerFragment(this);
return tableView;
@@ -215,6 +157,8 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
moveSubpageRight.setEnabled(selectedSubpageNr + 1 < subpageCount);
subpageView.addView(moveSubpageRight);
subpageView.setVisibility(subpageCount > 1 ? View.VISIBLE : View.GONE);
tableHeaderView.removeAllViews();
ArrayList<MeasurementView> visibleMeasurements = new ArrayList<>();
@@ -254,117 +198,6 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
}
}
@Override
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(getContext()).importData(data.getData());
}
}
private void importTable() {
int selectedUserId = OpenScale.getInstance(getContext()).getSelectedScaleUserId();
if (selectedUserId == -1) {
AlertDialog.Builder infoDialog = new AlertDialog.Builder(getContext());
infoDialog.setMessage(getResources().getString(R.string.info_no_selected_user));
infoDialog.setPositiveButton(getResources().getString(R.string.label_ok), null);
infoDialog.show();
}
else {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/*");
startActivityForResult(
Intent.createChooser(intent, getResources().getString(R.string.label_import)),
IMPORT_DATA_REQUEST);
}
}
private void exportTable() {
AlertDialog.Builder filenameDialog = new AlertDialog.Builder(getActivity());
filenameDialog.setTitle(getResources().getString(R.string.info_set_filename) + " " + Environment.getExternalStorageDirectory().getPath());
final ScaleUser selectedScaleUser = OpenScale.getInstance(getContext()).getSelectedScaleUser();
String exportFilename = prefs.getString("exportFilename" + selectedScaleUser.getId(), "openScale_data_" + selectedScaleUser.getUserName() + ".csv");
final EditText txtFilename = new EditText(tableView.getContext());
txtFilename.setText(exportFilename);
filenameDialog.setView(txtFilename);
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(getContext()).exportData(fullPath)) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(tableView.getContext());
prefs.edit().putString("exportFilename" + selectedScaleUser.getId(), txtFilename.getText().toString()).commit();
Toast.makeText(getContext(), getResources().getString(R.string.info_data_exported) + " " + fullPath, Toast.LENGTH_SHORT).show();
}
}
});
filenameDialog.setNegativeButton(getResources().getString(R.string.label_cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
filenameDialog.show();
}
private void shareTable() {
final ScaleUser selectedScaleUser = OpenScale.getInstance(getContext()).getSelectedScaleUser();
File shareFile = new File(getContext().getCacheDir(),
String.format("openScale %s.csv", selectedScaleUser.getUserName()));
if (!OpenScale.getInstance(getContext()).exportData(shareFile.getPath())) {
return;
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("text/csv");
final Uri uri = FileProvider.getUriForFile(
getContext(), BuildConfig.APPLICATION_ID + ".fileprovider", shareFile);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.putExtra(Intent.EXTRA_SUBJECT,
getResources().getString(R.string.label_share_subject, selectedScaleUser.getUserName()));
startActivity(Intent.createChooser(intent, getResources().getString(R.string.label_share)));
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_READ_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
importTable();
} else {
Toast.makeText(getContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
}
break;
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
exportTable();
} else {
Toast.makeText(getContext(), getResources().getString(R.string.permission_not_granted), Toast.LENGTH_SHORT).show();
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private class onClickListenerMoveSubpageLeft implements View.OnClickListener {
@Override
public void onClick(View v) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

View File

@@ -38,13 +38,6 @@
android:gravity="right"
android:layout_weight="0.9"
android:orientation="horizontal">
<ImageView
android:id="@+id/optionMenu"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="centerInside"
android:tint="@android:color/white"
app:srcCompat="@drawable/ic_share" />
</LinearLayout>
</LinearLayout>

View File

@@ -15,4 +15,19 @@
android:title="+"
app:showAsAction="always" />
<item
android:id="@+id/importData"
android:title="@string/label_import"
app:showAsAction="never"/>
<item
android:id="@+id/exportData"
android:title="@string/label_export"
app:showAsAction="never"/>
<item
android:id="@+id/shareData"
android:title="@string/label_share"
app:showAsAction="never"/>
</menu>

View File

@@ -1,16 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.openscale.MainActivity">
<item
android:id="@+id/importData"
android:title="@string/label_import"/>
<item
android:id="@+id/exportData"
android:title="@string/label_export"/>
<item
android:id="@+id/shareData"
android:title="@string/label_share"/>
</menu>

View File

@@ -6,10 +6,10 @@
<string name="title_statistics">Statistik</string>
<string name="title_users">Användare</string>
<string name="title_data">Data</string>
<string name="title_measurements">Mätningar</string>
<string name="title_measurements">Mätvärden</string>
<string name="title_about">Om</string>
<string name="action_settings">Inställningar</string>
<string name="action_bluetooth_status">Bluetooth status</string>
<string name="action_bluetooth_status">Bluetooth-status</string>
<string name="label_add">Lägg till</string>
<string name="label_cancel">Avbryt</string>
<string name="label_ok">Ok</string>
@@ -20,9 +20,9 @@
<string name="label_id">Id</string>
<string name="label_weight">Vikt</string>
<string name="label_bmi">Kroppsmasseindex (BMI)</string>
<string name="label_bmr">Basalomsättning (BMR)</string>
<string name="label_fat">Procentdel kroppsfett</string>
<string name="label_water">Procentdel vatten</string>
<string name="label_bmr">Basal ämnesomsättning (BMR)</string>
<string name="label_fat">Kroppsfett</string>
<string name="label_water">Vatten</string>
<string name="Monday">Måndag</string>
<string name="Tuesday">Tisdag</string>
<string name="Wednesday">Onsdag</string>
@@ -30,12 +30,12 @@
<string name="Friday">Fredag</string>
<string name="Saturday">Lördag</string>
<string name="Sunday">Söndag</string>
<string name="label_backup">Backup</string>
<string name="label_backup">Säkerhetskopia</string>
<string name="default_value_reminder_notify_text">Dags att väga</string>
<string name="info_your_weight">Din vikt var</string>
<string name="info_your_fat">Din mängd kroppsfett var</string>
<string name="info_your_water">Din procentdel vatten var</string>
<string name="info_your_muscle">Din procentdel muskler var</string>
<string name="info_your_water">Din andel vatten var</string>
<string name="info_your_muscle">Din andel muskler var</string>
<string name="label_reminder_time">Tid</string>
<string name="label_reminder_weekdays">Veckodagar</string>
<string name="label_website">Hemsida</string>
@@ -65,9 +65,9 @@
<string name="label_measures">mätningar</string>
<string name="label_last_week">Senast 7 dagarna</string>
<string name="label_last_month">Senast 30 dagarna</string>
<string name="label_muscle">Procentdel muskler</string>
<string name="label_muscle">Muskler</string>
<string name="label_lbw">Fettfri kroppsvikt</string>
<string name="label_waist">Midjeomkrets</string>
<string name="label_waist">Midjemått</string>
<string name="label_hip">Höftomkrets</string>
<string name="label_comment">Kommentar</string>
<string name="label_whr">Midja-höft-kvot</string>
@@ -75,17 +75,17 @@
<string name="label_bone">Benmassa</string>
<string name="label_smartUserAssign">Smart tilldelning av användare</string>
<string name="label_title_statistics">statistik</string>
<string name="label_import">Import</string>
<string name="label_export">Export</string>
<string name="label_import">Importera</string>
<string name="label_export">Exportera</string>
<string name="label_delete_all">Ta bort alla</string>
<string name="error_value_required">Värde krävs</string>
<string name="error_value_range">Värdet är inte inom gränserna</string>
<string name="error_value_range">Värdet är inte inom intervallet</string>
<string name="error_importing">Fel vid import</string>
<string name="error_user_name_required">Fel: användarnamn krävs</string>
<string name="error_user_name_required">Fel: namn krävs</string>
<string name="error_body_height_required">Fel: längd krävs</string>
<string name="error_initial_weight_required">Fel: initial vikt krävs</string>
<string name="error_initial_weight_required">Fel: startvikt krävs</string>
<string name="error_goal_weight_required">Fel: målvikt krävs</string>
<string name="error_hip_value_required">Höftomkrets krävs</string>
<string name="error_hip_value_required">höftomkrets krävs</string>
<string name="info_data_deleted">Databaspost borttagen</string>
<string name="info_data_all_deleted">Alla databasposter borttagna</string>
<string name="info_data_exported">Data exporterad till</string>
@@ -95,26 +95,26 @@
<string name="info_enter_value_percent">Ange värde i %</string>
<string name="info_enter_value_unit">Ange värde i</string>
<string name="info_enter_comment">Ange en frivillig kommentar</string>
<string name="info_enter_initial_weight">Ange din initiala vikt i din viktenhet</string>
<string name="info_enter_initial_weight">Ange din startvikt i din viktenhet</string>
<string name="info_enter_goal_weight">Ange din målvikt i din viktenhet</string>
<string name="info_is_visible">är synlig</string>
<string name="info_is_not_visible">är inte synlig</string>
<string name="info_is_enable">är påslagen</string>
<string name="info_is_not_enable">är avslagen</string>
<string name="info_is_enable">är aktiverad</string>
<string name="info_is_not_enable">är inaktiverad</string>
<string name="info_is_not_available">är inte tillgänglig</string>
<string name="info_delete_bluetooth_data">Rensa all Bluetooth-data</string>
<string name="info_delete_bluetooth_data_success">Bluetooth-datan togs bort</string>
<string name="info_delete_bluetooth_data_success">Bluetooth-data togs bort</string>
<string name="info_bluetooth_try_connection">Försöker ansluta till</string>
<string name="info_bluetooth_connection_lost">Förlorade Bluetooth-anslutningen</string>
<string name="info_bluetooth_no_device">Ingen Bluetooth-enhet funnen</string>
<string name="info_bluetooth_connection_successful">Anslutning upprättad</string>
<string name="info_bluetooth_no_device">Ingen Bluetooth-enhet hittades</string>
<string name="info_bluetooth_connection_successful">Anslutning etablerad</string>
<string name="info_bluetooth_init">Initiera Bluetooth-enhet</string>
<string name="info_bluetooth_connection_error">Bluetooth stötte på ett oväntat fel</string>
<string name="info_new_data_added">La till %1$.2f%2$s [%3$s] till %4$s</string>
<string name="info_enter_user_name">Ange ditt namn</string>
<string name="info_no_selected_user">Ingen användare finns. Skapa en ny användare i inställningarna.</string>
<string name="info_no_evaluation_available">Kan inte evaluera värdet</string>
<string name="question_really_delete">Vill du verkligen ta bort databasposten?</string>
<string name="info_no_evaluation_available">Kan inte utvärdera värdet</string>
<string name="question_really_delete">Vill du verkligen ta bort databaspost?</string>
<string name="question_really_delete_all">Vill du verkligen ta bort alla databasposter?</string>
<string name="question_really_delete_user">Vill du verkligen ta bort användaren?</string>
<string name="label_bluetooth_title">Bluetooth</string>
@@ -123,32 +123,32 @@
<string name="label_device_type">Enhetstyp</string>
<string name="label_enable_labels">Etikett på datapunkt</string>
<string name="label_enable_points">Punkt på datapunkt</string>
<string name="label_delete_confirmation">Fråga vid borttagande</string>
<string name="label_estimate_water">Estimera kroppsvatten</string>
<string name="label_delete_confirmation">Borttagningsbekräftelse</string>
<string name="label_estimate_water">Estimera vatten</string>
<string name="label_estimate_lbw">Estimera fettfri kroppsvikt</string>
<string name="label_estimate_fat">Estimera kroppsfett</string>
<string name="label_category_display">Visa</string>
<string name="label_category_body_metrics_estimation">Kroppmätetals-estimering</string>
<string name="label_category_body_metrics_estimation">Uppskatta mätvärden</string>
<string name="label_category_measurement_database">Mätningsdatabas</string>
<string name="label_maintainer">Utvecklare</string>
<string name="label_estimate_water_formula">Kroppsvattenformel</string>
<string name="label_estimate_water_formula">Vattenformel</string>
<string name="label_estimate_lbw_formula">Fettfri kroppsvikt-formel</string>
<string name="label_estimate_fat_formula">Kroppsfettformel</string>
<string name="label_automatic">auto</string>
<string name="label_reminder">Påminnelse</string>
<string name="label_reminder_notify_text">Meddelandetext</string>
<string name="info_your_waist">Din midjeomkrets var</string>
<string name="info_your_waist">Ditt midjemått var</string>
<string name="info_your_hip">Din höftomkrets var</string>
<string name="info_on_date"></string>
<string name="label_bt_device_no_support">enheten stöds inte</string>
<string name="label_exportBackup">Export backup</string>
<string name="label_importBackup">Import backup</string>
<string name="label_exportBackup">Exportera säkerhetskopia</string>
<string name="label_importBackup">Importera säkerhetskopia</string>
<string name="label_export_dir">Exportkatalog</string>
<string name="label_not_found">hittades inte</string>
<string name="label_ignoreOutOfRange">Ignorera data utanför gränserna</string>
<string name="label_initial_weight">Initial vikt</string>
<string name="label_ignoreOutOfRange">Ignorera data som är utanför intervallet</string>
<string name="label_initial_weight">Startvikt</string>
<string name="label_average_data">Beräkna medelvärde per dag/månad</string>
<string name="label_regression_line">Regressionsviktlinje</string>
<string name="label_regression_line">Vikt regressionslinje</string>
<string name="label_regression_line_degree">Regressions-polynom-gradtal</string>
<string name="label_goal_line">Mållinje</string>
<string name="error_max_scale_users">Maximalt antal samtidiga våganvändare har nåtts</string>
@@ -166,19 +166,19 @@
<string name="label_theme">Tema</string>
<string name="label_feedback_message_enjoying">Uppskattar du openScale?</string>
<string name="label_feedback_message_rate_app">Vad sägs om ett betyg på GooglePlay eller på GitHub?</string>
<string name="label_feedback_message_issue">Skulle du ha något emot att ge oss lite återkoppling?</string>
<string name="label_feedback_message_issue">Skulle du kunna ge oss lite återkoppling?</string>
<string name="label_feedback_message_yes">Ja!</string>
<string name="label_feedback_message_no">Inte riktigt</string>
<string name="label_feedback_message_positive">Ok, visst</string>
<string name="label_feedback_message_negative">Nej tack</string>
<string name="customactivityoncrash_error_activity_error_occurred_explanation">Ett oväntat fel uppstod.\n\nVänligen skapa ett nytt ärende med den detaljerade felinformation på\nhttps://github.com/oliexdev/openScale/issues</string>
<string name="customactivityoncrash_error_activity_restart_app">Starta om appen</string>
<string name="customactivityoncrash_error_activity_close_app">Stäng appen</string>
<string name="customactivityoncrash_error_activity_restart_app">Starta om app</string>
<string name="customactivityoncrash_error_activity_close_app">Stäng app</string>
<string name="customactivityoncrash_error_activity_error_details">Felinformation</string>
<string name="customactivityoncrash_error_activity_error_details_title">Felinformation</string>
<string name="customactivityoncrash_error_activity_error_details_close">Stäng</string>
<string name="customactivityoncrash_error_activity_error_details_copy">Kopiera till urklipp</string>
<string name="customactivityoncrash_error_activity_error_details_copied">Kopierad till urklipp</string>
<string name="customactivityoncrash_error_activity_error_details_copied">Kopierat till urklipp</string>
<string name="customactivityoncrash_error_activity_error_details_clipboard_label">Felinformation</string>
<string name="save">Spara</string>
@@ -195,11 +195,13 @@
<string name="permission_bluetooth_info">openScale kräver åtkomst till grov platsbestämning för att söka efter Bluetooth-enheter</string>
<string name="permission_bluetooth_info_title">Information</string>
<string name="label_share_subject">openScale CSV data export (%s)</string>
<string name="label_share_subject">openScale CSV dataexport (%s)</string>
<string name="label_next">Nästa</string>
<string name="label_measurement_order">Mätordning</string>
<string name="label_press_hold_reorder">Tryck och håll för att ordna om</string>
<string name="label_set_default_order">Sätt standardordningen</string>
<string name="label_press_hold_reorder">Tryck och håll för att ändra ordning</string>
<string name="label_set_default_order">Ställ in standardordning</string>
</resources>
<string name="label_weeks_view">Veckovy</string>
</resources>