package de.pointedears.converter.app;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import de.pointedears.converter.R;
/**
* Activity that implements length conversion
*
* @author pelinux
*/
public class LengthsActivity
extends Activity
{
/*
* Constants for mapping value strings to internal IDs
*/
private static final String VALUE_INCHES =
"inch"; //$NON-NLS-1$
private static final String VALUE_KILOMETERS =
"km"; //$NON-NLS-1$
private static final String VALUE_METERS =
"m"; //$NON-NLS-1$
private static final String VALUE_MILES =
"mi"; //$NON-NLS-1$
private static final int ITEM_INCHES =
0;
private static final int ITEM_KILOMETERS =
1;
private static final int ITEM_METERS =
2;
private static final int ITEM_MILES =
3;
/**
* Maps value strings to internal IDs
*/
private final static HashMap<String,
Integer> valueToId =
new HashMap<String,
Integer>();
static
{
LengthsActivity.
valueToId.
put(LengthsActivity.
VALUE_INCHES,
LengthsActivity.
ITEM_INCHES);
LengthsActivity.
valueToId.
put(LengthsActivity.
VALUE_KILOMETERS,
LengthsActivity.
ITEM_KILOMETERS);
LengthsActivity.
valueToId.
put(LengthsActivity.
VALUE_METERS,
LengthsActivity.
ITEM_METERS);
LengthsActivity.
valueToId.
put(LengthsActivity.
VALUE_MILES,
LengthsActivity.
ITEM_MILES);
}
/* Unit spinners (dropdowns) */
private Spinner spinnerUnit1
;
private Spinner spinnerUnit2
;
/** Called when the activity is first created. */
@
Override
public void onCreate
(Bundle savedInstanceState
)
{
super.
onCreate(savedInstanceState
);
this.
setContentView(R.
layout.
activity_lengths);
final EditText editValue1 =
(EditText
) this.
findViewById(R.
id.
edit_value1);
final EditText editValue2 =
(EditText
) this.
findViewById(R.
id.
edit_value2);
final OnKeyListener editValue1OnKey =
new OnKeyListener
() {
@
Override
public boolean onKey
(View v,
int keyCode,
KeyEvent event
)
{
Editable editable1 =
((EditText
) v
).
getText();
Double value1
;
try
{
value1 =
Double.
parseDouble(editable1.
toString());
}
catch (NumberFormatException e
)
{
value1 =
null;
}
String string2 =
""; //$NON-NLS-1$
if (value1
!=
null)
{
string2 = LengthsActivity.
this.
getConvertedValue(value1,
false);
}
editValue2.
setText(string2
);
return false;
}
};
editValue1.
setOnKeyListener(editValue1OnKey
);
final OnKeyListener editValue2OnKey =
new OnKeyListener
() {
@
Override
public boolean onKey
(View v,
int keyCode,
KeyEvent event
)
{
Editable editable2 =
((EditText
) v
).
getText();
Double value2
;
try
{
value2 =
Double.
parseDouble(editable2.
toString());
}
catch (NumberFormatException e
)
{
value2 =
null;
}
String string1 =
""; //$NON-NLS-1$
if (value2
!=
null)
{
string1 = LengthsActivity.
this.
getConvertedValue(value2,
true);
}
editValue1.
setText(string1
);
return false;
}
};
editValue2.
setOnKeyListener(editValue2OnKey
);
this.
spinnerUnit1 =
(Spinner
) this.
findViewById(R.
id.
spinner_unit1);
this.
spinnerUnit2 =
(Spinner
) this.
findViewById(R.
id.
spinner_unit2);
this.
spinnerUnit1.
setOnItemSelectedListener(new OnItemSelectedListener
() {
@
Override
public void onItemSelected
(AdapterView
<?> arg0,
View arg1,
int arg2,
long arg3
)
{
/* Simulate input in second EditText so that first EditText is updated */
editValue2OnKey.
onKey(editValue2,
0,
null);
}
@
Override
public void onNothingSelected
(AdapterView
<?> arg0
)
{
/* no-op */
}
});
this.
spinnerUnit2.
setSelection(1);
this.
spinnerUnit2.
setOnItemSelectedListener(new OnItemSelectedListener
() {
@
Override
public void onItemSelected
(AdapterView
<?> arg0,
View arg1,
int arg2,
long arg3
)
{
/* Simulate input in first EditText so that second EditText is updated */
editValue1OnKey.
onKey(editValue1,
0,
null);
}
@
Override
public void onNothingSelected
(AdapterView
<?> arg0
)
{
/* no-op */
}
});
Button buttonClear =
(Button) this.
findViewById(R.
id.
lengths_button_clear);
buttonClear.
setOnClickListener(new OnClickListener
() {
@
SuppressWarnings("nls")
@
Override
public void onClick
(View v
)
{
editValue1.
setText("");
editValue2.
setText("");
}
});
}
/**
* @param value
* @return
*/
private String getConvertedValue
(double value,
boolean reverse
)
{
int selectedItemPosition1 =
this.
spinnerUnit1.
getSelectedItemPosition();
int selectedItemPosition2 =
this.
spinnerUnit2.
getSelectedItemPosition();
String[] itemArray =
this.
getResources().
getStringArray(R.
array.
length_units_values);
String selectedItemValue1 = itemArray
[selectedItemPosition1
];
String selectedItemValue2 = itemArray
[selectedItemPosition2
];
if (reverse
)
{
String tmp = selectedItemValue1
;
selectedItemValue1 = selectedItemValue2
;
selectedItemValue2 = tmp
;
}
int itemId1 = LengthsActivity.
valueToId.
get(selectedItemValue1
);
int itemId2 = LengthsActivity.
valueToId.
get(selectedItemValue2
);
Double newValue = value
;
switch (itemId1
)
{
case ITEM_INCHES:
switch (itemId2
)
{
case ITEM_KILOMETERS:
/* see ITEM_METERS */
newValue =
new Double((value
* 0.0254) /
1000);
break;
case ITEM_METERS:
newValue =
new Double(value
* 0.0254);
break;
case ITEM_MILES:
/* 12 in/ft and 5280 ft/mi */
newValue =
new Double(value /
12 /
5280);
break;
}
break;
case ITEM_KILOMETERS:
switch (itemId2
)
{
case ITEM_INCHES:
/* 1 m = 39.370 in */
newValue =
new Double(value
* 1000 * 39.370);
break;
case ITEM_METERS:
newValue =
new Double(value
* 1000);
break;
case ITEM_MILES:
newValue =
new Double(value /
1.609344);
break;
}
break;
case ITEM_METERS:
switch (itemId2
)
{
case ITEM_INCHES:
/* 1 m = 39.370 in */
newValue =
new Double(value
* 39.370);
break;
case ITEM_KILOMETERS:
newValue =
new Double(value /
1000);
break;
case ITEM_MILES:
/* 1 mi = 1609.344 m */
newValue =
new Double(value /
1609.344);
break;
}
break;
case ITEM_MILES:
switch (itemId2
)
{
case ITEM_INCHES:
/* 1 mi = 5280 ft, 1 ft = 12 in */
newValue =
new Double(value
* 5280 * 12);
break;
case ITEM_KILOMETERS:
newValue =
new Double(value
* 1.609344);
break;
case ITEM_METERS:
newValue =
new Double(value
* 1609.344);
break;
}
break;
}
return newValue.
toString();
}
}