package tmay.bluetoothbacon.ledstrip.fragments;
import android.app.Fragment;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.Toast;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ItemClick;
import org.androidannotations.annotations.Receiver;
import org.androidannotations.annotations.ViewById;
import tmay.bluetoothbacon.R;
import tmay.bluetoothbacon.ledstrip.adapters.ColorGridAdapter;
import tmay.bluetoothbacon.ledstrip.services.StripControlService;
import tmay.bluetoothbacon.ledstrip.util.ColorUtility;
/**
* Created by Terry on 10/5/14.
*/
@EFragment(R.layout.fragment_led_strip_control)
public class LedStripFragment extends BaseStripControlFragment {
public static LedStripFragment newInstance(BluetoothDevice device) {
LedStripFragment fragment = new LedStripFragment_();
Bundle args = new Bundle();
args.putParcelable("device", device);
fragment.setArguments(args);
return fragment;
}
@Bean
ColorUtility colorUtility;
@Bean
ColorGridAdapter adapter;
@ViewById(R.id.color_grid)
GridView gridLayout;
private BluetoothDevice device;
private boolean isReadyForInput;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.add("Clear Strip").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
if (boundService != null)
boundService.fillStrip(0);
return false;
}
});
menu.add("Fill Random").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
int[] rnd = colorUtility.getRandomColorArray();
boundService.initStrip(rnd);
if (adapter != null)
adapter.setColors(rnd);
return false;
}
});
menu.add("Run Rainbow").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
boundService.doRainbowWipe();
return false;
}
});
menu.add("Edit Mode").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
if (adapter != null)
boundService.initStrip(adapter.getColors());
return false;
}
});
}
@Receiver(actions = StripControlService.ACTION_GATT_SERVICES_DISCOVERED, registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onGattServiceDiscovery() {
Toast.makeText(getActivity(), "Warming up",
Toast.LENGTH_LONG).show();
boundService.doRainbowWipe();
}
@Receiver(actions = StripControlService.RAINBOW_WIPE_COMPLETE, registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onRainbowWipeComplete() {
boundService.initStrip(adapter.getColors());
Toast.makeText(getActivity(), "ready",
Toast.LENGTH_LONG).show();
isReadyForInput = true;
}
@Override
protected void onServiceReady() {
super.onServiceReady();
this.device = (BluetoothDevice) this.getArguments().get("device");
boundService.connectGatt(device);
Toast.makeText(getActivity(), "Discovering services",
Toast.LENGTH_LONG).show();
isReadyForInput = false;
}
@AfterViews
void onAfterViews() {
this.setHasOptionsMenu(true);
gridLayout.setAdapter(adapter);
adapter.setColors(colorUtility.getColorArray());
}
@ItemClick(R.id.color_grid)
void onColorSwatchClick(final int position) {
if (!isReadyForInput)
return;
EditColorFragment dialog = EditColorFragment.newInstance(adapter.getColor(position));
dialog.show(getFragmentManager(), "editcolor");
dialog.setColorAdjustListener(new EditColorFragment.OnColorAdjustListener() {
@Override
public void onColorChanged(int color) {
boundService.setPixel(position, color);
adapter.setColor(position, color);
}
});
}
}