package com.maciekjanusz.compassproject.input;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.text.InputFilter;
import android.util.AttributeSet;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.google.android.gms.maps.model.LatLng;
import com.maciekjanusz.compassproject.R;
import butterknife.Bind;
import butterknife.ButterKnife;
import static com.maciekjanusz.compassproject.util.CompassMath.validateLatitude;
import static com.maciekjanusz.compassproject.util.CompassMath.validateLongitude;
import static com.maciekjanusz.compassproject.util.CompassMath.degreesToDecimal;
import static com.maciekjanusz.compassproject.util.CompassMath.validateMinSec;
public class DegreesLocationInputView extends LinearLayout implements LocationInputView {
@Bind(R.id.latitude_degrees_edit_text) EditText latDegEditText;
@Bind(R.id.latitude_minutes_edit_text) EditText latMinEditText;
@Bind(R.id.latitude_seconds_edit_text) EditText latSecEditText;
@Bind(R.id.longitude_degrees_edit_text) EditText lonDegEditText;
@Bind(R.id.longitude_minutes_edit_text) EditText lonMinEditText;
@Bind(R.id.longitude_seconds_edit_text) EditText lonSecEditText;
public DegreesLocationInputView(Context context) {
super(context);
init(context);
}
public DegreesLocationInputView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public DegreesLocationInputView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public DegreesLocationInputView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
private void init(Context context) {
inflate(context, R.layout.view_degree_location_input, this);
ButterKnife.bind(this, this);
InputFilter[] latInputFilter = new InputFilter[] {new LatitudeInputFilter()};
InputFilter[] lonInputFilter = new InputFilter[] {new LongitudeInputFilter()};
InputFilter[] minSecInputFilter = new InputFilter[] {new MinSecInputFilter()};
latDegEditText.setFilters(latInputFilter);
lonDegEditText.setFilters(lonInputFilter);
latMinEditText.setFilters(minSecInputFilter);
lonMinEditText.setFilters(minSecInputFilter);
latSecEditText.setFilters(minSecInputFilter);
lonSecEditText.setFilters(minSecInputFilter);
}
@Override
public LatLng getLatLng() throws InvalidLocationException {
String latDegString = latDegEditText.getText().toString();
String lonDegString = lonDegEditText.getText().toString();
String latMinString = latMinEditText.getText().toString();
String latSecString = latSecEditText.getText().toString();
String lonMinString = lonMinEditText.getText().toString();
String lonSecString = lonSecEditText.getText().toString();
// resolve degrees, throw exception if empty
if(latDegString.isEmpty() && lonDegString.isEmpty()) {
throw new InvalidLocationException();
}
int latDeg = Integer.parseInt(latDegString);
int lonDeg = Integer.parseInt(lonDegString);
// resolve minutes and seconds, pass 0 if empty
int latMin = latMinString.isEmpty() ? 0 : Integer.parseInt(latMinString);
float latSec = latSecString.isEmpty() ? 0 : Float.parseFloat(latSecString);
int lonMin = lonMinString.isEmpty() ? 0 : Integer.parseInt(lonMinString);
float lonSec = lonSecString.isEmpty() ? 0 : Float.parseFloat(lonSecString);
// convert to decimal
float latitude = degreesToDecimal(latDeg, latMin, latSec);
float longitude = degreesToDecimal(lonDeg, lonMin, lonSec);
// return
return new LatLng(latitude, longitude);
}
}