package tmay.bluetoothbacon.lightbluebean.fragments; import android.app.ListFragment; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.UiThread; import java.util.ArrayList; import java.util.Collection; import java.util.Timer; import java.util.TimerTask; import nl.littlerobots.bean.Bean; import nl.littlerobots.bean.BeanDiscoveryListener; import nl.littlerobots.bean.BeanManager; import tmay.bluetoothbacon.lightbluebean.adapters.BlueBleanAdapter; /** * Created by Terry on 9/19/14. */ @EFragment public class BlueBeanFinder extends ListFragment implements BeanDiscoveryListener { public final static int DISCOVERY_TIMEOUT = 20000; private MenuItem menuScanItem; private boolean isScanning; private OnBeanSelectionListener listener; private Timer timer; public static BlueBeanFinder newInstance() { return new BlueBeanFinder_(); } public interface OnBeanSelectionListener { public void onBeanSelected(Bean bean); } @org.androidannotations.annotations.Bean BlueBleanAdapter adapter; @AfterViews void onAfterViews() { setHasOptionsMenu(true); this.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { if (listener != null) { stopDiscovery(); listener.onBeanSelected(adapter.getItem(i)); } } }); } @Override public void onPause() { super.onPause(); getActivity().setProgressBarIndeterminateVisibility(false); stopDiscovery(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menuScanItem = menu.add("Scan for Beans") .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { startDiscovery(DISCOVERY_TIMEOUT); setScanningState(); return false; } }) .setEnabled(false); menuScanItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_WITH_TEXT); menuScanItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS); startDiscovery(DISCOVERY_TIMEOUT); setScanningState(); } @Override public void onBeanDiscovered(final Bean bean) { update(); BeanManager.getInstance().cancelDiscovery(); } @Override public void onDiscoveryComplete() { //this never gets called! //update(); stopDiscovery(); } public void setOnBeanSelectedListener(OnBeanSelectionListener listener) { this.listener = listener; } private void startDiscovery(int timeout) { adapter.clear(); BeanManager.getInstance().startDiscovery(this); isScanning = true; timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { stopDiscovery(); // update(); } }, timeout, 1); } private void stopDiscovery() { getActivity().setProgressBarIndeterminateVisibility(false); BeanManager.getInstance().cancelDiscovery(); timer.cancel(); isScanning = false; } @UiThread void update() { Collection<Bean> beans = BeanManager.getInstance().getBeans(); adapter.setBeans(new ArrayList<Bean>(beans)); this.setListAdapter(adapter); setScanningState(); } @UiThread void setScanningState() { menuScanItem.setEnabled(!isScanning); getActivity().setProgressBarIndeterminateVisibility(isScanning); } }