Fixes in Proximity profile

This commit is contained in:
Aleksander Nowakowski
2018-06-26 11:23:49 +02:00
parent ddbc16ae7b
commit b29860df75
12 changed files with 96 additions and 42 deletions

View File

@@ -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<DeviceAdapter.ViewHolder
private TextView addressView;
private TextView batteryView;
private ImageButton actionButton;
private ProgressBar progress;
ViewHolder(final View itemView) {
super(itemView);
@@ -103,14 +104,13 @@ public class DeviceAdapter extends RecyclerView.Adapter<DeviceAdapter.ViewHolder
addressView = itemView.findViewById(R.id.address);
batteryView = itemView.findViewById(R.id.battery);
actionButton = itemView.findViewById(R.id.action_find_silent);
progress = itemView.findViewById(R.id.progress);
// Configure FIND / SILENT button
actionButton.setOnClickListener(v -> {
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<DeviceAdapter.ViewHolder
}
private void bind(final BluetoothDevice device) {
final int state = mService.getConnectionState(device);
final boolean ready = mService.isReady(device);
String name = device.getName();
if (TextUtils.isEmpty(name))
@@ -134,14 +134,15 @@ public class DeviceAdapter extends RecyclerView.Adapter<DeviceAdapter.ViewHolder
final boolean on = mService.isImmediateAlertOn(device);
actionButton.setImageResource(on ? R.drawable.ic_stat_notify_proximity_silent : R.drawable.ic_stat_notify_proximity_find);
actionButton.setVisibility(state == BluetoothGatt.STATE_CONNECTED ? View.VISIBLE : View.GONE);
actionButton.setVisibility(ready ? View.VISIBLE : View.GONE);
progress.setVisibility(ready ? View.GONE : View.VISIBLE);
final Integer batteryValue = mService.getBatteryLevel(device);
if (batteryValue != null) {
batteryView.getCompoundDrawables()[0 /*left*/].setLevel(batteryValue);
batteryView.setVisibility(View.VISIBLE);
batteryView.setText(batteryView.getResources().getString(R.string.battery, batteryValue));
batteryView.setAlpha(state == BluetoothGatt.STATE_CONNECTED ? 1.0f : 0.5f);
batteryView.setAlpha(ready ? 1.0f : 0.5f);
} else {
batteryView.setVisibility(View.GONE);
}

View File

@@ -55,7 +55,9 @@ public class LinkLossFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(requireContext())
.setTitle(getString(R.string.app_name)).setMessage(getString(R.string.proximity_notification_linkloss_alert, mName))
.setPositiveButton(R.string.ok, null).create();
.setTitle(getString(R.string.app_name))
.setMessage(getString(R.string.proximity_notification_link_loss_alert, mName))
.setPositiveButton(R.string.ok, null)
.create();
}
}

View File

@@ -149,6 +149,11 @@ public class ProximityActivity extends BleMulticonnectProfileServiceReadyActivit
mAdapter.onBatteryValueReceived(device); // Value will be obtained from the service
}
@SuppressWarnings("unused")
private void onRemoteAlarmSwitched(final BluetoothDevice device, final boolean on) {
if (mAdapter != null)
mAdapter.onDeviceStateChanged(device); // Value will be obtained from the service
}
private void showLinkLossDialog(final String name) {
try {
@@ -158,6 +163,7 @@ public class ProximityActivity extends BleMulticonnectProfileServiceReadyActivit
// the activity must have been destroyed
}
}
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
@@ -168,6 +174,10 @@ public class ProximityActivity extends BleMulticonnectProfileServiceReadyActivit
final int batteryLevel = intent.getIntExtra(ProximityService.EXTRA_BATTERY_LEVEL, 0);
// Update GUI
onBatteryLevelChanged(device, batteryLevel);
} else if (ProximityService.BROADCAST_ALARM_SWITCHED.equals(action)) {
final boolean on = intent.getBooleanExtra(ProximityService.EXTRA_ALARM_STATE, false);
// Update GUI
onRemoteAlarmSwitched(device, on);
}
}
};
@@ -175,6 +185,7 @@ public class ProximityActivity extends BleMulticonnectProfileServiceReadyActivit
private static IntentFilter makeIntentFilter() {
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ProximityService.BROADCAST_BATTERY_LEVEL);
intentFilter.addAction(ProximityService.BROADCAST_ALARM_SWITCHED);
return intentFilter;
}
}

View File

@@ -29,7 +29,9 @@ import android.support.annotation.NonNull;
import java.util.UUID;
import no.nordicsemi.android.ble.callback.FailCallback;
import no.nordicsemi.android.ble.common.data.alert.AlertLevelData;
import no.nordicsemi.android.ble.error.GattError;
import no.nordicsemi.android.log.LogContract;
import no.nordicsemi.android.nrftoolbox.battery.BatteryManager;
import no.nordicsemi.android.nrftoolbox.parser.AlertLevelParser;
@@ -71,6 +73,8 @@ class ProximityManager extends BatteryManager<ProximityManagerCallbacks> {
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<ProximityManagerCallbacks> {
/**
* 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<ProximityManagerCallbacks> {
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();
}

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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);