mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-29 19:20:36 +02:00
Merge branch 'master' of https://github.com/oliexdev/openScale
This commit is contained in:
@@ -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);
|
||||
|
@@ -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 |
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
@@ -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">på</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>
|
||||
|
Reference in New Issue
Block a user