diff --git a/app/app.iml b/app/app.iml
index a5482ec17..a4d4a813e 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -1,5 +1,5 @@
-
+
@@ -12,8 +12,9 @@
-
+
+
@@ -85,13 +86,13 @@
-
+
+
+
-
-
+
-
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index cc59358c3..19fce4e29 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -7,8 +7,8 @@ android {
applicationId "no.nordicsemi.android.nrftoolbox"
minSdkVersion 18
targetSdkVersion 22
- versionCode 32
- versionName "1.13.1"
+ versionCode 33
+ versionName "1.14.0"
}
buildTypes {
release {
@@ -20,7 +20,8 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:22.1.1'
+ compile 'com.android.support:appcompat-v7:22.2.0'
+ compile 'com.android.support:design:22.2.0'
compile project(':..:DFULibrary:dfu')
compile files('libs/achartengine-1.1.0.jar')
compile files('libs/nrf-logger-v2.0.jar')
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2547c9ff1..e2de82acc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,8 +23,8 @@
+ android:versionCode="33"
+ android:versionName="1.14.1" >
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/AppHelpFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/AppHelpFragment.java
index 174eed8a7..ea5e299c3 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/AppHelpFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/AppHelpFragment.java
@@ -21,11 +21,12 @@
*/
package no.nordicsemi.android.nrftoolbox;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
public class AppHelpFragment extends DialogFragment {
private static final String ARG_TEXT = "ARG_TEXT";
@@ -54,6 +55,7 @@ public static AppHelpFragment getInstance(final int aboutResId) {
}
@Override
+ @NonNull
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Bundle args = getArguments();
final StringBuilder text = new StringBuilder(getString(args.getInt(ARG_TEXT)));
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/FeaturesActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/FeaturesActivity.java
index 05cea846c..af608004e 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/FeaturesActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/FeaturesActivity.java
@@ -34,8 +34,9 @@
import android.os.Bundle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -50,7 +51,7 @@
import no.nordicsemi.android.nrftoolbox.adapter.AppAdapter;
-public class FeaturesActivity extends ActionBarActivity {
+public class FeaturesActivity extends AppCompatActivity {
private static final String MCP_CATEGORY = "no.nordicsemi.android.nrftoolbox.LAUNCHER";
private static final String UTILS_CATEGORY = "no.nordicsemi.android.nrftoolbox.UTILS";
private static final String MCP_PACKAGE = "no.nordicsemi.android.mcp";
@@ -65,6 +66,9 @@ protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_features);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+
// ensure that Bluetooth exists
if (!ensureBLEExists())
finish();
@@ -73,7 +77,13 @@ protected void onCreate(final Bundle savedInstanceState) {
drawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// Set the drawer toggle as the DrawerListener
- mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close);
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) {
+ @Override
+ public void onDrawerSlide(final View drawerView, final float slideOffset) {
+ // Disable the Hamburger icon animation
+ super.onDrawerSlide(drawerView, 0);
+ }
+ };
drawer.setDrawerListener(mDrawerToggle);
// setup plug-ins in the drawer
@@ -117,7 +127,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case R.id.action_about:
final AppHelpFragment fragment = AppHelpFragment.getInstance(R.string.about_text, true);
- fragment.show(getFragmentManager(), null);
+ fragment.show(getSupportFragmentManager(), null);
break;
}
return true;
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/app/ExpandableListActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/app/ExpandableListActivity.java
index aabd9fad7..1e80c4ed0 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/app/ExpandableListActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/app/ExpandableListActivity.java
@@ -19,7 +19,8 @@
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View;
@@ -132,7 +133,7 @@
* @see #setListAdapter
* @see android.widget.ExpandableListView
*/
-public class ExpandableListActivity extends ActionBarActivity implements
+public class ExpandableListActivity extends AppCompatActivity implements
OnCreateContextMenuListener,
ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener,
ExpandableListView.OnGroupExpandListener {
@@ -182,7 +183,7 @@ public void onGroupExpand(int groupPosition) {
* @see Activity#onRestoreInstanceState(Bundle)
*/
@Override
- protected void onRestoreInstanceState(Bundle state) {
+ protected void onRestoreInstanceState(@NonNull Bundle state) {
ensureList();
super.onRestoreInstanceState(state);
}
@@ -190,10 +191,10 @@ protected void onRestoreInstanceState(Bundle state) {
/**
* Updates the screen state (current list and other views) when the content changes.
*
- * @see ActionBarActivity#onSupportContentChanged()
+ * @see android.support.v7.app.AppCompatActivity#onContentChanged()
*/
@Override
- public void onSupportContentChanged() {
+ public void onContentChanged() {
super.onContentChanged();
View emptyView = findViewById(R.id.empty);
mList = (ExpandableListView) findViewById(R.id.list);
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/bpm/BPMActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/bpm/BPMActivity.java
index 7070575b0..253d96f54 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/bpm/BPMActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/bpm/BPMActivity.java
@@ -46,7 +46,7 @@ public class BPMActivity extends BleProfileActivity implements BPMManagerCallbac
private TextView mTimestampView;
@Override
- protected void onCreateView(Bundle savedInstanceState) {
+ protected void onCreateView(final Bundle savedInstanceState) {
setContentView(R.layout.activity_feature_bpm);
setGUI();
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/csc/settings/SettingsActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/csc/settings/SettingsActivity.java
index a88e50a01..b4e60d1d1 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/csc/settings/SettingsActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/csc/settings/SettingsActivity.java
@@ -23,19 +23,25 @@
package no.nordicsemi.android.nrftoolbox.csc.settings;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
-public class SettingsActivity extends ActionBarActivity {
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+ getFragmentManager().beginTransaction().replace(R.id.content, new SettingsFragment()).commit();
}
@Override
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuActivity.java
index bb01dc25f..a60d85bd5 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuActivity.java
@@ -23,8 +23,6 @@
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
-import android.app.AlertDialog;
-import android.app.FragmentManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.NotificationManager;
import android.bluetooth.BluetoothAdapter;
@@ -47,8 +45,9 @@
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
@@ -81,7 +80,7 @@
* DeviceScannerFragment.OnDeviceSelectedListener callback to receive callback when device is selected from scanning dialog The activity supports portrait and
* landscape orientations
*/
-public class DfuActivity extends ActionBarActivity implements LoaderCallbacks, ScannerFragment.OnDeviceSelectedListener,
+public class DfuActivity extends AppCompatActivity implements LoaderCallbacks, ScannerFragment.OnDeviceSelectedListener,
UploadCancelFragment.CancelFragmentListener {
private static final String TAG = "DfuActivity";
@@ -197,8 +196,9 @@ protected void onSaveInstanceState(final Bundle outState) {
}
private void setGUI() {
- final ActionBar actionBar = getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDeviceNameView = (TextView) findViewById(R.id.device_name);
mFileNameView = (TextView) findViewById(R.id.file_name);
@@ -270,9 +270,8 @@ private void showBLEDialog() {
}
private void showDeviceScanningDialog() {
- final FragmentManager fm = getFragmentManager();
final ScannerFragment dialog = ScannerFragment.getInstance(DfuActivity.this, null, false); // Device that is advertising directly does not have the GENERAL_DISCOVERABLE nor LIMITED_DISCOVERABLE flag set.
- dialog.show(fm, "scan_fragment");
+ dialog.show(getSupportFragmentManager(), "scan_fragment");
}
private void ensureSamplesExist() {
@@ -436,7 +435,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
break;
case R.id.action_about:
final AppHelpFragment fragment = AppHelpFragment.getInstance(R.string.dfu_about_text);
- fragment.show(getFragmentManager(), "help_fragment");
+ fragment.show(getSupportFragmentManager(), "help_fragment");
break;
case R.id.action_settings:
final Intent intent = new Intent(this, SettingsActivity.class);
@@ -676,7 +675,7 @@ public void onClick(final DialogInterface dialog, final int which) {
@Override
public void onClick(final DialogInterface dialog, final int which) {
final ZipInfoFragment fragment = new ZipInfoFragment();
- fragment.show(getFragmentManager(), "help_fragment");
+ fragment.show(getSupportFragmentManager(), "help_fragment");
}
}).setNegativeButton(R.string.cancel, null).show();
}
@@ -763,7 +762,7 @@ private void showUploadCancelDialog() {
manager.sendBroadcast(pauseAction);
final UploadCancelFragment fragment = UploadCancelFragment.getInstance();
- fragment.show(getFragmentManager(), TAG);
+ fragment.show(getSupportFragmentManager(), TAG);
}
/**
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuInitiatorActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuInitiatorActivity.java
index 9d2798f1b..77c0fffef 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuInitiatorActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/DfuInitiatorActivity.java
@@ -22,10 +22,10 @@
package no.nordicsemi.android.nrftoolbox.dfu;
-import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
import no.nordicsemi.android.nrftoolbox.scanner.ScannerFragment;
@@ -33,7 +33,7 @@
* The activity is started only by a remote connected computer using ADB. It shows a list of DFU-supported devices in range and allows user to select target device. The HEX file will be uploaded to
* selected device using {@link DfuService}.
*/
-public class DfuInitiatorActivity extends Activity implements ScannerFragment.OnDeviceSelectedListener {
+public class DfuInitiatorActivity extends AppCompatActivity implements ScannerFragment.OnDeviceSelectedListener {
@Override
protected void onCreate(final Bundle savedInstanceState) {
@@ -46,7 +46,7 @@ protected void onCreate(final Bundle savedInstanceState) {
if (savedInstanceState == null) {
final ScannerFragment fragment = ScannerFragment.getInstance(this, null, false); // Device that is advertising directly does not have the GENERAL_DISCOVERABLE nor LIMITED_DISCOVERABLE flag set.
- fragment.show(getFragmentManager(), null);
+ fragment.show(getSupportFragmentManager(), null);
}
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/UploadCancelFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/UploadCancelFragment.java
index a9df2d39f..098030ea6 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/UploadCancelFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/UploadCancelFragment.java
@@ -22,13 +22,14 @@
package no.nordicsemi.android.nrftoolbox.dfu.fragment;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.app.AlertDialog;
import android.util.Log;
import no.nordicsemi.android.nrftoolbox.R;
@@ -61,7 +62,8 @@ public void onAttach(final Activity activity) {
}
}
- @Override
+ @NonNull
+ @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity()).setTitle(R.string.dfu_confirmation_dialog_title).setMessage(R.string.dfu_upload_dialog_cancel_message).setCancelable(false)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/ZipInfoFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/ZipInfoFragment.java
index f3ccd93d8..c9979a3fa 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/ZipInfoFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/fragment/ZipInfoFragment.java
@@ -21,10 +21,11 @@
*/
package no.nordicsemi.android.nrftoolbox.dfu.fragment;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
@@ -33,6 +34,7 @@
public class ZipInfoFragment extends DialogFragment {
@Override
+ @NonNull
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_zip_info, null);
return new AlertDialog.Builder(getActivity()).setView(view).setTitle(R.string.dfu_file_info).setPositiveButton(R.string.ok, null).create();
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsActivity.java
index e9614fc74..c9d9fc80b 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsActivity.java
@@ -23,19 +23,25 @@
package no.nordicsemi.android.nrftoolbox.dfu.settings;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
-public class SettingsActivity extends ActionBarActivity {
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+ getFragmentManager().beginTransaction().replace(R.id.content, new SettingsFragment()).commit();
}
@Override
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsFragment.java
index b939ce91c..c9aec8446 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/dfu/settings/SettingsFragment.java
@@ -21,11 +21,12 @@
*/
package no.nordicsemi.android.nrftoolbox.dfu.settings;
-import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
+import android.support.v7.app.AlertDialog;
+import android.text.TextUtils;
import no.nordicsemi.android.dfu.DfuSettingsConstants;
import no.nordicsemi.android.nrftoolbox.R;
@@ -81,8 +82,13 @@ private void updateNumberOfPacketsSummary() {
final PreferenceScreen screen = getPreferenceScreen();
final SharedPreferences preferences = getPreferenceManager().getSharedPreferences();
- final String value = preferences.getString(SETTINGS_NUMBER_OF_PACKETS, String.valueOf(SETTINGS_NUMBER_OF_PACKETS_DEFAULT));
- screen.findPreference(SETTINGS_NUMBER_OF_PACKETS).setSummary(value);
+ String value = preferences.getString(SETTINGS_NUMBER_OF_PACKETS, String.valueOf(SETTINGS_NUMBER_OF_PACKETS_DEFAULT));
+ // Security check
+ if (TextUtils.isEmpty(value)) {
+ value = String.valueOf(SETTINGS_NUMBER_OF_PACKETS_DEFAULT);
+ preferences.edit().putString(SETTINGS_NUMBER_OF_PACKETS, value).apply();
+ }
+ screen.findPreference(SETTINGS_NUMBER_OF_PACKETS).setSummary(value);
final int valueInt = Integer.parseInt(value);
if (valueInt > 200) {
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/gls/GlucoseManager.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/gls/GlucoseManager.java
index d940b4c04..9f3e69254 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/gls/GlucoseManager.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/gls/GlucoseManager.java
@@ -512,7 +512,7 @@ public void abort() {
/**
* Sends the request to delete all data from the device. A Record Access Control Point indication with status code ({@link #RESPONSE_SUCCESS} (or other in case of error) will be send.
*
- * @FIXME This method is not supported by Nordic Semiconductor Glucose Service in SDK 4.4.2.
+ * FIXME This method is not supported by Nordic Semiconductor Glucose Service in SDK 4.4.2.
*/
public void deleteAllRecords() {
if (mRecordAccessControlPointCharacteristic == null)
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/hrs/HRSActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/hrs/HRSActivity.java
index 7817a32ae..9c229e287 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/hrs/HRSActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/hrs/HRSActivity.java
@@ -24,6 +24,7 @@
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
+import android.support.annotation.NonNull;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -83,7 +84,7 @@ private void showGraph() {
}
@Override
- protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/hts/settings/SettingsActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/hts/settings/SettingsActivity.java
index 3c548fcec..77d0a20b8 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/hts/settings/SettingsActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/hts/settings/SettingsActivity.java
@@ -23,19 +23,25 @@
package no.nordicsemi.android.nrftoolbox.hts.settings;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
-public class SettingsActivity extends ActionBarActivity {
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+ getFragmentManager().beginTransaction().replace(R.id.content, new SettingsFragment()).commit();
}
@Override
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/parser/TemplateParser.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/parser/TemplateParser.java
index df1361728..6d244353d 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/parser/TemplateParser.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/parser/TemplateParser.java
@@ -23,9 +23,6 @@
import android.bluetooth.BluetoothGattCharacteristic;
-import java.util.ArrayList;
-import java.util.List;
-
// TODO this method may be used for developing purposes to log the data from your device using the nRF Logger application.
public class TemplateParser {
// TODO add some flags, if needed
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileActivity.java
index 0f8de7361..c7b04289e 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileActivity.java
@@ -29,7 +29,9 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -47,7 +49,7 @@
import no.nordicsemi.android.nrftoolbox.scanner.ScannerFragment;
import no.nordicsemi.android.nrftoolbox.utility.DebugLogger;
-public abstract class BleProfileActivity extends ActionBarActivity implements BleManagerCallbacks, ScannerFragment.OnDeviceSelectedListener {
+public abstract class BleProfileActivity extends AppCompatActivity implements BleManagerCallbacks, ScannerFragment.OnDeviceSelectedListener {
private static final String TAG = "BaseProfileActivity";
private static final String CONNECTION_STATUS = "connection_status";
@@ -82,6 +84,10 @@ protected final void onCreate(final Bundle savedInstanceState) {
mBleManager = initializeManager();
onInitialize(savedInstanceState);
onCreateView(savedInstanceState);
+
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+
onViewCreated(savedInstanceState);
}
@@ -128,7 +134,7 @@ protected void onSaveInstanceState(final Bundle outState) {
}
@Override
- protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mDeviceConnected = savedInstanceState.getBoolean(CONNECTION_STATUS);
mDeviceName = savedInstanceState.getString(DEVICE_NAME);
@@ -167,7 +173,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
break;
case R.id.action_about:
final AppHelpFragment fragment = AppHelpFragment.getInstance(getAboutTextId());
- fragment.show(getFragmentManager(), "help_fragment");
+ fragment.show(getSupportFragmentManager(), "help_fragment");
break;
default:
return onOptionsItemSelected(id);
@@ -407,7 +413,7 @@ private void showDeviceScanningDialog(final UUID filter, final boolean discovera
@Override
public void run() {
final ScannerFragment dialog = ScannerFragment.getInstance(BleProfileActivity.this, filter, discoverableRequired);
- dialog.show(getFragmentManager(), "scan_fragment");
+ dialog.show(getSupportFragmentManager(), "scan_fragment");
}
});
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileExpandableListActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileExpandableListActivity.java
index c9433866a..edddbeb2c 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileExpandableListActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileExpandableListActivity.java
@@ -29,6 +29,7 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -82,6 +83,10 @@ protected final void onCreate(final Bundle savedInstanceState) {
mBleManager = initializeManager();
onInitialize(savedInstanceState);
onCreateView(savedInstanceState);
+
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+
onViewCreated(savedInstanceState);
}
@@ -165,7 +170,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
break;
case R.id.action_about:
final AppHelpFragment fragment = AppHelpFragment.getInstance(getAboutTextId());
- fragment.show(getFragmentManager(), "help_fragment");
+ fragment.show(getSupportFragmentManager(), "help_fragment");
break;
default:
return onOptionsItemSelected(id);
@@ -413,7 +418,7 @@ private void showDeviceScanningDialog(final UUID filter, final boolean discovera
@Override
public void run() {
final ScannerFragment dialog = ScannerFragment.getInstance(BleProfileExpandableListActivity.this, filter, discoverableRequired);
- dialog.show(getFragmentManager(), "scan_fragment");
+ dialog.show(getSupportFragmentManager(), "scan_fragment");
}
});
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileServiceReadyActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileServiceReadyActivity.java
index 7858eab05..d7121aa3c 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileServiceReadyActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/profile/BleProfileServiceReadyActivity.java
@@ -36,8 +36,10 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
+import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -67,7 +69,7 @@
* listens for it. When entering back to the activity, activity will to bind to the service and refresh UI.
*
*/
-public abstract class BleProfileServiceReadyActivity extends ActionBarActivity implements
+public abstract class BleProfileServiceReadyActivity extends AppCompatActivity implements
ScannerFragment.OnDeviceSelectedListener, BleManagerCallbacks {
private static final String TAG = "BleProfileServiceReadyActivity";
@@ -213,6 +215,10 @@ protected final void onCreate(final Bundle savedInstanceState) {
*/
onInitialize(savedInstanceState);
onCreateView(savedInstanceState);
+
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+
onViewCreated(savedInstanceState);
LocalBroadcastManager.getInstance(this).registerReceiver(mCommonBroadcastReceiver, makeIntentFilter());
@@ -343,7 +349,7 @@ protected void onSaveInstanceState(final Bundle outState) {
}
@Override
- protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mDeviceName = savedInstanceState.getString(DEVICE_NAME);
}
@@ -374,7 +380,7 @@ public boolean onOptionsItemSelected(final MenuItem item) {
break;
case R.id.action_about:
final AppHelpFragment fragment = AppHelpFragment.getInstance(getAboutTextId());
- fragment.show(getFragmentManager(), "help_fragment");
+ fragment.show(getSupportFragmentManager(), "help_fragment");
break;
default:
return onOptionsItemSelected(id);
@@ -643,7 +649,7 @@ protected boolean isDiscoverableRequired() {
*/
private void showDeviceScanningDialog(final UUID filter, final boolean discoverableRequired) {
final ScannerFragment dialog = ScannerFragment.getInstance(BleProfileServiceReadyActivity.this, filter, discoverableRequired);
- dialog.show(getFragmentManager(), "scan_fragment");
+ dialog.show(getSupportFragmentManager(), "scan_fragment");
}
/**
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/LinklossFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/LinklossFragment.java
index 78a52d878..15d4f3332 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/LinklossFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/LinklossFragment.java
@@ -21,10 +21,11 @@
*/
package no.nordicsemi.android.nrftoolbox.proximity;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
import no.nordicsemi.android.nrftoolbox.R;
@@ -50,7 +51,8 @@ public void onCreate(Bundle savedInstanceState) {
mName = getArguments().getString(ARG_NAME);
}
- @Override
+ @NonNull
+ @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity()).setTitle(getString(R.string.app_name)).setMessage(getString(R.string.proximity_notification_linkloss_alert, mName))
.setPositiveButton(R.string.ok, null).create();
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityActivity.java
index d87db8943..2f4933d1d 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityActivity.java
@@ -21,7 +21,6 @@
*/
package no.nordicsemi.android.nrftoolbox.proximity;
-import android.app.FragmentManager;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
@@ -201,9 +200,8 @@ private void showClosedLock() {
private void showLinklossDialog(final String name) {
try {
- FragmentManager fm = getFragmentManager();
- LinklossFragment dialog = LinklossFragment.getInstance(name);
- dialog.show(fm, "scan_fragment");
+ final LinklossFragment dialog = LinklossFragment.getInstance(name);
+ dialog.show(getSupportFragmentManager(), "scan_fragment");
} catch (final Exception e) {
// the activity must have been destroyed
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/RSCActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/RSCActivity.java
index b298bc9b8..820f8d4aa 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/RSCActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/RSCActivity.java
@@ -105,19 +105,19 @@ private void setUnits() {
switch (unit) {
case SettingsFragment.SETTINGS_UNIT_M_S: // [m/s]
- mSpeedUnitView.setText(R.string.csc_speed_unit_m_s);
- mDistanceUnitView.setText(R.string.csc_distance_unit_m);
- mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
+ mSpeedUnitView.setText(R.string.rsc_speed_unit_m_s);
+ mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
+ mTotalDistanceUnitView.setText(R.string.rsc_total_distance_unit_km);
break;
case SettingsFragment.SETTINGS_UNIT_KM_H: // [km/h]
- mSpeedUnitView.setText(R.string.csc_speed_unit_km_h);
- mDistanceUnitView.setText(R.string.csc_distance_unit_m);
- mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_km);
+ mSpeedUnitView.setText(R.string.rsc_speed_unit_km_h);
+ mDistanceUnitView.setText(R.string.rsc_distance_unit_m);
+ mTotalDistanceUnitView.setText(R.string.rsc_total_distance_unit_km);
break;
case SettingsFragment.SETTINGS_UNIT_MPH: // [mph]
- mSpeedUnitView.setText(R.string.csc_speed_unit_mph);
- mDistanceUnitView.setText(R.string.csc_distance_unit_yd);
- mTotalDistanceUnitView.setText(R.string.csc_total_distance_unit_mile);
+ mSpeedUnitView.setText(R.string.rsc_speed_unit_mph);
+ mDistanceUnitView.setText(R.string.rsc_distance_unit_yd);
+ mTotalDistanceUnitView.setText(R.string.rsc_total_distance_unit_mile);
break;
}
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/settings/SettingsActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/settings/SettingsActivity.java
index 53a001aae..1d27b4b55 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/settings/SettingsActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/rsc/settings/SettingsActivity.java
@@ -23,19 +23,25 @@
package no.nordicsemi.android.nrftoolbox.rsc.settings;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
-public class SettingsActivity extends ActionBarActivity {
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+ getFragmentManager().beginTransaction().replace(R.id.content, new SettingsFragment()).commit();
}
@Override
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/scanner/ScannerFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/scanner/ScannerFragment.java
index 318e4bea6..2b758fab0 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/scanner/ScannerFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/scanner/ScannerFragment.java
@@ -22,9 +22,7 @@
package no.nordicsemi.android.nrftoolbox.scanner;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
@@ -33,6 +31,9 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.ParcelUuid;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
@@ -144,7 +145,8 @@ public void onDestroyView() {
/**
* When dialog is created then set AlertDialog with list and button views.
*/
- @Override
+ @NonNull
+ @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final View dialogView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_device_selection, null);
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/template/settings/SettingsActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/template/settings/SettingsActivity.java
index b64b1482c..e5b61daca 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/template/settings/SettingsActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/template/settings/SettingsActivity.java
@@ -23,19 +23,25 @@
package no.nordicsemi.android.nrftoolbox.template.settings;
import android.os.Bundle;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
-public class SettingsActivity extends ActionBarActivity {
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
- getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
+ getFragmentManager().beginTransaction().replace(R.id.content, new SettingsFragment()).commit();
}
@Override
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTActivity.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTActivity.java
index ddca15a09..800b909b1 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTActivity.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTActivity.java
@@ -32,6 +32,7 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.v4.widget.SlidingPaneLayout;
import android.view.View;
@@ -76,7 +77,7 @@ protected void onCreateView(final Bundle savedInstanceState) {
@Override
public void onPanelClosed(final View panel) {
// Close the keyboard
- final UARTLogFragment logFragment = (UARTLogFragment) getFragmentManager().findFragmentById(R.id.fragment_log);
+ final UARTLogFragment logFragment = (UARTLogFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_log);
logFragment.onFragmentHidden();
}
});
@@ -84,7 +85,7 @@ public void onPanelClosed(final View panel) {
}
@Override
- protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ protected void onRestoreInstanceState(final @NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mEditMode = savedInstanceState.getBoolean(SIS_EDIT_MODE);
@@ -134,7 +135,7 @@ public void onDeviceSelected(final BluetoothDevice device, final String name) {
super.onDeviceSelected(device, name);
// Notify the log fragment about it
- final UARTLogFragment logFragment = (UARTLogFragment) getFragmentManager().findFragmentById(R.id.fragment_log);
+ final UARTLogFragment logFragment = (UARTLogFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_log);
logFragment.onServiceStarted();
}
@@ -176,7 +177,7 @@ public void onBackPressed() {
return;
}
if (mEditMode) {
- final UARTControlFragment fragment = (UARTControlFragment) getFragmentManager().findFragmentById(R.id.fragment_control);
+ final UARTControlFragment fragment = (UARTControlFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_control);
fragment.setEditMode(false);
return;
}
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTControlFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTControlFragment.java
index de0567194..ae89a990f 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTControlFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTControlFragment.java
@@ -23,10 +23,10 @@
package no.nordicsemi.android.nrftoolbox.uart;
import android.app.Activity;
-import android.app.Fragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
+import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTEditDialog.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTEditDialog.java
index cd1fd2cbf..1ecb16290 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTEditDialog.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTEditDialog.java
@@ -22,12 +22,13 @@
package no.nordicsemi.android.nrftoolbox.uart;
-import android.app.AlertDialog;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -62,7 +63,8 @@ public static UARTEditDialog getInstance(final int index) {
return fragment;
}
- @Override
+ @NonNull
+ @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
final LayoutInflater inflater = LayoutInflater.from(getActivity());
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTLogFragment.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTLogFragment.java
index 3fa8fccea..ce5e16c4e 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTLogFragment.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTLogFragment.java
@@ -22,19 +22,19 @@
package no.nordicsemi.android.nrftoolbox.uart;
-import android.app.ListFragment;
-import android.app.LoaderManager.LoaderCallbacks;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.CursorLoader;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.Loader;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.os.Bundle;
import android.os.IBinder;
+import android.support.v4.app.ListFragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
import android.support.v4.content.LocalBroadcastManager;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -53,7 +53,7 @@
import no.nordicsemi.android.nrftoolbox.R;
import no.nordicsemi.android.nrftoolbox.profile.BleProfileService;
-public class UARTLogFragment extends ListFragment implements LoaderCallbacks {
+public class UARTLogFragment extends ListFragment implements LoaderManager.LoaderCallbacks {
private static final String SIS_LOG_SCROLL_POSITION = "sis_scroll_position";
private static final int LOG_SCROLL_NULL = -1;
private static final int LOG_SCROLLED_TO_BOTTOM = -2;
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTManager.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTManager.java
index 623606988..65b9c25ff 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTManager.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTManager.java
@@ -93,6 +93,12 @@ public void onCharacteristicNotified(final BluetoothGatt gatt, final BluetoothGa
}
};
+ @Override
+ protected boolean shouldAutoConnect() {
+ // We want the connection to be kept
+ return true;
+ }
+
/**
* Sends the given text to TH characteristic.
* @param text the text to be sent
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTService.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTService.java
index c76f41b1b..eb5478088 100644
--- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTService.java
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/uart/UARTService.java
@@ -192,14 +192,32 @@ public void onReceive(final Context context, final Intent intent) {
};
/**
- * Broadcast receiver that listens for {@link #ACTION_SEND} from other apps. Sends the String content of the {@link Intent#EXTRA_TEXT} extra to the remote device.
+ * Broadcast receiver that listens for {@link #ACTION_SEND} from other apps. Sends the String or int content of the {@link Intent#EXTRA_TEXT} extra to the remote device.
+ * The integer content will be sent as String (65 -> "65", not 65 -> "A").
*/
private BroadcastReceiver mIntentBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
- Logger.i(getLogSession(), "[Broadcast] Disconnect action pressed");
- final String message = intent.getStringExtra(Intent.EXTRA_TEXT);
- mManager.send(message);
+ final boolean hasMessage = intent.hasExtra(Intent.EXTRA_TEXT);
+ if (hasMessage) {
+ String message = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (message == null) {
+ final int intValue = intent.getIntExtra(Intent.EXTRA_TEXT, Integer.MIN_VALUE); // how big is the chance of such data?
+ if (intValue != Integer.MIN_VALUE)
+ message = String.valueOf(intValue);
+ }
+
+ if (message != null) {
+ Logger.i(getLogSession(), "[Broadcast] " + ACTION_SEND + " broadcast received with data: \"" + message + "\"");
+ mManager.send(message);
+ return;
+ }
+ }
+ // No data od incompatible type of EXTRA_TEXT
+ if (!hasMessage)
+ Logger.i(getLogSession(), "[Broadcast] " + ACTION_SEND + " broadcast received no data.");
+ else
+ Logger.i(getLogSession(), "[Broadcast] " + ACTION_SEND + " broadcast received incompatible data type. Only String and int are supported.");
}
};
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundLinearLayout.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundLinearLayout.java
new file mode 100644
index 000000000..42950e70f
--- /dev/null
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundLinearLayout.java
@@ -0,0 +1,148 @@
+/*************************************************************************************************************************************************
+ * Copyright (c) 2015, Nordic Semiconductor
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ************************************************************************************************************************************************/
+
+package no.nordicsemi.android.nrftoolbox.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.NinePatchDrawable;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class ForegroundLinearLayout extends LinearLayout {
+
+ private Drawable mForegroundSelector;
+ private Rect mRectPadding;
+ private boolean mUseBackgroundPadding = false;
+
+ public ForegroundLinearLayout(Context context) {
+ super(context);
+ }
+
+ public ForegroundLinearLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ForegroundLinearLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundRelativeLayout,
+ defStyle, 0);
+
+ final Drawable d = a.getDrawable(R.styleable.ForegroundRelativeLayout_foreground);
+ if (d != null) {
+ setForeground(d);
+ }
+
+ a.recycle();
+
+ if (this.getBackground() instanceof NinePatchDrawable) {
+ final NinePatchDrawable npd = (NinePatchDrawable) this.getBackground();
+ mRectPadding = new Rect();
+ if (npd.getPadding(mRectPadding)) {
+ mUseBackgroundPadding = true;
+ }
+ }
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+
+ if (mForegroundSelector != null && mForegroundSelector.isStateful()) {
+ mForegroundSelector.setState(getDrawableState());
+ }
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ if (mForegroundSelector != null) {
+ if (mUseBackgroundPadding) {
+ mForegroundSelector.setBounds(mRectPadding.left, mRectPadding.top, w - mRectPadding.right, h - mRectPadding.bottom);
+ } else {
+ mForegroundSelector.setBounds(0, 0, w, h);
+ }
+ }
+ }
+
+ @Override
+ protected void dispatchDraw(@NonNull Canvas canvas) {
+ super.dispatchDraw(canvas);
+
+ if (mForegroundSelector != null) {
+ mForegroundSelector.draw(canvas);
+ }
+ }
+
+ @Override
+ protected boolean verifyDrawable(Drawable who) {
+ return super.verifyDrawable(who) || (who == mForegroundSelector);
+ }
+
+ @Override
+ public void jumpDrawablesToCurrentState() {
+ super.jumpDrawablesToCurrentState();
+ if (mForegroundSelector != null) mForegroundSelector.jumpToCurrentState();
+ }
+
+ public void setForeground(Drawable drawable) {
+ if (mForegroundSelector != drawable) {
+ if (mForegroundSelector != null) {
+ mForegroundSelector.setCallback(null);
+ unscheduleDrawable(mForegroundSelector);
+ }
+
+ mForegroundSelector = drawable;
+
+ if (drawable != null) {
+ setWillNotDraw(false);
+ drawable.setCallback(this);
+ if (drawable.isStateful()) {
+ drawable.setState(getDrawableState());
+ }
+ } else {
+ setWillNotDraw(true);
+ }
+ requestLayout();
+ invalidate();
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void drawableHotspotChanged(float x, float y) {
+ super.drawableHotspotChanged(x, y);
+ if (mForegroundSelector != null) {
+ mForegroundSelector.setHotspot(x, y);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundRelativeLayout.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundRelativeLayout.java
new file mode 100644
index 000000000..a0e3ab6ca
--- /dev/null
+++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/widget/ForegroundRelativeLayout.java
@@ -0,0 +1,148 @@
+/*************************************************************************************************************************************************
+ * Copyright (c) 2015, Nordic Semiconductor
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ************************************************************************************************************************************************/
+
+package no.nordicsemi.android.nrftoolbox.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.NinePatchDrawable;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+import no.nordicsemi.android.nrftoolbox.R;
+
+public class ForegroundRelativeLayout extends RelativeLayout {
+
+ private Drawable mForegroundSelector;
+ private Rect mRectPadding;
+ private boolean mUseBackgroundPadding = false;
+
+ public ForegroundRelativeLayout(Context context) {
+ super(context);
+ }
+
+ public ForegroundRelativeLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ForegroundRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundRelativeLayout,
+ defStyle, 0);
+
+ final Drawable d = a.getDrawable(R.styleable.ForegroundRelativeLayout_foreground);
+ if (d != null) {
+ setForeground(d);
+ }
+
+ a.recycle();
+
+ if (this.getBackground() instanceof NinePatchDrawable) {
+ final NinePatchDrawable npd = (NinePatchDrawable) this.getBackground();
+ mRectPadding = new Rect();
+ if (npd.getPadding(mRectPadding)) {
+ mUseBackgroundPadding = true;
+ }
+ }
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+
+ if (mForegroundSelector != null && mForegroundSelector.isStateful()) {
+ mForegroundSelector.setState(getDrawableState());
+ }
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ if (mForegroundSelector != null) {
+ if (mUseBackgroundPadding) {
+ mForegroundSelector.setBounds(mRectPadding.left, mRectPadding.top, w - mRectPadding.right, h - mRectPadding.bottom);
+ } else {
+ mForegroundSelector.setBounds(0, 0, w, h);
+ }
+ }
+ }
+
+ @Override
+ protected void dispatchDraw(@NonNull Canvas canvas) {
+ super.dispatchDraw(canvas);
+
+ if (mForegroundSelector != null) {
+ mForegroundSelector.draw(canvas);
+ }
+ }
+
+ @Override
+ protected boolean verifyDrawable(Drawable who) {
+ return super.verifyDrawable(who) || (who == mForegroundSelector);
+ }
+
+ @Override
+ public void jumpDrawablesToCurrentState() {
+ super.jumpDrawablesToCurrentState();
+ if (mForegroundSelector != null) mForegroundSelector.jumpToCurrentState();
+ }
+
+ public void setForeground(Drawable drawable) {
+ if (mForegroundSelector != drawable) {
+ if (mForegroundSelector != null) {
+ mForegroundSelector.setCallback(null);
+ unscheduleDrawable(mForegroundSelector);
+ }
+
+ mForegroundSelector = drawable;
+
+ if (drawable != null) {
+ setWillNotDraw(false);
+ drawable.setCallback(this);
+ if (drawable.isStateful()) {
+ drawable.setState(getDrawableState());
+ }
+ } else {
+ setWillNotDraw(true);
+ }
+ requestLayout();
+ invalidate();
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void drawableHotspotChanged(float x, float y) {
+ super.drawableHotspotChanged(x, y);
+ if (mForegroundSelector != null) {
+ mForegroundSelector.setHotspot(x, y);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/item_background_light.xml b/app/src/main/res/color/menu_text.xml
similarity index 80%
rename from app/src/main/res/drawable/item_background_light.xml
rename to app/src/main/res/color/menu_text.xml
index b1d87923b..c6d777f2b 100644
--- a/app/src/main/res/drawable/item_background_light.xml
+++ b/app/src/main/res/color/menu_text.xml
@@ -1,5 +1,5 @@
-
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-
-
-
-
+
+
diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/app/src/main/res/drawable-hdpi/ic_drawer.png
deleted file mode 100644
index bb40b7230..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_drawer.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_menu_about.png b/app/src/main/res/drawable-hdpi/ic_menu_about.png
deleted file mode 100644
index c643fa54d..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_menu_about.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_menu_settings.png b/app/src/main/res/drawable-hdpi/ic_menu_settings.png
deleted file mode 100644
index 3e4580e05..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_menu_settings.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_permission_log.png b/app/src/main/res/drawable-hdpi/ic_permission_log.png
deleted file mode 100644
index e45ea1fd9..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_permission_log.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_notify_dfu.png b/app/src/main/res/drawable-hdpi/ic_stat_notify_dfu.png
deleted file mode 100644
index 261078de2..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_stat_notify_dfu.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/list_divider_holo_light.9.png b/app/src/main/res/drawable-hdpi/list_divider_holo_light.9.png
deleted file mode 100644
index 0279e17a1..000000000
Binary files a/app/src/main/res/drawable-hdpi/list_divider_holo_light.9.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png
deleted file mode 100644
index 0f04c4972..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_drawer.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_about.png b/app/src/main/res/drawable-xhdpi/ic_menu_about.png
deleted file mode 100644
index e4be458dd..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_about.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_settings.png b/app/src/main/res/drawable-xhdpi/ic_menu_settings.png
deleted file mode 100644
index 09b014834..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_settings.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_permission_log.png b/app/src/main/res/drawable-xhdpi/ic_permission_log.png
deleted file mode 100644
index 95708234a..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_permission_log.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_stat_notify_dfu.png b/app/src/main/res/drawable-xhdpi/ic_stat_notify_dfu.png
deleted file mode 100644
index 6009fd1bd..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_stat_notify_dfu.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/list_divider_holo_light.9.png b/app/src/main/res/drawable-xhdpi/list_divider_holo_light.9.png
deleted file mode 100644
index 65061c0f4..000000000
Binary files a/app/src/main/res/drawable-xhdpi/list_divider_holo_light.9.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/nordic_logo_horiz.png b/app/src/main/res/drawable-xhdpi/nordic_logo_horiz.png
deleted file mode 100644
index 80552bc98..000000000
Binary files a/app/src/main/res/drawable-xhdpi/nordic_logo_horiz.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/nordic_logo_horiz_dark.png b/app/src/main/res/drawable-xhdpi/nordic_logo_horiz_dark.png
new file mode 100644
index 000000000..89309efe3
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/nordic_logo_horiz_dark.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/action_bar_shadow.9.png b/app/src/main/res/drawable-xxhdpi/action_bar_shadow.9.png
new file mode 100644
index 000000000..c4e808346
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/action_bar_shadow.9.png differ
diff --git a/app/src/main/res/layout-land/activity_feature_bpm.xml b/app/src/main/res/layout-land/activity_feature_bpm.xml
index 867ad75d2..12e5413e4 100644
--- a/app/src/main/res/layout-land/activity_feature_bpm.xml
+++ b/app/src/main/res/layout-land/activity_feature_bpm.xml
@@ -19,269 +19,279 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
+
+
+ android:layout_height="match_parent">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="@dimen/bpm_feature_title_long_margin"
+ android:rotation="270"
+ android:text="@string/bpm_feature_title_long"
+ android:textColor="@color/darkGray"
+ android:textSize="32dp"
+ android:textStyle="bold" />
+
+
+
+
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
-
+
+ android:text="@string/bpm_section_bp_header" />
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginTop="15dp"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/app/src/main/res/layout-land/activity_feature_csc.xml b/app/src/main/res/layout-land/activity_feature_csc.xml
index 3b64dd25b..ebca3ded6 100644
--- a/app/src/main/res/layout-land/activity_feature_csc.xml
+++ b/app/src/main/res/layout-land/activity_feature_csc.xml
@@ -19,201 +19,123 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:orientation="vertical"
+ tools:context=".CSCActivity" >
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+ android:baselineAligned="false"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+
+ android:layout_height="wrap_content"
+ android:text="@string/csc_section_csc_header" />
+ android:paddingLeft="@dimen/feature_section_padding"
+ android:paddingRight="@dimen/feature_section_padding" >
+
+
+
+
+
+
+
+
+
+ android:text="@string/csc_cadence" />
+ android:text="@string/csc_cadence_unit" />
+ android:text="@string/csc_distance" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_dfu.xml b/app/src/main/res/layout-land/activity_feature_dfu.xml
index 5164cf9c1..0bae49de2 100644
--- a/app/src/main/res/layout-land/activity_feature_dfu.xml
+++ b/app/src/main/res/layout-land/activity_feature_dfu.xml
@@ -20,233 +20,245 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ tools:context=".DfuActivity" >
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
-
+
+
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:text="@string/dfu_section_application_header" />
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ android:onClick="onSelectFileClicked"
+ android:text="@string/dfu_action_select_file" />
-
+ android:layout_marginLeft="10dp"
+ android:onClick="onSelectFileHelpClicked"
+ android:src="@drawable/ic_help" />
+
+
-
-
-
+
+ android:id="@+id/dfu_pane"
+ android:layout_width="0dp"
+ android:layout_height="160dp"
+ android:layout_weight="1"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:layout_marginLeft="14dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+ android:layout_margin="@dimen/feature_section_padding"
+ android:enabled="false"
+ android:onClick="onUploadClicked"
+ android:text="@string/dfu_action_upload" />
-
+ android:layout_margin="@dimen/feature_section_padding"
+ android:text="@string/dfu_status_uploading"
+ android:freezesText="true"
+ android:visibility="invisible" />
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_gls.xml b/app/src/main/res/layout-land/activity_feature_gls.xml
index ffaa191b2..8ebf5124c 100644
--- a/app/src/main/res/layout-land/activity_feature_gls.xml
+++ b/app/src/main/res/layout-land/activity_feature_gls.xml
@@ -19,190 +19,200 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
+ android:orientation="vertical"
+ tools:context=".BPMActivity" >
+
+
-
+
+
+
+
+
+
+
+
+
-
-
-
-
+ android:layout_above="@+id/action_connect"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
-
-
+
-
+ android:layout_weight="1"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:layout_marginLeft="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
-
+
+
+
+
+
+
+
+
-
+
+
-
-
-
+
-
+ android:text="@string/gls_section_actions" />
-
-
-
+
+
-
-
-
-
-
+ android:orientation="horizontal"
+ android:visibility="gone" >
+
+
+
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_hrs.xml b/app/src/main/res/layout-land/activity_feature_hrs.xml
index fd2642926..f957104d8 100644
--- a/app/src/main/res/layout-land/activity_feature_hrs.xml
+++ b/app/src/main/res/layout-land/activity_feature_hrs.xml
@@ -19,124 +19,134 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
+
+
-
+
-
+ android:layout_alignParentLeft="true"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginTop="@dimen/feature_device_name_margin_top"
+ android:background="@drawable/battery"
+ android:freezesText="true"
+ android:gravity="center"
+ android:text="@string/not_available"
+ android:textColor="#FFFFFF"
+ android:textSize="12sp" />
-
-
-
+
-
-
-
+
+
+
+
+ android:gravity="right"
+ android:orientation="vertical" >
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
+
+
diff --git a/app/src/main/res/layout-land/activity_feature_hts.xml b/app/src/main/res/layout-land/activity_feature_hts.xml
index 8a54406a7..77382b0de 100644
--- a/app/src/main/res/layout-land/activity_feature_hts.xml
+++ b/app/src/main/res/layout-land/activity_feature_hts.xml
@@ -19,85 +19,94 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_proximity.xml b/app/src/main/res/layout-land/activity_feature_proximity.xml
index 95bf1dbee..402779933 100644
--- a/app/src/main/res/layout-land/activity_feature_proximity.xml
+++ b/app/src/main/res/layout-land/activity_feature_proximity.xml
@@ -19,97 +19,107 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
+
-
+
-
+
-
+
-
+
-
+ android:layout_marginLeft="10dp"
+ android:layout_marginTop="@dimen/feature_device_name_margin_top"
+ android:layout_toRightOf="@+id/battery"
+ android:ellipsize="end"
+ android:freezesText="true"
+ android:maxLines="1"
+ android:text="@string/proximity_default_name"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
-
+ android:layout_above="@+id/option"
+ android:layout_below="@+id/device_name"
+ android:layout_centerHorizontal="true"
+ android:gravity="center_vertical"
+ android:orientation="horizontal" >
+
+
-
+
+
-
+
+
+
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_rsc.xml b/app/src/main/res/layout-land/activity_feature_rsc.xml
index 2a8c7a166..4ad44d492 100644
--- a/app/src/main/res/layout-land/activity_feature_rsc.xml
+++ b/app/src/main/res/layout-land/activity_feature_rsc.xml
@@ -19,296 +19,306 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="@dimen/rsc_feature_title_long_margin"
+ android:rotation="270"
+ android:text="@string/rsc_feature_title_long"
+ android:textColor="@color/darkGray"
+ android:textSize="32dp"
+ android:textStyle="bold" />
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:orientation="vertical">
-
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:text="@string/rsc_section_activity_header" />
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_connect" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_feature_uart.xml b/app/src/main/res/layout-land/activity_feature_uart.xml
index a10aa6c8a..b1bd02c1a 100644
--- a/app/src/main/res/layout-land/activity_feature_uart.xml
+++ b/app/src/main/res/layout-land/activity_feature_uart.xml
@@ -23,35 +23,43 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:baselineAligned="false"
- android:orientation="horizontal"
+ android:orientation="vertical"
tools:context=".UARTActivity" >
-
+
-
+
+ android:layout_weight="8"
+ tools:layout="@layout/fragment_feature_uart_control" />
-
-
+ android:layout_weight="6" >
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw600dp-land/activity_feature_bpm.xml b/app/src/main/res/layout-sw600dp-land/activity_feature_bpm.xml
index 71c07133f..68c1a7f62 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_feature_bpm.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_feature_bpm.xml
@@ -19,270 +19,280 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
-
-
-
-
+
+
+
+
+
+ android:layout_centerHorizontal="true"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:baselineAligned="false"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
-
+
+ android:text="@string/bpm_section_bp_header" />
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="4dp"
+ android:layout_marginRight="4dp"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/app/src/main/res/layout-sw600dp-land/activity_feature_csc.xml b/app/src/main/res/layout-sw600dp-land/activity_feature_csc.xml
index b82259ede..25c950551 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_feature_csc.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_feature_csc.xml
@@ -19,228 +19,238 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
+
+
+
+
+
+
+ android:layout_marginLeft="10dp"
+ android:layout_marginTop="@dimen/feature_device_name_margin_top"
+ android:layout_toRightOf="@+id/battery"
+ android:ellipsize="end"
+ android:freezesText="true"
+ android:maxLines="1"
+ android:text="@string/csc_default_name"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
+
+
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:padding="@dimen/feature_section_padding" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw600dp-land/activity_feature_dfu.xml b/app/src/main/res/layout-sw600dp-land/activity_feature_dfu.xml
index 5960265be..8ef3063a0 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_feature_dfu.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_feature_dfu.xml
@@ -20,226 +20,238 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
-
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:text="@string/dfu_section_application_header" />
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ android:onClick="onSelectFileClicked"
+ android:text="@string/dfu_action_select_file" />
-
+ android:layout_marginLeft="10dp"
+ android:onClick="onSelectFileHelpClicked"
+ android:src="@drawable/ic_help" />
+
+
-
-
-
+
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+ android:layout_margin="@dimen/feature_section_padding"
+ android:enabled="false"
+ android:onClick="onUploadClicked"
+ android:text="@string/dfu_action_upload" />
-
+ android:layout_margin="@dimen/feature_section_padding"
+ android:text="@string/dfu_status_uploading"
+ android:freezesText="true"
+ android:visibility="invisible" />
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_select" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw600dp-land/activity_feature_hrs.xml b/app/src/main/res/layout-sw600dp-land/activity_feature_hrs.xml
index 9f0e463c9..e18c264a8 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_feature_hrs.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_feature_hrs.xml
@@ -19,125 +19,135 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
+
+
+
+
-
+
+
+
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
-
-
-
+
-
-
-
+ android:gravity="right"
+ android:orientation="vertical" >
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw720dp-land/activity_feature_rsc.xml b/app/src/main/res/layout-sw720dp-land/activity_feature_rsc.xml
index 6c475147a..6f7099acc 100644
--- a/app/src/main/res/layout-sw720dp-land/activity_feature_rsc.xml
+++ b/app/src/main/res/layout-sw720dp-land/activity_feature_rsc.xml
@@ -19,263 +19,273 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
+
+
+ android:layout_height="match_parent">
-
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
+ android:layout_gravity="center_horizontal"
+ android:freezesText="true"
+ android:padding="8dp"
+ android:text="@string/not_available"
+ android:textSize="22sp" />
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_connect" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_bpm.xml b/app/src/main/res/layout/activity_feature_bpm.xml
index b15bfd6a7..2fd9c2ff5 100644
--- a/app/src/main/res/layout/activity_feature_bpm.xml
+++ b/app/src/main/res/layout/activity_feature_bpm.xml
@@ -19,152 +19,211 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
+
+
+ android:layout_height="match_parent">
+
+
-
+
+
+
+
+
-
+
-
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:text="@string/bpm_section_bp_header" />
-
+ android:padding="@dimen/feature_section_padding" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
-
+ android:orientation="horizontal"
+ android:padding="@dimen/feature_section_padding" >
+ android:text="@string/bpm_pulse" />
-
-
-
-
-
+ android:gravity="bottom"
+ android:text="@string/bpm_unit_bpm" />
+
+
-
-
-
+
-
-
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+ style="@style/Widget.ListTitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/bpm_section_timestamp_header" />
+ android:id="@+id/timestamp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:freezesText="true"
+ android:padding="8dp"
+ android:text="@string/not_available"
+ android:textSize="22sp" />
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_connect" />
+
+
+
diff --git a/app/src/main/res/layout/activity_feature_csc.xml b/app/src/main/res/layout/activity_feature_csc.xml
index b82259ede..25c950551 100644
--- a/app/src/main/res/layout/activity_feature_csc.xml
+++ b/app/src/main/res/layout/activity_feature_csc.xml
@@ -19,228 +19,238 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
+
+
+
+
+
+
+ android:layout_marginLeft="10dp"
+ android:layout_marginTop="@dimen/feature_device_name_margin_top"
+ android:layout_toRightOf="@+id/battery"
+ android:ellipsize="end"
+ android:freezesText="true"
+ android:maxLines="1"
+ android:text="@string/csc_default_name"
+ android:textAllCaps="true"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
-
+
+
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ android:layout_marginTop="@dimen/feature_vertical_margin_top"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:padding="@dimen/feature_section_padding" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_dfu.xml b/app/src/main/res/layout/activity_feature_dfu.xml
index bad8c83c3..466f97d7a 100644
--- a/app/src/main/res/layout/activity_feature_dfu.xml
+++ b/app/src/main/res/layout/activity_feature_dfu.xml
@@ -20,227 +20,239 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
-
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:text="@string/dfu_section_application_header" />
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+ android:onClick="onSelectFileClicked"
+ android:text="@string/dfu_action_select_file" />
-
+ android:layout_marginLeft="10dp"
+ android:onClick="onSelectFileHelpClicked"
+ android:src="@drawable/ic_help" />
+
+
-
-
-
+
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
+
+
+ android:layout_margin="@dimen/feature_section_padding"
+ android:enabled="false"
+ android:onClick="onUploadClicked"
+ android:text="@string/dfu_action_upload" />
-
+ android:layout_margin="@dimen/feature_section_padding"
+ android:text="@string/dfu_status_uploading"
+ android:freezesText="true"
+ android:visibility="invisible" />
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_select" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_gls.xml b/app/src/main/res/layout/activity_feature_gls.xml
index 4be594a77..e15e017d8 100644
--- a/app/src/main/res/layout/activity_feature_gls.xml
+++ b/app/src/main/res/layout/activity_feature_gls.xml
@@ -19,189 +19,198 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ android:layout_height="match_parent">
+
+
-
+
+
+
+
+
-
+
-
+
+
+ android:layout_height="wrap_content" >
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:text="@string/gls_no_data" />
+
-
+
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:layout_marginLeft="@dimen/feature_horizontal_margin"
+ android:layout_marginRight="@dimen/feature_horizontal_margin"
+ style="@style/Widget.List"
+ android:orientation="vertical" >
-
-
-
-
-
-
-
-
+ android:text="@string/gls_section_actions" />
-
+
+
+
+
+
+
+
+
+
+ android:orientation="horizontal"
+ android:visibility="gone" >
+
+
+
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_hrs.xml b/app/src/main/res/layout/activity_feature_hrs.xml
index 4dd41d129..e94bdc501 100644
--- a/app/src/main/res/layout/activity_feature_hrs.xml
+++ b/app/src/main/res/layout/activity_feature_hrs.xml
@@ -19,118 +19,128 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
diff --git a/app/src/main/res/layout/activity_feature_hts.xml b/app/src/main/res/layout/activity_feature_hts.xml
index 8a54406a7..77382b0de 100644
--- a/app/src/main/res/layout/activity_feature_hts.xml
+++ b/app/src/main/res/layout/activity_feature_hts.xml
@@ -19,85 +19,94 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_proximity.xml b/app/src/main/res/layout/activity_feature_proximity.xml
index c3ef1f447..f6a1c730f 100644
--- a/app/src/main/res/layout/activity_feature_proximity.xml
+++ b/app/src/main/res/layout/activity_feature_proximity.xml
@@ -19,92 +19,102 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_rsc.xml b/app/src/main/res/layout/activity_feature_rsc.xml
index 6c475147a..6f7099acc 100644
--- a/app/src/main/res/layout/activity_feature_rsc.xml
+++ b/app/src/main/res/layout/activity_feature_rsc.xml
@@ -19,263 +19,273 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
+
+
+ android:layout_height="match_parent">
-
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
+ android:layout_gravity="center_horizontal"
+ android:freezesText="true"
+ android:padding="8dp"
+ android:text="@string/not_available"
+ android:textSize="22sp" />
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/activity_vertical_margin_bottom"
+ android:onClick="onConnectClicked"
+ android:text="@string/action_connect" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_feature_template.xml b/app/src/main/res/layout/activity_feature_template.xml
index 6e282fe26..562203a1f 100644
--- a/app/src/main/res/layout/activity_feature_template.xml
+++ b/app/src/main/res/layout/activity_feature_template.xml
@@ -19,118 +19,128 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ tools:context=".TemplateActivity" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_feature_uart.xml b/app/src/main/res/layout/activity_feature_uart.xml
index 76d9797b4..513b49501 100644
--- a/app/src/main/res/layout/activity_feature_uart.xml
+++ b/app/src/main/res/layout/activity_feature_uart.xml
@@ -19,25 +19,40 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
-
-
-
+
+
+ android:layout_height="match_parent">
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_features.xml b/app/src/main/res/layout/activity_features.xml
index 272ae0199..970386390 100644
--- a/app/src/main/res/layout/activity_features.xml
+++ b/app/src/main/res/layout/activity_features.xml
@@ -22,45 +22,66 @@
-->
+ android:fitsSystemWindows="true"
+ tools:context=".FeaturesActivity">
-
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+
-
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ style="@style/HeaderShadow">
-
-
+
-
+
+
+
-
+
+ android:background="#FFFFFFFF"
+ app:insetForeground="#2000">
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 000000000..51915c640
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/drawer.xml b/app/src/main/res/layout/drawer.xml
index 6f12bccaf..baf5587de 100644
--- a/app/src/main/res/layout/drawer.xml
+++ b/app/src/main/res/layout/drawer.xml
@@ -20,53 +20,52 @@
~ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
~ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
-
\ No newline at end of file
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/drawer_plugin.xml b/app/src/main/res/layout/drawer_plugin.xml
index b3eba0ace..8e9352907 100644
--- a/app/src/main/res/layout/drawer_plugin.xml
+++ b/app/src/main/res/layout/drawer_plugin.xml
@@ -22,11 +22,11 @@
-->
+ android:layout_marginLeft="24dp" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_zip_info.xml b/app/src/main/res/layout/fragment_zip_info.xml
index 201b79d9b..527be066a 100644
--- a/app/src/main/res/layout/fragment_zip_info.xml
+++ b/app/src/main/res/layout/fragment_zip_info.xml
@@ -25,7 +25,6 @@
android:layout_height="wrap_content" >
-
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/help.xml b/app/src/main/res/menu/help.xml
index fe54e57f6..1f2cf6cdf 100644
--- a/app/src/main/res/menu/help.xml
+++ b/app/src/main/res/menu/help.xml
@@ -24,9 +24,8 @@
\ No newline at end of file
diff --git a/app/src/main/res/menu/settings_and_about.xml b/app/src/main/res/menu/settings_and_about.xml
index 594e00511..bc9dbacee 100644
--- a/app/src/main/res/menu/settings_and_about.xml
+++ b/app/src/main/res/menu/settings_and_about.xml
@@ -24,14 +24,14 @@
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
index 0c5384693..9482d4a2e 100644
--- a/app/src/main/res/values-sw600dp/dimens.xml
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -26,8 +26,9 @@
screen margins) for sw600dp devices (e.g. 7" tablets) here.
-->
24dp
- 24dp
40dp
+ 300dp
+ 24dp
80dp
80dp
diff --git a/app/src/main/res/values-sw720dp-land/dimens.xml b/app/src/main/res/values-sw720dp-land/dimens.xml
index db1b9edee..082059fa0 100644
--- a/app/src/main/res/values-sw720dp-land/dimens.xml
+++ b/app/src/main/res/values-sw720dp-land/dimens.xml
@@ -26,7 +26,6 @@
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
-->
128dp
- 32dp
60dp
100dp
diff --git a/app/src/main/res/values-v21/dimens.xml b/app/src/main/res/values-v21/dimens.xml
index 39782e117..11f1d5a6a 100644
--- a/app/src/main/res/values-v21/dimens.xml
+++ b/app/src/main/res/values-v21/dimens.xml
@@ -25,9 +25,8 @@
56dp
-48dp
-
- 26dp
- 18dp
- 0dp
-
+ 6dp
+
+ 54dp
+
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
index 634ad1ff4..96ee764d5 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -22,7 +22,15 @@
-->
-
+
+
+
+
+
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_about_text.xml b/app/src/main/res/values/attrs.xml
similarity index 87%
rename from app/src/main/res/layout/dialog_about_text.xml
rename to app/src/main/res/values/attrs.xml
index fe6a45aec..5a70d3f5f 100644
--- a/app/src/main/res/layout/dialog_about_text.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,4 +1,4 @@
-
+
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 2c070a5a1..ce9a21064 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -23,9 +23,7 @@
16dp
- 16dp
32dp
- 16dp
50dp
50dp
8dp
@@ -34,14 +32,18 @@
256dp
256dp
+ 260dp
+ 30dp
+ 16dp
+
10dp
0dp
0dp
-81dp
-
- 16dp
- 8dp
- 8dp
+
+ 24dp
+ 18dp
+ 0dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 299a2729e..012fa3bfe 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -26,9 +26,6 @@
fonts/trebucbd.ttf
fonts/trebuc.ttf
- read and write log
- Allows the app to write and read from Nordic Semiconductor Event log
-
OK
Yes
No
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 02b3ea1e9..533a2b472 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -21,6 +21,51 @@
-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -50,55 +95,34 @@
- 40dp
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+