package com.bitcoinlabs.android;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.bitcoin.bouncycastle.util.encoders.Base64;
import com.google.bitcoin.core.Transaction;
/**
* Created by IntelliJ IDEA.
* User: kevin
* Date: 4/1/11
* Time: 2:56 PM
* To change this template use File | Settings | File Templates.
*/
public class ConfirmPay extends Activity
{
public static final String CONFIRM_PAY_URI = "CONFIRM_PAY_URI";
int TIMEOUT_MS = 10000;
long FEE_SATOSHIS = 50000;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle("Send Bitcoin");
setContentView(R.layout.pay_confirm);
Uri bitcoinUri = getIntent().getData();
assert("bitcoin".equals(bitcoinUri.getScheme()));
// Hacky. Parses "bitcoin:...address..."
bitcoinUri = Uri.parse("bitcoin://" + bitcoinUri.getEncodedSchemeSpecificPart());
final String bitcoinAddress = bitcoinUri.getAuthority();
String amount = bitcoinUri.getQueryParameter("amount");
final String label = bitcoinUri.getQueryParameter("label");
String message = bitcoinUri.getQueryParameter("message");
TextView payAddress = (TextView)findViewById(R.id.snd_address);
final EditText payAmount = (EditText) findViewById(R.id.snd_amount);
final EditText payLabel = (EditText) findViewById(R.id.snd_label);
final EditText payMessage = (EditText) findViewById(R.id.snd_message);
payAddress.setText("Address: " + bitcoinAddress);
payLabel.setText(label);
payMessage.setText(message);
long initialSatoshis = 0;
if (amount != null) {
initialSatoshis = MoneyUtils.btcStringToSatoshis(amount);
}
payAmount.setText(MoneyUtils.formatSatoshisAsBtcString(initialSatoshis));
payAmount.setSelectAllOnFocus(true);
findViewById(R.id.confirmButton).setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
long amountSatoshis = MoneyUtils.btcStringToSatoshis(payAmount.getText().toString());
WalletOpenHelper helper = new WalletOpenHelper(getApplicationContext());
Transaction tx = helper.createTransaction(amountSatoshis, bitcoinAddress, FEE_SATOSHIS);
if (tx == null) {
Toast.makeText(ConfirmPay.this, "Insufficient balance." , Toast.LENGTH_LONG).show();
}
else {
byte[] msg = tx.bitcoinSerialize();
String msg64 = new String(new Base64().encode(msg));
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MS);
HttpClient client = new DefaultHttpClient(httpParams);
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://97.107.139.194:8000/api/publish-tx.js");
try {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("tx64", msg64));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
Toast.makeText(ConfirmPay.this, payAmount.getText() + "BTC paid to " + payLabel.getText() + " (" + bitcoinAddress + ")" , Toast.LENGTH_LONG).show();
}
catch (ClientProtocolException e) {
Toast.makeText(ConfirmPay.this, "HTTP: ClientProtocolException", Toast.LENGTH_LONG).show();
}
catch (IOException e) {
Toast.makeText(ConfirmPay.this, "HTTP: IOException", Toast.LENGTH_LONG).show();
}
}
finish();
}
});
findViewById(R.id.cancelButton).setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
setResult(RESULT_CANCELED);
Toast.makeText(ConfirmPay.this, "Bitcoin payment canceled." , Toast.LENGTH_LONG).show();
finish();
}
});
}
public static void callMe(Context c, Uri bitcoinUri)
{
final Intent intent = new Intent(null, bitcoinUri, c, ConfirmPay.class);
c.startActivity(intent);
}
}