This app supports geolocation to calculate your current tax automatically (California ONLY). It also can split your bill between any number of people.
package com.dhd.tipcalculator;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.text.NumberFormat;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.RadioGroup;
import android.widget.RadioButton;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Toast;
import android.text.TextWatcher;
import android.text.Editable;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.EditorInfo;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
public class MainActivity extends Activity
{
private RadioGroup mRadioGroup;
private SeekBar mSeekBar;
private TextView mTextView_mSplitNumber;
TextView mTextView_City;
private EditText mEdit_TipPercentage;
private EditText mEdit_PreTax;
private EditText mEdit_TaxPercentage;
private EditText mEdit_TotalTax;
private EditText mEdit_Bill_No_Tip;
private EditText mEdit_TipAmount;
private EditText mEdit_TotalAmount;
private EditText mEdit_PerPerson;
private int iPersonNum;
private double dPreTax;
private double dTaxPercentage;
private double dTotalTax;
private double dTotalBill_No_Tip;
private double dTipPercentage;
private double dTipAmount;
private double dTotalAmount;
private double dPerPersonAmount;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSeekBar = (SeekBar)this.findViewById(R.id.seekBar_Split);
mRadioGroup = (RadioGroup) findViewById(R.id.radioGroup_Tip);
mTextView_mSplitNumber = (TextView)this.findViewById(R.id.textView_SplitNumber);
mTextView_City = (TextView)this.findViewById(R.id.textView_City);
mEdit_TipPercentage = (EditText)this.findViewById(R.id.editText_TipPercentage);
mEdit_PreTax = (EditText)this.findViewById(R.id.editText_PreTax);
mEdit_TaxPercentage = (EditText)this.findViewById(R.id.editText_TaxPercentage);
mEdit_TotalTax = (EditText)this.findViewById(R.id.editText_TotalTax);
mEdit_Bill_No_Tip = (EditText)this.findViewById(R.id.editText_Bill_No_Tip);
mEdit_TipAmount = (EditText)this.findViewById(R.id.editText_TipAmount);
mEdit_TotalAmount = (EditText)this.findViewById(R.id.editText_TotalAmount);
mEdit_PerPerson = (EditText)this.findViewById(R.id.editText_PerPerson);
//initial data
mEdit_TipPercentage.setText("10");
dTipPercentage = 0.1;
mEdit_TaxPercentage.setText("8.75");
dTaxPercentage = 0.0875;
iPersonNum = 1;
//Geolocation
String serviceName = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(serviceName);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);
findViews();
}
private final LocationListener locationListener = new LocationListener()
{
public void onLocationChanged(Location location)
{
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider)
{
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
protected void onStop()
{
super.onStop();
locationManager.removeUpdates(locationListener);
}
private void readCSVfile(String city, String county)
{
String sdcardDir = Environment.getExternalStorageDirectory().toString();
String csvfile = sdcardDir+"/Sales Rate/SalesRate_CA.csv";
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csvfile)));
StringBuilder sb = new StringBuilder("");
String data = "";
while ((data = br.readLine()) != null)
{
String[] sarray = data.split(",");
if( (sarray[0].indexOf(city) != -1) && (sarray[2].indexOf(county) != -1) )
{
String strTipPercentage = sarray[1];
strTipPercentage = strTipPercentage.substring(0, strTipPercentage.length()-1);
mEdit_TipPercentage.setText(strTipPercentage);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void updateWithNewLocation(Location location)
{
String latLongString;
Locale.setDefault(Locale.ENGLISH);
if (location != null)
{
double lat = location.getLatitude();
double lng = location.getLongitude();
Geocoder geocoder=new Geocoder(this);
List places = null;
try
{
places = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);
}
catch (Exception e)
{
e.printStackTrace();
}
String state = "";
String city = "";
String county = "";
if (places != null && places.size() > 0)
{
state = ((Address) places.get(0)).getAdminArea();
city = ((Address) places.get(0)).getLocality();
county = ((Address) places.get(0)).getSubAdminArea();
mTextView_City.setText("("+county+")");
readCSVfile(city, county);
}
}
else
{
mTextView_City.setText(" ");
}
onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void findViews()
{
mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if(progress > 1)
{
mTextView_mSplitNumber.setText(String.valueOf(progress));
iPersonNum = progress;
}
else if(progress == 1)
{
mTextView_mSplitNumber.setText("No Split");
iPersonNum = 1;
}
if(progress == 0)
{
mSeekBar.setProgress(1);
mTextView_mSplitNumber.setText("No Split");
iPersonNum = 1;
}
if( (mEdit_PreTax.getText().toString().length()>0 ) && (mEdit_TaxPercentage.getText().toString().length()>0) &&
(mEdit_TipPercentage.getText().toString().length()>0) )
{
dPerPersonAmount = dTotalAmount / iPersonNum;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
mEdit_PerPerson.setText(String.valueOf(nf.format(dPerPersonAmount)));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
mEdit_PreTax.setOnFocusChangeListener(new OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus)
{
if(!hasFocus)
{
if( (mEdit_PreTax.getText().toString().length()>0 ) && (mEdit_TaxPercentage.getText().toString().length()>0) )
{
dPreTax = Double.parseDouble(mEdit_PreTax.getText().toString());
dTaxPercentage = Double.parseDouble(mEdit_TaxPercentage.getText().toString())/100;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
dTotalTax = dPreTax * dTaxPercentage;
mEdit_TotalTax.setText(String.valueOf(nf.format(dTotalTax)));
dTotalBill_No_Tip = dPreTax + dTotalTax;
mEdit_Bill_No_Tip.setText(String.valueOf(nf.format(dTotalBill_No_Tip)));
if(mEdit_TipPercentage.getText().toString().length()>0)
{
dTipPercentage = Double.parseDouble(mEdit_TipPercentage.getText().toString())/100;
if(dTipPercentage == 0.1)
mRadioGroup.check(R.id.radio10);
else if(dTipPercentage == 0.15)
mRadioGroup.check(R.id.radio15);
else if(dTipPercentage == 0.18)
mRadioGroup.check(R.id.radio18);
else if(dTipPercentage == 0.2)
mRadioGroup.check(R.id.radio20);
dTipAmount = dTipPercentage * dPreTax;
mEdit_TipAmount.setText(String.valueOf(nf.format(dTipAmount)));
dTotalAmount = dTotalBill_No_Tip + dTipAmount;
mEdit_TotalAmount.setText(String.valueOf(nf.format(dTotalAmount)));
dPerPersonAmount = dTotalAmount / iPersonNum;
mEdit_PerPerson.setText(String.valueOf(nf.format(dPerPersonAmount)));
}
}
}
}
});
mEdit_TaxPercentage.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if( (mEdit_PreTax.getText().toString().length()>0 ) && (mEdit_TaxPercentage.getText().toString().length()>0) )
{
dPreTax = Double.parseDouble(mEdit_PreTax.getText().toString());
dTaxPercentage = Double.parseDouble(mEdit_TaxPercentage.getText().toString())/100;
dTotalTax = dPreTax * dTaxPercentage;
mEdit_TotalTax.setText(String.valueOf(dTotalTax));
dTotalBill_No_Tip = dPreTax + dTotalTax;
mEdit_Bill_No_Tip.setText(String.valueOf(dTotalBill_No_Tip));
if(mEdit_TipPercentage.getText().toString().length()>0)
{
dTipPercentage = Double.parseDouble(mEdit_TipPercentage.getText().toString())/100;
if(dTipPercentage == 0.1)
mRadioGroup.check(R.id.radio10);
else if(dTipPercentage == 0.15)
mRadioGroup.check(R.id.radio15);
else if(dTipPercentage == 0.18)
mRadioGroup.check(R.id.radio18);
else if(dTipPercentage == 0.2)
mRadioGroup.check(R.id.radio20);
dTipAmount = dTipPercentage * dPreTax;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
mEdit_TipAmount.setText(String.valueOf(nf.format(dTipAmount)));
dTotalAmount = dTotalBill_No_Tip + dTipAmount;
mEdit_TotalAmount.setText(String.valueOf(nf.format(dTotalAmount)));
dPerPersonAmount = dTotalAmount / iPersonNum;
mEdit_PerPerson.setText(String.valueOf(nf.format(dPerPersonAmount)));
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
mEdit_Bill_No_Tip.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if( (mEdit_Bill_No_Tip.getText().toString().length()>0 ) && (mEdit_TaxPercentage.getText().toString().length()>0) )
{
dTaxPercentage = Double.parseDouble(mEdit_TaxPercentage.getText().toString())/100;
dTotalBill_No_Tip = Double.parseDouble(mEdit_Bill_No_Tip.getText().toString());
dPreTax = dTotalBill_No_Tip / (1 + dTaxPercentage);
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
mEdit_PreTax.setText(String.valueOf(nf.format(dPreTax)));
dTotalTax = dPreTax * dTaxPercentage;
mEdit_TotalTax.setText(String.valueOf(nf.format(dTotalTax)));
if(mEdit_TipPercentage.getText().toString().length()>0)
{
dTipPercentage = Double.parseDouble(mEdit_TipPercentage.getText().toString())/100;
if(dTipPercentage == 0.1)
mRadioGroup.check(R.id.radio10);
else if(dTipPercentage == 0.15)
mRadioGroup.check(R.id.radio15);
else if(dTipPercentage == 0.18)
mRadioGroup.check(R.id.radio18);
else if(dTipPercentage == 0.2)
mRadioGroup.check(R.id.radio20);
dTipAmount = dTipPercentage * dPreTax;
mEdit_TipAmount.setText(String.valueOf(nf.format(dTipAmount)));
dTotalAmount = dTotalBill_No_Tip + dTipAmount;
mEdit_TotalAmount.setText(String.valueOf(nf.format(dTotalAmount)));
dPerPersonAmount = dTotalAmount / iPersonNum;
mEdit_PerPerson.setText(String.valueOf(nf.format(dPerPersonAmount)));
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
mEdit_TipPercentage.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if(mEdit_TipPercentage.getText().toString().length()>0)
{
dTipPercentage = Double.parseDouble(mEdit_TipPercentage.getText().toString())/100;
if(dTipPercentage == 0.1)
mRadioGroup.check(R.id.radio10);
else if(dTipPercentage == 0.15)
mRadioGroup.check(R.id.radio15);
else if(dTipPercentage == 0.18)
mRadioGroup.check(R.id.radio18);
else if(dTipPercentage == 0.2)
mRadioGroup.check(R.id.radio20);
dTipAmount = dTipPercentage * dPreTax;
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
mEdit_TipAmount.setText(String.valueOf(nf.format(dTipAmount)));
dTotalAmount = dTotalBill_No_Tip + dTipAmount;
mEdit_TotalAmount.setText(String.valueOf(nf.format(dTotalAmount)));
dPerPersonAmount = dTotalAmount / iPersonNum;
mEdit_PerPerson.setText(String.valueOf(nf.format(dPerPersonAmount)));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
mRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
{
switch (checkedId)
{
case R.id.radio10:
mEdit_TipPercentage.setText("10");
dTipPercentage = 0.1;
break;
case R.id.radio15:
mEdit_TipPercentage.setText("15");
dTipPercentage = 0.15;
break;
case R.id.radio18:
mEdit_TipPercentage.setText("18");
dTipPercentage = 0.18;
break;
case R.id.radio20:
mEdit_TipPercentage.setText("20");
dTipPercentage = 0.20;
break;
default:
break;
}
}
});
} //end findViews
} //end MainActivity
