aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/io/trygvis/soilmoisture/MainActivity.java')
-rw-r--r--app/src/main/java/io/trygvis/soilmoisture/MainActivity.java234
1 files changed, 191 insertions, 43 deletions
diff --git a/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java b/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java
index 6adc96c..64e8202 100644
--- a/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java
+++ b/app/src/main/java/io/trygvis/soilmoisture/MainActivity.java
@@ -6,6 +6,8 @@ import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.database.DataSetObservable;
+import android.database.DataSetObserver;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
@@ -14,8 +16,8 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.BaseAdapter;
import android.widget.Button;
+import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -31,7 +33,7 @@ import io.trygvis.android.LocalBinder;
import io.trygvis.android.bt.BtActivitySupport;
import static io.trygvis.soilmoisture.ExceptionHandler.EXCEPTION_HANDLER;
-import static io.trygvis.soilmoisture.SmDevicesManager.SmDeviceListener;
+import static io.trygvis.soilmoisture.SoilMoistureService.SoilMoistureListener;
import static java.lang.String.valueOf;
public class MainActivity extends ListActivity {
@@ -42,12 +44,12 @@ public class MainActivity extends ListActivity {
private static final int REQUEST_ENABLE_BT = 1;
private final BtActivitySupport btActivitySupport = new BtActivitySupport(this, REQUEST_ENABLE_BT);
- private final SmDeviceListener serviceListener = new MySmDeviceListener();
+ private final SoilMoistureListener serviceListener = new MySoilMoistureListener();
private final MainActivity context = this;
private DeviceListAdapter deviceList;
private ServiceConnection serviceConnection;
- private SmDevicesManager smDevicesManager;
+ private SoilMoistureService soilMoistureService;
private ProgressDialog initializing;
private boolean ready;
@@ -73,22 +75,24 @@ public class MainActivity extends ListActivity {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
Log.i(TAG, "onServiceConnected");
- smDevicesManager = ((LocalBinder<SmDevicesManager>) service).getService();
- registerReceiver(serviceListener, SmDeviceListener.INTENT_FILTER);
+ soilMoistureService = ((LocalBinder<SoilMoistureService>) service).getService();
+ registerReceiver(serviceListener, SoilMoistureListener.INTENT_FILTER);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.i(TAG, "onServiceDisconnected");
- smDevicesManager = null;
+ soilMoistureService = null;
stopScan();
}
};
- bindService(new Intent(this, DefaultSmDevicesManager.class), serviceConnection, BIND_AUTO_CREATE);
+ bindService(new Intent(this, DefaultSoilMoistureService.class), serviceConnection, BIND_AUTO_CREATE);
initializing = ProgressDialog.
show(this, "Initializing", "Connecting to Bluetooth system.", true);
+
+ setContentView(R.layout.main);
}
@Override
@@ -112,7 +116,7 @@ public class MainActivity extends ListActivity {
return;
}
- registerReceiver(serviceListener, SmDeviceListener.INTENT_FILTER);
+ registerReceiver(serviceListener, SoilMoistureListener.INTENT_FILTER);
}
@Override
@@ -141,20 +145,30 @@ public class MainActivity extends ListActivity {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
+ MenuItem stop = menu.findItem(R.id.menu_stop);
+ MenuItem scan = menu.findItem(R.id.menu_scan);
+ MenuItem refresh = menu.findItem(R.id.menu_refresh);
+ MenuItem showAll = menu.findItem(R.id.menu_show_all);
+ MenuItem groupByDevice = menu.findItem(R.id.menu_group_by_device);
+
if (ready) {
- if (!smDevicesManager.isScanning()) {
- menu.findItem(R.id.menu_stop).setVisible(false);
- menu.findItem(R.id.menu_scan).setVisible(true);
- menu.findItem(R.id.menu_refresh).setActionView(null);
+ if (!soilMoistureService.isScanning()) {
+ stop.setVisible(false);
+ scan.setVisible(true);
+ refresh.setActionView(null);
} else {
- menu.findItem(R.id.menu_stop).setVisible(true);
- menu.findItem(R.id.menu_scan).setVisible(false);
- menu.findItem(R.id.menu_refresh).setActionView(R.layout.actionbar_indeterminate_progress);
+ stop.setVisible(true);
+ scan.setVisible(false);
+ refresh.setActionView(R.layout.actionbar_indeterminate_progress);
}
+ showAll.setChecked(deviceList.isShowAll());
+ groupByDevice.setChecked(deviceList.isGroupByDevice());
} else {
- menu.findItem(R.id.menu_stop).setVisible(false);
- menu.findItem(R.id.menu_scan).setVisible(true);
- menu.findItem(R.id.menu_refresh).setActionView(null);
+ stop.setVisible(false);
+ scan.setVisible(true);
+ refresh.setActionView(null);
+ showAll.setVisible(false);
+ groupByDevice.setVisible(false);
}
return true;
}
@@ -163,6 +177,7 @@ public class MainActivity extends ListActivity {
public boolean onOptionsItemSelected(MenuItem item) {
Log.i(TAG, "onOptionsItemSelected");
+ boolean consumed = true;
switch (item.getItemId()) {
case R.id.menu_scan:
startScan();
@@ -170,39 +185,47 @@ public class MainActivity extends ListActivity {
case R.id.menu_stop:
stopScan();
break;
+ case R.id.menu_show_all:
+ item.setChecked(!item.isChecked());
+ deviceList.setShowAll(item.isChecked());
+ break;
+ case R.id.menu_group_by_device:
+ item.setChecked(!item.isChecked());
+ deviceList.setGroupByDevice(item.isChecked());
+ break;
+ default:
+ consumed = super.onOptionsItemSelected(item);
}
- return super.onOptionsItemSelected(item);
+ return consumed;
}
private void startScan() {
- smDevicesManager.startScanning(SCAN_PERIOD);
+ soilMoistureService.startScanning(SCAN_PERIOD);
}
private void stopScan() {
- if (smDevicesManager != null) {
- smDevicesManager.stopScanning();
+ if (soilMoistureService != null) {
+ soilMoistureService.stopScanning();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
stopScan();
-
-// SmDevice state = smDevicesManager.getDevices(SmDevice.deviceComparator).get(position);
}
// -----------------------------------------------------------------------
//
// -----------------------------------------------------------------------
- static class DeviceListItem {
+ static class DeviceItem {
final TextView deviceName;
final TextView deviceAddress;
final TextView rssi;
final ProgressBar spinner;
final Button connect;
- DeviceListItem(View view) {
+ DeviceItem(View view) {
this.deviceName = (TextView) view.findViewById(R.id.device_name);
this.deviceAddress = (TextView) view.findViewById(R.id.device_address);
this.rssi = (TextView) view.findViewById(R.id.device_rssi);
@@ -211,39 +234,162 @@ public class MainActivity extends ListActivity {
}
}
- private class DeviceListAdapter extends BaseAdapter {
+ private class DeviceListAdapter implements ListAdapter {
+ private final DataSetObservable dataSetObservable = new DataSetObservable();
private List<SmDevice> devices = new ArrayList<>();
+ private List<Object> current = new ArrayList<>();
private LayoutInflater inflater = MainActivity.this.getLayoutInflater();
+ private boolean groupByDevice = true;
+ private boolean showAll = false;
+
+ public void sort() {
+ Log.i(TAG, "sort(), groupByDevice=" + groupByDevice + ", showAll=" + showAll);
+ current = new ArrayList<>();
+
+ List<SmDevice> usefulDevices = new ArrayList<>(devices.size());
+ List<SmDevice> unusefulDevices = new ArrayList<>(devices.size());
+ for (SmDevice d : devices) {
+ (d.isUseful() ? usefulDevices : unusefulDevices).add(d);
+ }
+ List<SoilMonitor> monitors = new ArrayList<>();
+ for (SmDevice d : devices) {
+ monitors.addAll(d.getMonitors());
+ }
+
+ if (groupByDevice) {
+ current.addAll(usefulDevices);
+ if (showAll) {
+ current.addAll(unusefulDevices);
+ }
+ } else {
+ current.addAll(monitors);
+ }
+ dataSetObservable.notifyChanged();
+ }
+
+ public void notifyDataSetChanged() {
+ dataSetObservable.notifyChanged();
+ }
+
+ public void setShowAll(boolean showAll) {
+ if (showAll == this.showAll) {
+ return;
+ }
+
+ this.showAll = showAll;
+ sort();
+ }
+
+ public boolean isShowAll() {
+ return showAll;
+ }
+
+ public void setGroupByDevice(boolean groupByDevice) {
+ if (groupByDevice == this.groupByDevice) {
+ return;
+ }
+
+ this.groupByDevice = groupByDevice;
+ sort();
+ }
+
+ public boolean isGroupByDevice() {
+ return groupByDevice;
+ }
+
+ // -----------------------------------------------------------------------
+ // ListAdapter Implementation
+ // -----------------------------------------------------------------------
+
+ @Override
+ public void registerDataSetObserver(DataSetObserver observer) {
+ dataSetObservable.registerObserver(observer);
+ }
+
+ @Override
+ public void unregisterDataSetObserver(DataSetObserver observer) {
+ dataSetObservable.unregisterObserver(observer);
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return true;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ Object o = current.get(position);
+
+ if (o instanceof SmDevice) {
+ return 0;
+ } else if (o instanceof SoilMonitor) {
+ return 1;
+ }
+
+ throw new RuntimeException("Unknown kind: " + o.getClass());
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 2;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return current.isEmpty();
+ }
+
@Override
public int getCount() {
- return devices.size();
+ return current.size();
}
@Override
- public SmDevice getItem(int i) {
- return devices.get(i);
+ public Object getItem(int position) {
+ return current.get(position);
}
@Override
- public long getItemId(int i) {
- return i;
+ public long getItemId(int position) {
+ return position;
}
@Override
- public View getView(int i, View view, ViewGroup viewGroup) {
- DeviceListItem item;
+ public View getView(int position, View view, ViewGroup viewGroup) {
+ Object o = current.get(position);
+ if (o instanceof SmDevice) {
+ return getSmDeviceView((SmDevice) o, view);
+ } else if (o instanceof SoilMonitor) {
+ return getSoilMonitorView((SoilMonitor) o, view);
+ }
+
+ throw new RuntimeException("Not implemented");
+ }
+
+ private View getSmDeviceView(SmDevice smDevice, View view) {
+
+ DeviceItem item;
if (view == null) {
view = inflater.inflate(R.layout.listitem_device, null);
- item = new DeviceListItem(view);
+ item = new DeviceItem(view);
view.setTag(item);
view.setClickable(false);
} else {
- item = (DeviceListItem) view.getTag();
+ item = (DeviceItem) view.getTag();
}
- SmDevice smDevice = getItem(i);
if (smDevice.getName() != null) {
item.deviceName.setText(smDevice.getName());
} else {
@@ -261,9 +407,13 @@ public class MainActivity extends ListActivity {
return view;
}
+
+ private View getSoilMonitorView(SoilMonitor soilMonitor, View view) {
+ throw new RuntimeException("Not implemented");
+ }
}
- private class MySmDeviceListener extends SmDeviceListener {
+ private class MySoilMoistureListener extends SoilMoistureListener {
@Override
public void onReady(boolean ok) {
if (!ok) {
@@ -297,11 +447,9 @@ public class MainActivity extends ListActivity {
@Override
public void onNewDevice(String address) {
- SmDevice device = smDevicesManager.getDevice(address);
+ SmDevice device = soilMoistureService.getDevice(address);
deviceList.devices.add(device);
- deviceList.notifyDataSetInvalidated();
-
- Log.i(TAG, "deviceList.devices.size() = " + deviceList.devices.size());
+ deviceList.sort();
}
}
}