package com.kuxhausen.huemore.nfc;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Pair;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ToggleButton;
import com.kuxhausen.huemore.Helpers;
import com.kuxhausen.huemore.NavigationDrawerActivity;
import com.kuxhausen.huemore.NetworkManagedActivity;
import com.kuxhausen.huemore.R;
import com.kuxhausen.huemore.net.BrightnessManager;
import com.kuxhausen.huemore.net.ConnectivityService;
import com.kuxhausen.huemore.net.DeviceManager;
import com.kuxhausen.huemore.persistence.Definitions.InternalArguments;
import com.kuxhausen.huemore.persistence.FutureEncodingException;
import com.kuxhausen.huemore.persistence.HueUrlEncoder;
import com.kuxhausen.huemore.persistence.InvalidEncodingException;
import com.kuxhausen.huemore.state.BulbState;
import com.kuxhausen.huemore.state.Group;
import com.kuxhausen.huemore.state.Mood;
import com.kuxhausen.huemore.state.NfcGroup;
import java.nio.charset.Charset;
public class NfcReaderActivity extends NetworkManagedActivity implements OnCheckedChangeListener,
OnClickListener {
private Integer[] mBulbs;
private Mood mood;
private Integer mBrightness;
private ToggleButton mOnButton;
private Button mDoneButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Helpers.applyLocalizationPreference(this);
setContentView(R.layout.nfc_reader);
mOnButton = (ToggleButton) this.findViewById(R.id.onToggleButton);
mDoneButton = (Button) this.findViewById(R.id.doneButton);
mDoneButton.setOnClickListener(this);
}
@Override
public void onResume() {
super.onResume();
Bundle b = this.getIntent().getExtras();
if (b != null && b.containsKey(InternalArguments.ENCODED_MOOD)) {
Pair<Integer[], Pair<Mood, Integer>> result;
try {
String encodedMood = b.getString(InternalArguments.ENCODED_MOOD);
result = HueUrlEncoder.decode(encodedMood);
mBulbs = result.first;
mood = result.second.first;
mBrightness = result.second.second;
mOnButton.setOnCheckedChangeListener(null);
Intent intent = new Intent(this, ConnectivityService.class);
intent.putExtra(InternalArguments.ENCODED_MOOD, encodedMood);
this.startService(intent);
boolean on = false;
if (mood.getEvents().length >0 && mood.getEvents()[0].getBulbState().getOn()) {
on = true;
}
mOnButton.setChecked(on);
mOnButton.setOnCheckedChangeListener(this);
} catch (InvalidEncodingException e) {
this.finish();
} catch (FutureEncodingException e) {
this.finish();
}
}
}
public static String getGroupMoodBrightnessFromNdef(Intent input) {
Parcelable[] rawMsgs = input.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
byte[] payload = msgs[0].getRecords()[0].getPayload();
String data = new String(payload, 1, payload.length - 1, Charset.forName("US-ASCII"));
data = data.substring(data.indexOf('?') + 1);
return data;
}
return "";
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.startActivity(new Intent(this, NavigationDrawerActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
BulbState bs = new BulbState();
bs.setOn(isChecked);
ConnectivityService service = this.getService();
if (service != null) {
DeviceManager dm = service.getDeviceManager();
Group g = new NfcGroup(mBulbs, null, this);
BrightnessManager briManager = dm.obtainBrightnessManager(g);
for (Long bulbId : g.getNetworkBulbDatabaseIds()) {
if(dm.getNetworkBulb(bulbId)!=null)
briManager.setState(dm.getNetworkBulb(bulbId), bs);
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.doneButton:
onBackPressed();
}
}
}