diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/DeviceAdapter.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/DeviceAdapter.java index 877147e5..bc6e767b 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/DeviceAdapter.java +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/DeviceAdapter.java @@ -23,7 +23,6 @@ package no.nordicsemi.android.nrftoolbox.proximity; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothGatt; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; @@ -31,6 +30,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; +import android.widget.ProgressBar; import android.widget.TextView; import java.util.List; @@ -95,6 +95,7 @@ public class DeviceAdapter extends RecyclerView.Adapter { final int position = getAdapterPosition(); final BluetoothDevice device = mDevices.get(position); - final boolean on = mService.toggleImmediateAlert(device); - - actionButton.setImageResource(on ? R.drawable.ic_stat_notify_proximity_silent : R.drawable.ic_stat_notify_proximity_find); + mService.toggleImmediateAlert(device); }); // Configure Disconnect button @@ -124,7 +124,7 @@ public class DeviceAdapter extends RecyclerView.Adapter { protected void initialize() { super.initialize(); writeCharacteristic(mLinkLossCharacteristic, AlertLevelData.highAlert()) + .done(device -> log(LogContract.Log.Level.INFO, "Link loss alert level set")) + .fail((device, status) -> log(LogContract.Log.Level.WARNING, "Failed to set link loss level: " + status)) .enqueue(); } @@ -105,12 +109,9 @@ class ProximityManager extends BatteryManager { /** * Toggles the immediate alert on the target device. - * - * @return True if alarm has been enabled, false if disabled. */ - public boolean toggleImmediateAlert() { + public void toggleImmediateAlert() { writeImmediateAlert(!mAlertOn); - return mAlertOn; } /** @@ -122,11 +123,19 @@ class ProximityManager extends BatteryManager { if (!isConnected()) return; - log(LogContract.Log.Level.VERBOSE, on ? "Setting alarm to HIGH..." : "Disabling alarm..."); writeCharacteristic(mAlertLevelCharacteristic, on ? AlertLevelData.highAlert() : AlertLevelData.noAlert()) - .with((device, data) -> log(LogContract.Log.Level.APPLICATION, "\"" + AlertLevelParser.parse(data) + "\" sent")) - .done(device -> mAlertOn = on) - .fail((device, status) -> log(LogContract.Log.Level.APPLICATION, "Alert Level characteristic not found")) + .before(device -> log(LogContract.Log.Level.VERBOSE, + on ? "Setting alarm to HIGH..." : "Disabling alarm...")) + .with((device, data) -> log(LogContract.Log.Level.APPLICATION, + "\"" + AlertLevelParser.parse(data) + "\" sent")) + .done(device -> { + mAlertOn = on; + mCallbacks.onRemoteAlarmSwitched(device, on); + }) + .fail((device, status) -> log(LogContract.Log.Level.WARNING, + status == FailCallback.REASON_NULL_ATTRIBUTE ? + "Alert Level characteristic not found" : + GattError.parse(status))) .enqueue(); } diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityManagerCallbacks.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityManagerCallbacks.java index abafe450..1624b614 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityManagerCallbacks.java +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityManagerCallbacks.java @@ -21,8 +21,12 @@ */ package no.nordicsemi.android.nrftoolbox.proximity; +import android.bluetooth.BluetoothDevice; +import android.support.annotation.NonNull; + import no.nordicsemi.android.nrftoolbox.battery.BatteryManagerCallbacks; interface ProximityManagerCallbacks extends BatteryManagerCallbacks { // No additional methods + void onRemoteAlarmSwitched(@NonNull final BluetoothDevice device, final boolean on); } diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManager.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManager.java index cf54f890..b381d3dc 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManager.java +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManager.java @@ -245,7 +245,7 @@ class ProximityServerManager { public void onConnectionStateChange(final BluetoothDevice device, final int status, final int newState) { mLogger.log(device, LogContract.Log.Level.DEBUG, "[Server callback] Connection state changed with status: " + status - + " and new state: " + stateToString(newState) + " (" + newState + ")"); + + " and new state: " + newState + " (" + stateToString(newState) + ")"); if (status == BluetoothGatt.GATT_SUCCESS) { if (newState == BluetoothGatt.STATE_CONNECTED) { mLogger.log(device, LogContract.Log.Level.INFO, diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManagerCallbacks.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManagerCallbacks.java index f4a74b64..d31fc4c0 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManagerCallbacks.java +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityServerManagerCallbacks.java @@ -22,9 +22,10 @@ package no.nordicsemi.android.nrftoolbox.proximity; import android.bluetooth.BluetoothDevice; +import android.support.annotation.NonNull; public interface ProximityServerManagerCallbacks { - void onAlarmTriggered(final BluetoothDevice device); + void onAlarmTriggered(@NonNull final BluetoothDevice device); - void onAlarmStopped(final BluetoothDevice device); + void onAlarmStopped(@NonNull final BluetoothDevice device); } diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityService.java b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityService.java index 1357340d..2e04a477 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityService.java +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/proximity/ProximityService.java @@ -60,6 +60,9 @@ public class ProximityService extends BleMulticonnectProfileService implements P public static final String BROADCAST_BATTERY_LEVEL = "no.nordicsemi.android.nrftoolbox.BROADCAST_BATTERY_LEVEL"; public static final String EXTRA_BATTERY_LEVEL = "no.nordicsemi.android.nrftoolbox.EXTRA_BATTERY_LEVEL"; + public static final String BROADCAST_ALARM_SWITCHED = "no.nordicsemi.android.nrftoolbox.BROADCAST_ALARM_SWITCHED"; + public static final String EXTRA_ALARM_STATE = "no.nordicsemi.android.nrftoolbox.EXTRA_ALARM_STATE"; + private final static String ACTION_DISCONNECT = "no.nordicsemi.android.nrftoolbox.proximity.ACTION_DISCONNECT"; private final static String ACTION_FIND = "no.nordicsemi.android.nrftoolbox.proximity.ACTION_FIND"; private final static String ACTION_SILENT = "no.nordicsemi.android.nrftoolbox.proximity.ACTION_SILENT"; @@ -93,11 +96,10 @@ public class ProximityService extends BleMulticonnectProfileService implements P * Toggles the Immediate Alert on given remote device. * * @param device the connected device. - * @return True if alarm has been enabled, false if disabled. */ - public boolean toggleImmediateAlert(final BluetoothDevice device) { + public void toggleImmediateAlert(final BluetoothDevice device) { final ProximityManager manager = (ProximityManager) getBleManager(device); - return manager.toggleImmediateAlert(); + manager.toggleImmediateAlert(); } /** @@ -165,7 +167,6 @@ public class ProximityService extends BleMulticonnectProfileService implements P break; } mBinder.toggleImmediateAlert(device); - createNotificationForConnectedDevice(device); } }; @@ -310,15 +311,27 @@ public class ProximityService extends BleMulticonnectProfileService implements P } @Override - public void onAlarmTriggered(final BluetoothDevice device) { + public void onAlarmTriggered(@NonNull final BluetoothDevice device) { playAlarm(device); } @Override - public void onAlarmStopped(final BluetoothDevice device) { + public void onAlarmStopped(@NonNull final BluetoothDevice device) { stopAlarm(device); } + @Override + public void onRemoteAlarmSwitched(@NonNull final BluetoothDevice device, final boolean on) { + final Intent broadcast = new Intent(BROADCAST_ALARM_SWITCHED); + broadcast.putExtra(EXTRA_DEVICE, device); + broadcast.putExtra(EXTRA_ALARM_STATE, on); + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcast); + + if (!mBound) { + createBackgroundNotification(); + } + } + @Override public void onBatteryLevelChanged(@NonNull final BluetoothDevice device, final int batteryLevel) { final Intent broadcast = new Intent(BROADCAST_BATTERY_LEVEL); @@ -386,6 +399,7 @@ public class ProximityService extends BleMulticonnectProfileService implements P // If there are more, just write number of them text.append(getString(R.string.proximity_notification_text_nothing_connected_number_disconnected, numberOfDisconnectedDevices)); } + text.append("."); builder.setContentText(text); } @@ -457,8 +471,8 @@ public class ProximityService extends BleMulticonnectProfileService implements P // This notification is to be shown not in a group final String name = getDeviceName(device); - builder.setContentTitle(getString(R.string.proximity_notification_linkloss_alert, name)); - builder.setTicker(getString(R.string.proximity_notification_linkloss_alert, name)); + builder.setContentTitle(getString(R.string.proximity_notification_link_loss_alert, name)); + builder.setTicker(getString(R.string.proximity_notification_link_loss_alert, name)); final Notification notification = builder.build(); final NotificationManagerCompat nm = NotificationManagerCompat.from(this); 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 bf261e38..d8f14c8e 100644 --- a/app/src/main/res/layout-land/activity_feature_proximity.xml +++ b/app/src/main/res/layout-land/activity_feature_proximity.xml @@ -71,7 +71,8 @@ + android:layout_height="match_parent" + tools:listitem="@layout/activity_feature_proximity_item"/>