mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-24 09:13:04 +02:00
Store device password in SharedPreferences.
This way, the scale has to be paired only once.
This commit is contained in:
@@ -18,6 +18,8 @@ package com.health.openscale.core.bluetooth;
|
|||||||
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGatt;
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
import com.health.openscale.R;
|
import com.health.openscale.R;
|
||||||
@@ -73,21 +75,32 @@ public class BluetoothTrisaBodyAnalyze extends BluetoothCommunication {
|
|||||||
*/
|
*/
|
||||||
private static final int BROADCAST_ID = 0;
|
private static final int BROADCAST_ID = 0;
|
||||||
|
|
||||||
/** Hardware address (i.e., Bluetooth mac) of the connected device. */
|
/**
|
||||||
@Nullable
|
* Prefix for {@link SharedPreferences} keys that store device passwords.
|
||||||
private String hwAddress;
|
*
|
||||||
|
* @see #loadDevicePassword
|
||||||
|
* @see #saveDevicePassword
|
||||||
|
*/
|
||||||
|
private static final String SHARED_PREFERENCES_PASSWORD_KEY_PREFIX =
|
||||||
|
"trisa_body_analyze_password_for_device_";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Device password as a 32-bit integer, or {@code null} if the device password is unknown.
|
* ASCII string that identifies the connected device (i.e. the hex-encoded Bluetooth MAC
|
||||||
*
|
* address). Used in shared preference keys to store per-device settings.
|
||||||
* <p>TODO: store this is in a database.</p>
|
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
|
private String deviceId;
|
||||||
|
|
||||||
|
/** Device password as a 32-bit integer, or {@code null} if the device password is unknown. */
|
||||||
|
@Nullable
|
||||||
private static Integer password;
|
private static Integer password;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether we are pairing. If this is {@code true} then we have written the
|
* Indicates whether we are pairing. If this is {@code true} then we have written the
|
||||||
* set-broadcast-id command, and should disconnect after the write succeeds.
|
* set-broadcast-id command, and should disconnect after the write succeeds.
|
||||||
|
*
|
||||||
|
* @see #onPasswordReceived
|
||||||
|
* @see #nextBluetoothCmd
|
||||||
*/
|
*/
|
||||||
private boolean pairing = false;
|
private boolean pairing = false;
|
||||||
|
|
||||||
@@ -103,8 +116,9 @@ public class BluetoothTrisaBodyAnalyze extends BluetoothCommunication {
|
|||||||
@Override
|
@Override
|
||||||
public void connect(String hwAddress) {
|
public void connect(String hwAddress) {
|
||||||
Timber.i("connect(\"%s\")", hwAddress);
|
Timber.i("connect(\"%s\")", hwAddress);
|
||||||
this.hwAddress = hwAddress;
|
|
||||||
super.connect(hwAddress);
|
super.connect(hwAddress);
|
||||||
|
this.deviceId = hwAddress;
|
||||||
|
this.password = loadDevicePassword(context, hwAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -205,12 +219,13 @@ public class BluetoothTrisaBodyAnalyze extends BluetoothCommunication {
|
|||||||
Timber.e("Password data too short");
|
Timber.e("Password data too short");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int newPassword = getInt32(data, 1);
|
password = getInt32(data, 1);
|
||||||
if (password != null && password != newPassword) {
|
if (deviceId == null) {
|
||||||
Timber.w("Replacing old password '%08x'", password);
|
Timber.e("Can't save password: device id not set!");
|
||||||
|
} else {
|
||||||
|
Timber.i("Saving password '%08x' for device id '%s'", password, deviceId);
|
||||||
|
saveDevicePassword(context, deviceId, password);
|
||||||
}
|
}
|
||||||
Timber.i("Storing password '%08x'", newPassword);
|
|
||||||
password = newPassword;
|
|
||||||
|
|
||||||
sendMessage(R.string.trisa_scale_pairing_succeeded, null);
|
sendMessage(R.string.trisa_scale_pairing_succeeded, null);
|
||||||
|
|
||||||
@@ -312,4 +327,27 @@ public class BluetoothTrisaBodyAnalyze extends BluetoothCommunication {
|
|||||||
int exponent = data[offset + 3]; // note: byte is signed.
|
int exponent = data[offset + 3]; // note: byte is signed.
|
||||||
return mantissa * Math.pow(10, exponent);
|
return mantissa * Math.pow(10, exponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getDevicePasswordKey(String deviceId) {
|
||||||
|
return SHARED_PREFERENCES_PASSWORD_KEY_PREFIX + deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static Integer loadDevicePassword(Context context, String deviceId) {
|
||||||
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
String key = getDevicePasswordKey(deviceId);
|
||||||
|
try {
|
||||||
|
// Strictly speaking, there is a race condition between the calls to contains() and
|
||||||
|
// getInt(), but it's not a problem because we never delete passwords.
|
||||||
|
return prefs.contains(key) ? Integer.valueOf(prefs.getInt(key, 0)) : null;
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
Timber.e(e, "Password preference value is not an integer.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void saveDevicePassword(Context context, String deviceId, int password) {
|
||||||
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
prefs.edit().putInt(getDevicePasswordKey(deviceId), password).apply();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user