1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-21 07:51:46 +02:00

Simplify bluetooth preference screen somewhat

This commit is contained in:
Erik Johansson
2018-04-08 22:42:43 +02:00
parent 1150bdbfed
commit cbca4a5037
2 changed files with 95 additions and 150 deletions

View File

@@ -21,19 +21,14 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.PorterDuff;
import android.os.Bundle; import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import com.health.openscale.R; import com.health.openscale.R;
@@ -42,38 +37,25 @@ import com.health.openscale.core.bluetooth.BluetoothCommunication;
import com.health.openscale.core.bluetooth.BluetoothFactory; import com.health.openscale.core.bluetooth.BluetoothFactory;
import com.health.openscale.gui.utils.PermissionHelper; import com.health.openscale.gui.utils.PermissionHelper;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
public class BluetoothPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { public class BluetoothPreferences extends PreferenceFragment {
private static final String PREFERENCE_KEY_BLUETOOTH_SMARTUSERASSIGN = "smartUserAssign";
private static final String PREFERENCE_KEY_BLUETOOTH_IGNOREOUTOFRANGE = "ignoreOutOfRange";
private static final String PREFERENCE_KEY_BLUETOOTH_SCANNER = "btScanner"; private static final String PREFERENCE_KEY_BLUETOOTH_SCANNER = "btScanner";
private CheckBoxPreference smartAssignEnable;
private CheckBoxPreference ignoreOutOfRangeEnable;
private PreferenceScreen btScanner; private PreferenceScreen btScanner;
public boolean isReceiverRegistered; private BluetoothAdapter btAdapter = null;
private BluetoothAdapter btAdapter = null;
private Map<String, String> foundDevices = new HashMap<>(); private Map<String, String> foundDevices = new HashMap<>();
public void startSearching() { public void startSearching() {
foundDevices.clear(); foundDevices.clear();
btScanner.removeAll();
IntentFilter filter = new IntentFilter(); Preference scanning = new Preference(getActivity());
scanning.setEnabled(false);
btScanner.addPreference(scanning);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
getActivity().registerReceiver(mReceiver, filter);
isReceiverRegistered = true;
OpenScale.getInstance(getActivity()).stopSearchingForBluetooth(); OpenScale.getInstance(getActivity()).stopSearchingForBluetooth();
btAdapter.startDiscovery(); btAdapter.startDiscovery();
} }
@@ -83,143 +65,83 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
String action = intent.getAction(); String action = intent.getAction();
if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
//discovery starts, we can show progress dialog or perform other tasks btScanner.getPreference(0).setTitle(R.string.label_bluetooth_searching);
Toast.makeText(getActivity().getApplicationContext(), R.string.label_bluetooth_searching, Toast.LENGTH_SHORT).show(); }
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//discovery finishes, dismiss progress dialog btScanner.getPreference(0).setTitle(R.string.label_bluetooth_searching_finished);
Toast.makeText(getActivity().getApplicationContext(), R.string.label_bluetooth_searching_finished, Toast.LENGTH_SHORT).show(); }
} else if (BluetoothDevice.ACTION_FOUND.equals(action)) { else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//bluetooth device found
BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getName() == null) { if (device.getName() == null) {
return; return;
} }
foundDevices.put(device.getAddress(), device.getName()); Preference prefBtDevice = new Preference(getActivity());
btScanner.removeAll(); prefBtDevice.setTitle(device.getName() + " [" + device.getAddress() + "]");
for (Map.Entry<String, String> entry : foundDevices.entrySet()) { BluetoothCommunication btDevice = BluetoothFactory.createDeviceDriver(getActivity(), device.getName());
if (getActivity() != null) { if (btDevice != null) {
Preference prefBtDevice = new Preference(getActivity()); prefBtDevice.setOnPreferenceClickListener(new onClickListenerDeviceSelect());
prefBtDevice.setSummary(entry.getKey()); prefBtDevice.setKey(device.getAddress());
prefBtDevice.setIcon(R.drawable.ic_bluetooth_connection_lost);
prefBtDevice.setSummary(btDevice.deviceName());
BluetoothCommunication btDevice = BluetoothFactory.createDeviceDriver(getActivity(), entry.getValue()); int tintColor = new EditText(getActivity()).getCurrentTextColor();
if (btDevice != null) { prefBtDevice.getIcon().setColorFilter(tintColor, PorterDuff.Mode.SRC_IN);
prefBtDevice.setOnPreferenceClickListener(new onClickListenerDeviceSelect());
prefBtDevice.setKey(entry.getKey());
prefBtDevice.setIcon(R.drawable.ic_bluetooth_connection_lost);
prefBtDevice.setTitle(entry.getValue() + " [" + btDevice.deviceName() + "]");
}
else {
prefBtDevice.setIcon(R.drawable.ic_bluetooth_disabled);
prefBtDevice.setTitle(entry.getValue() + " [" + getResources().getString(R.string.label_bt_device_no_support) + "]");
}
btScanner.addPreference(prefBtDevice); foundDevices.put(device.getAddress(), device.getName());
}
} }
else {
prefBtDevice.setIcon(R.drawable.ic_bluetooth_disabled);
prefBtDevice.setSummary(R.string.label_bt_device_no_support);
prefBtDevice.setEnabled(false);
}
btScanner.addPreference(prefBtDevice);
} }
} }
}; };
@Override
public void onDestroy() {
if (isReceiverRegistered) {
getActivity().unregisterReceiver(mReceiver);
}
super.onDestroy();
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
btAdapter = BluetoothAdapter.getDefaultAdapter(); // Intent filter for the scanning process
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
getActivity().registerReceiver(mReceiver, filter);
btAdapter = BluetoothAdapter.getDefaultAdapter();
addPreferencesFromResource(R.xml.bluetooth_preferences); addPreferencesFromResource(R.xml.bluetooth_preferences);
smartAssignEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_BLUETOOTH_SMARTUSERASSIGN);
ignoreOutOfRangeEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_BLUETOOTH_IGNOREOUTOFRANGE);
btScanner = (PreferenceScreen) findPreference(PREFERENCE_KEY_BLUETOOTH_SCANNER); btScanner = (PreferenceScreen) findPreference(PREFERENCE_KEY_BLUETOOTH_SCANNER);
if (btAdapter == null) {
btScanner.setOnPreferenceClickListener(new onClickListenerScannerSelect()); btScanner.setEnabled(false);
isReceiverRegistered = false; btScanner.setSummary("Bluetooth " + getResources().getString(R.string.info_is_not_available));
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); else {
btScanner.setSummary(prefs.getString("btDeviceName", "-")); btScanner.setOnPreferenceClickListener(new onClickListenerScannerSelect());
String deviceName = btScanner.getSharedPreferences().getString("btDeviceName", "-");
initSummary(getPreferenceScreen()); if (!deviceName.equals("-")) {
} deviceName += " [" +
btScanner.getSharedPreferences().getString("btHwAddress", "") +
private void initSummary(Preference p) { "]";
if (p instanceof PreferenceGroup) {
PreferenceGroup pGrp = (PreferenceGroup) p;
for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
initSummary(pGrp.getPreference(i));
} }
} else { btScanner.setSummary(deviceName);
updatePrefSummary(p); // Dummy preference to make screen open
btScanner.addPreference(new Preference(getActivity()));
} }
} }
@Override @Override
public void onResume() { public void onDestroy() {
super.onResume(); getActivity().unregisterReceiver(mReceiver);
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
} super.onDestroy();
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
updatePrefSummary(findPreference(key));
}
private void updatePrefSummary(Preference p) {
if (smartAssignEnable.isChecked()) {
ignoreOutOfRangeEnable.setEnabled(true);
} else {
ignoreOutOfRangeEnable.setEnabled(false);
}
if (p instanceof ListPreference) {
ListPreference listPref = (ListPreference) p;
p.setSummary(listPref.getTitle());
}
if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
if (p.getTitle().toString().contains("assword"))
{
p.setSummary("******");
} else {
p.setSummary(editTextPref.getText());
}
}
if (p instanceof MultiSelectListPreference) {
MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p;
CharSequence[] entries = editMultiListPref.getEntries();
CharSequence[] entryValues = editMultiListPref.getEntryValues();
List<String> currentEntries = new ArrayList<>();
Set<String> currentEntryValues = editMultiListPref.getValues();
for (int i = 0; i < entries.length; i++)
if (currentEntryValues.contains(entryValues[i]))
currentEntries.add(entries[i].toString());
p.setSummary(currentEntries.toString());
}
} }
private class onClickListenerScannerSelect implements Preference.OnPreferenceClickListener { private class onClickListenerScannerSelect implements Preference.OnPreferenceClickListener {
@@ -234,14 +156,17 @@ public class BluetoothPreferences extends PreferenceFragment implements SharedPr
private class onClickListenerDeviceSelect implements Preference.OnPreferenceClickListener { private class onClickListenerDeviceSelect implements Preference.OnPreferenceClickListener {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(final Preference preference) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); preference.getSharedPreferences().edit()
.putString("btHwAddress", preference.getKey())
.putString("btDeviceName", foundDevices.get(preference.getKey()))
.apply();
prefs.edit().putString("btHwAddress", preference.getKey()).commit(); btAdapter.cancelDiscovery();
prefs.edit().putString("btDeviceName", foundDevices.get(preference.getKey())).commit();
// Set summary text and trigger data set changed to make UI update
btScanner.setSummary(preference.getTitle()); btScanner.setSummary(preference.getTitle());
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); // hack to change the summary text ((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
btScanner.getDialog().dismiss(); btScanner.getDialog().dismiss();
return true; return true;

View File

@@ -1,13 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen <PreferenceScreen
android:key="btScanner" android:key="btScanner"
android:title="@string/label_device_type" android:title="@string/label_device_type"
android:persistent="false"> android:persistent="false">
<Preference android:key="0" android:title="@string/label_device_type"/> </PreferenceScreen>
</PreferenceScreen> <CheckBoxPreference
<CheckBoxPreference android:title="@string/label_mergeWithLastMeasurement" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="mergeWithLastMeasurement" android:defaultValue="true"/> android:defaultValue="true"
<CheckBoxPreference android:title="@string/label_bluetooth_enable" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="btEnable" android:defaultValue="false"/> android:key="mergeWithLastMeasurement"
<CheckBoxPreference android:title="@string/label_smartUserAssign" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="smartUserAssign" android:defaultValue="false"/> android:summaryOff="@string/info_is_not_enable"
<CheckBoxPreference android:title="@string/label_ignoreOutOfRange" android:summaryOn="@string/info_is_enable" android:summaryOff="@string/info_is_not_enable" android:key="ignoreOutOfRange" android:enabled="false" android:defaultValue="false"/> android:summaryOn="@string/info_is_enable"
android:title="@string/label_mergeWithLastMeasurement" />
<CheckBoxPreference
android:defaultValue="false"
android:key="btEnable"
android:summaryOff="@string/info_is_not_enable"
android:summaryOn="@string/info_is_enable"
android:title="@string/label_bluetooth_enable" />
<CheckBoxPreference
android:defaultValue="false"
android:key="smartUserAssign"
android:summaryOff="@string/info_is_not_enable"
android:summaryOn="@string/info_is_enable"
android:title="@string/label_smartUserAssign" />
<CheckBoxPreference
android:defaultValue="false"
android:dependency="smartUserAssign"
android:key="ignoreOutOfRange"
android:summaryOff="@string/info_is_not_enable"
android:summaryOn="@string/info_is_enable"
android:title="@string/label_ignoreOutOfRange" />
</PreferenceScreen> </PreferenceScreen>