/**
* openHAB, the open Home Automation Bus.
* Copyright (C) 2010-2012, openHAB.org <admin@openhab.org>
*
* See the contributors.txt file in the distribution for a
* full listing of individual contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses>.
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or
* combining it with Eclipse (or a modified version of that library),
* containing parts covered by the terms of the Eclipse Public License
* (EPL), the licensors of this Program grant you additional permission
* to convey the resulting work.
*/
package org.openhab.habdroid.ui;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Timer;
import java.util.TimerTask;
import org.openhab.habdroid.R;
import org.openhab.habdroid.util.Util;
import com.google.analytics.tracking.android.EasyTracker;
import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.Ndef;
import android.nfc.tech.NdefFormatable;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class OpenHABWriteTagActivity extends Activity {
// Logging TAG
private static final String TAG = "OpenHABWriteTagActivity";
private String sitemapPage = "";
private String item = "";
private String command = "";
@Override
public void onStart() {
super.onStart();
EasyTracker.getInstance().activityStart(this);
}
@Override
public void onStop() {
super.onStop();
EasyTracker.getInstance().activityStop(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Util.setActivityTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.openhabwritetag);
TextView writeTagMessage = (TextView)findViewById(R.id.write_tag_message);
if (!this.getPackageManager().hasSystemFeature("android.hardware.nfc")) {
writeTagMessage.setText(R.string.info_write_tag_unsupported);
} else if (NfcAdapter.getDefaultAdapter(this) != null) {
if (!NfcAdapter.getDefaultAdapter(this).isEnabled()) {
writeTagMessage.setText(R.string.info_write_tag_disabled);
}
}
if (getIntent().hasExtra("sitemapPage")) {
sitemapPage = getIntent().getExtras().getString("sitemapPage");
Log.d(TAG, "Got sitemapPage = " + sitemapPage);
}
if (getIntent().hasExtra("item")) {
item = getIntent().getExtras().getString("item");
Log.d(TAG, "Got item = " + item);
}
if (getIntent().hasExtra("command")) {
command = getIntent().getExtras().getString("command");
Log.d(TAG, "Got command = " + command);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public void onResume() {
Log.d(TAG, "onResume()");
super.onResume();
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
if (NfcAdapter.getDefaultAdapter(this) != null)
NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this, pendingIntent, null, null);
}
@Override
public void onPause() {
Log.d(TAG, "onPause()");
super.onPause();
if(NfcAdapter.getDefaultAdapter(this) != null)
NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String openhabURI = "";
//do something with tagFromIntent
Log.d(TAG, "NFC TAG = " + tagFromIntent.toString());
Log.d(TAG, "Writing page " + sitemapPage + " to TAG");
TextView writeTagMessage = (TextView)findViewById(R.id.write_tag_message);
try {
URI sitemapURI = new URI(sitemapPage);
if (sitemapURI.getPath().startsWith("/rest/sitemaps")) {
openhabURI = "openhab://sitemaps" + sitemapURI.getPath().substring(14, sitemapURI.getPath().length());
if (!TextUtils.isEmpty(item)) {
openhabURI = openhabURI + "?item=" + item;
}
if (!TextUtils.isEmpty(command)) {
openhabURI = openhabURI + "&command=" + command;
}
}
Log.d(TAG, "URI = " + openhabURI);
writeTagMessage.setText(R.string.info_write_tag_progress);
writeTag(tagFromIntent, openhabURI);
} catch (URISyntaxException e) {
Log.e(TAG, e.getMessage());
writeTagMessage.setText(R.string.info_write_failed);
}
}
public void writeTag(Tag tag, String openhabUri) {
Log.d(TAG, "Creating tag object");
TextView writeTagMessage = (TextView)findViewById(R.id.write_tag_message);
NdefRecord[] ndefRecords;
ndefRecords = new NdefRecord[1];
ndefRecords[0] = NdefRecord.createUri(openhabUri);
NdefMessage message = new NdefMessage(ndefRecords);
NdefFormatable ndefFormatable = NdefFormatable.get(tag);
if (ndefFormatable != null) {
Log.d(TAG, "Tag is uninitialized, formating");
try {
ndefFormatable.connect();
ndefFormatable.format(message);
ndefFormatable.close();
writeTagMessage.setText(R.string.info_write_tag_finished);
autoCloseActivity();
} catch (IOException e) {
// TODO Auto-generated catch block
if (e.getMessage() != null)
Log.e(TAG, e.getMessage());
writeTagMessage.setText(R.string.info_write_failed);
} catch (FormatException e) {
// TODO Auto-generated catch block
Log.e(TAG, e.getMessage());
writeTagMessage.setText(R.string.info_write_failed);
}
} else {
Log.d(TAG, "Tag is initialized, writing");
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
try {
Log.d(TAG, "Connecting");
ndef.connect();
Log.d(TAG, "Writing");
if (ndef.isWritable()) {
ndef.writeNdefMessage(message);
}
Log.d(TAG, "Closing");
ndef.close();
writeTagMessage.setText(R.string.info_write_tag_finished);
autoCloseActivity();
} catch (IOException e) {
// TODO Auto-generated catch block
if (e != null)
Log.e(TAG, e.getMessage());
} catch (FormatException e) {
// TODO Auto-generated catch block
Log.e(TAG, e.getMessage());
}
} else {
Log.e(TAG, "Ndef == null");
writeTagMessage.setText(R.string.info_write_failed);
}
}
}
@Override
public void finish() {
super.finish();
Util.overridePendingTransition(this, true);
}
private void autoCloseActivity() {
Timer autoCloseTimer = new Timer();
autoCloseTimer.schedule(new TimerTask() {
@Override
public void run() {
OpenHABWriteTagActivity.this.runOnUiThread(new Runnable() {
public void run() {
OpenHABWriteTagActivity.this.finish();
}
});
Log.d(TAG, "Autoclosing tag write activity");
}
}, 2000);
}
}