diff options
Diffstat (limited to 'app/src/main/java/io/trygvis/soilmoisture/MainActivity.java')
-rw-r--r-- | app/src/main/java/io/trygvis/soilmoisture/MainActivity.java | 234 |
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(); } } } |