diff --git a/android/bluetooth.c b/android/bluetooth.c
index 86f6cf4..d7c2222 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
bool pairing;
bool bredr_paired;
+ bool bredr_bonded;
bool le_paired;
+ bool le_bonded;
char *name;
char *friendly_name;
HAL_EV_BOND_STATE_CHANGED, sizeof(ev), &ev);
}
-static void update_bredr_state(struct device *dev, bool pairing, bool paired)
+static void update_bredr_state(struct device *dev, bool pairing, bool paired,
+ bool bonded)
{
- if (pairing == dev->pairing && paired == dev->bredr_paired)
+ if (pairing == dev->pairing && paired == dev->bredr_paired &&
+ bonded == dev->bredr_bonded)
return;
/* avoid unpairing device on incoming pairing request */
}
dev->bredr_paired = paired;
+ dev->bredr_bonded = bonded;
done:
dev->pairing = pairing;
}
-static void update_le_state(struct device *dev, bool pairing, bool paired)
+static void update_le_state(struct device *dev, bool pairing, bool paired,
+ bool bonded)
{
- if (pairing == dev->pairing && paired == dev->le_paired)
+ if (pairing == dev->pairing && paired == dev->le_paired &&
+ bonded == dev->le_bonded)
return;
/* avoid unpairing device on incoming pairing request */
}
dev->le_paired = paired;
+ dev->le_bonded = bonded;
done:
dev->pairing = pairing;
if (dev->pairing)
return HAL_BOND_STATE_BONDING;
+ /*
+ * We are checking for paired here instead of bonded as HAL API is
+ * using BOND state also if there was no bonding pairing.
+ */
if (dev->bredr_paired || dev->le_paired)
return HAL_BOND_STATE_BONDED;
}
static void update_device_state(struct device *dev, uint8_t addr_type,
- uint8_t status, bool pairing, bool paired)
+ uint8_t status, bool pairing, bool paired,
+ bool bonded)
{
uint8_t old_bond, new_bond;
old_bond = device_bond_state(dev);
if (addr_type == BDADDR_BREDR)
- update_bredr_state(dev, pairing, paired);
+ update_bredr_state(dev, pairing, paired, bonded);
else
- update_le_state(dev, pairing, paired);
+ update_le_state(dev, pairing, paired, bonded);
new_bond = device_bond_state(dev);
return;
update_device_state(dev, ev->key.addr.type, HAL_STATUS_SUCCESS, false,
- true);
+ true, !!ev->store_hint);
if (ev->store_hint) {
const struct mgmt_link_key_info *key = &ev->key;
get_device_name(dev);
update_device_state(dev, ev->addr.type, HAL_STATUS_SUCCESS, true,
- false);
+ false, false);
DBG("%s type %u secure %u", dst, ev->addr.type, ev->secure);
return;
update_device_state(dev, ev->addr.type, HAL_STATUS_SUCCESS, true,
- false);
+ false, false);
if (ev->confirm_hint)
send_ssp_request(dev, HAL_SSP_VARIANT_CONSENT, 0);
return;
update_device_state(dev, ev->addr.type, HAL_STATUS_SUCCESS, true,
- false);
+ false, false);
send_ssp_request(dev, HAL_SSP_VARIANT_ENTRY, 0);
}
return;
update_device_state(dev, ev->addr.type, HAL_STATUS_SUCCESS, true,
- false);
+ false, false);
send_ssp_request(dev, HAL_SSP_VARIANT_NOTIF, ev->passkey);
}
return;
update_device_state(dev, ev->addr.type, status_mgmt2hal(ev->status),
- false, false);
+ false, false, false);
}
static void mgmt_auth_failed_event(uint16_t index, uint16_t length,
return;
update_device_state(dev, ev->addr.type, status_mgmt2hal(ev->status),
- false, false);
+ false, false, false);
}
static void mgmt_device_unpaired_event(uint16_t index, uint16_t length,
return;
update_device_state(dev, ev->addr.type, HAL_STATUS_SUCCESS, false,
- false);
+ false, false);
}
static void store_ltk(const bdaddr_t *dst, uint8_t bdaddr_type, bool master,
return;
update_device_state(dev, ev->key.addr.type, HAL_STATUS_SUCCESS, false,
- true);
+ true, !!ev->store_hint);
if (ev->store_hint) {
const struct mgmt_ltk_info *key = &ev->key;
if (str) {
g_free(str);
dev->bredr_paired = true;
+ dev->bredr_bonded = true;
}
str = g_key_file_get_string(key_file, peer, "LongTermKey", NULL);
if (str) {
g_free(str);
dev->le_paired = true;
+ dev->le_bonded = true;
}
str = g_key_file_get_string(key_file, peer, "SlaveLongTermKey", NULL);
if (str) {
g_free(str);
dev->le_paired = true;
+ dev->le_bonded = true;
}
str = g_key_file_get_string(key_file, peer, "Name", NULL);
return;
update_device_state(dev, rp->addr.type, status_mgmt2hal(status), false,
- false);
+ false, false);
}
static uint8_t select_device_bearer(struct device *dev)
status = HAL_STATUS_SUCCESS;
- update_device_state(dev, cp.addr.type, HAL_STATUS_SUCCESS, true, false);
+ update_device_state(dev, cp.addr.type, HAL_STATUS_SUCCESS, true, false,
+ false);
fail:
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_BLUETOOTH, HAL_OP_CREATE_BOND,
return;
update_device_state(dev, rp->addr.type, HAL_STATUS_SUCCESS, false,
- false);
+ false, false);
}
static void handle_remove_bond_cmd(const void *buf, uint16_t len)