2015-02-04 20:51:31 +01:00
|
|
|
package de.vanitasvitae.enigmandroid;
|
|
|
|
|
|
|
|
import android.app.Activity;
|
2015-02-18 21:51:40 +01:00
|
|
|
import android.app.AlertDialog;
|
|
|
|
import android.content.DialogInterface;
|
2015-02-24 22:04:02 +01:00
|
|
|
import android.content.Intent;
|
2015-02-24 23:36:24 +01:00
|
|
|
import android.content.SharedPreferences;
|
2015-02-04 20:51:31 +01:00
|
|
|
import android.os.Bundle;
|
2015-02-24 23:36:24 +01:00
|
|
|
import android.preference.PreferenceManager;
|
2015-02-04 20:51:31 +01:00
|
|
|
import android.view.View;
|
|
|
|
import android.view.Menu;
|
|
|
|
import android.view.MenuItem;
|
|
|
|
import android.widget.EditText;
|
|
|
|
import android.widget.Spinner;
|
|
|
|
import android.widget.ArrayAdapter;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
public class MainActivity extends Activity
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
private Spinner rotor1;
|
|
|
|
private Spinner rotor2;
|
|
|
|
private Spinner rotor3;
|
2015-02-04 20:51:31 +01:00
|
|
|
private Spinner reversingRotor;
|
2015-02-18 21:51:40 +01:00
|
|
|
private Spinner rotor1Position;
|
|
|
|
private Spinner rotor2Position;
|
|
|
|
private Spinner rotor3Position;
|
2015-02-04 20:51:31 +01:00
|
|
|
private EditText plugboard;
|
|
|
|
private EditText input;
|
|
|
|
private EditText output;
|
|
|
|
|
2015-02-24 23:36:24 +01:00
|
|
|
private static final int RESULT_SETTINGS = 1;
|
|
|
|
|
2015-02-04 20:51:31 +01:00
|
|
|
private Enigma enigma;
|
2015-02-18 21:51:40 +01:00
|
|
|
//memory for the ringsettings
|
|
|
|
private int[] ringsettings = {0,0,0};
|
2015-02-24 23:36:24 +01:00
|
|
|
private boolean anomaly = true;
|
2015-02-18 21:51:40 +01:00
|
|
|
|
2015-02-04 20:51:31 +01:00
|
|
|
@Override
|
2015-02-18 21:51:40 +01:00
|
|
|
public void onCreate(Bundle savedInstanceState)
|
|
|
|
{
|
2015-02-04 20:51:31 +01:00
|
|
|
super.onCreate(savedInstanceState);
|
2015-02-11 20:56:43 +01:00
|
|
|
this.setContentView(R.layout.activity_main);
|
2015-02-04 20:51:31 +01:00
|
|
|
this.initLayout();
|
|
|
|
this.reset();
|
2015-02-11 20:56:43 +01:00
|
|
|
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2015-02-18 21:51:40 +01:00
|
|
|
public boolean onCreateOptionsMenu(Menu menu)
|
|
|
|
{
|
2015-02-11 20:56:43 +01:00
|
|
|
this.getMenuInflater().inflate(R.menu.main, menu);
|
2015-02-04 20:51:31 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2015-02-18 21:51:40 +01:00
|
|
|
/**
|
|
|
|
* Handle Options menu clicks
|
|
|
|
*/
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item)
|
|
|
|
{
|
2015-02-04 20:51:31 +01:00
|
|
|
int id = item.getItemId();
|
|
|
|
if (id == R.id.action_version)
|
|
|
|
{
|
2015-02-11 20:56:43 +01:00
|
|
|
Toast.makeText(this.getApplicationContext(), R.string.version,
|
2015-02-04 20:51:31 +01:00
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
return true;
|
|
|
|
}
|
2015-02-18 21:51:40 +01:00
|
|
|
else if (id == R.id.action_reset)
|
2015-02-04 20:51:31 +01:00
|
|
|
{
|
2015-02-11 20:56:43 +01:00
|
|
|
this.reset();
|
2015-02-18 21:51:40 +01:00
|
|
|
Toast.makeText(getApplicationContext(), R.string.message_reset,
|
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (id == R.id.action_choose_ringstellung)
|
|
|
|
{
|
|
|
|
showRingsettingsDialog();
|
|
|
|
return true;
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
2015-02-24 22:04:02 +01:00
|
|
|
else if (id == R.id.action_settings)
|
|
|
|
{
|
|
|
|
Intent i = new Intent(this, SettingsActivity.class);
|
2015-02-24 23:36:24 +01:00
|
|
|
startActivityForResult(i, RESULT_SETTINGS);
|
2015-02-24 22:04:02 +01:00
|
|
|
}
|
2015-02-04 20:51:31 +01:00
|
|
|
return super.onOptionsItemSelected(item);
|
|
|
|
}
|
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
/**
|
|
|
|
* Updates the enigma to the chosen rotors and plugboard
|
|
|
|
*
|
|
|
|
* @param v View
|
|
|
|
*/
|
|
|
|
public void updateEnigma(View v)
|
2015-02-04 20:51:31 +01:00
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
int[] conf = new int[10];
|
|
|
|
conf[0] = rotor1.getSelectedItemPosition() + 1;
|
|
|
|
conf[1] = rotor2.getSelectedItemPosition() + 1;
|
|
|
|
conf[2] = rotor3.getSelectedItemPosition() + 1;
|
|
|
|
conf[3] = reversingRotor.getSelectedItemPosition() + 1;
|
|
|
|
conf[4] = rotor1Position.getSelectedItemPosition() + 1;
|
|
|
|
conf[5] = rotor2Position.getSelectedItemPosition() + 1;
|
|
|
|
conf[6] = rotor3Position.getSelectedItemPosition() + 1;
|
|
|
|
conf[7] = ringsettings[0];
|
|
|
|
conf[8] = ringsettings[1];
|
|
|
|
conf[9] = ringsettings[2];
|
2015-02-04 20:51:31 +01:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
enigma = new Enigma(null, null);
|
|
|
|
} catch (Plugboard.PlugAlreadyUsedException e)
|
2015-02-05 19:42:38 +01:00
|
|
|
{
|
|
|
|
//There is nothing that could possibly go wrong here.
|
|
|
|
}
|
2015-02-04 20:51:31 +01:00
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
char[][] plugboardConfiguration = null;
|
2015-02-04 20:51:31 +01:00
|
|
|
try
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
plugboardConfiguration = Enigma.parsePlugs(plugboard.getText().toString());
|
|
|
|
} catch (Enigma.InvalidPlugboardConfigurationFormatException e)
|
2015-02-04 20:51:31 +01:00
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
String error = this.getResources().getString(R.string.error_parsing_plugs) + ": " + e.getMessage();
|
2015-02-04 20:51:31 +01:00
|
|
|
Toast.makeText(getApplicationContext(), error,
|
2015-02-18 21:51:40 +01:00
|
|
|
Toast.LENGTH_LONG).show();
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
|
|
|
try
|
|
|
|
{
|
2015-02-11 20:56:43 +01:00
|
|
|
enigma.setConfiguration(conf);
|
2015-02-18 21:51:40 +01:00
|
|
|
enigma.setPlugboard(plugboardConfiguration);
|
2015-02-24 23:36:24 +01:00
|
|
|
enigma.setPrefAnomaly(anomaly);
|
2015-02-04 20:51:31 +01:00
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
} catch (Plugboard.PlugAlreadyUsedException e)
|
2015-02-04 20:51:31 +01:00
|
|
|
{
|
|
|
|
Toast.makeText(this.getApplicationContext(), e.getMessage(),
|
2015-02-18 21:51:40 +01:00
|
|
|
Toast.LENGTH_LONG).show();
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
/**
|
|
|
|
* Set the chosen Configuration to the enigma, get the input string from the input textbox and prepare it,
|
|
|
|
* set the input to the prepared text, encrypt the prepared input and set the encrypted string to the
|
|
|
|
* output textbox and update the spinners to their new positions.
|
|
|
|
* @param v View
|
|
|
|
*/
|
|
|
|
public void doCrypto(View v)
|
2015-02-04 20:51:31 +01:00
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
updateEnigma(null);
|
2015-02-04 20:51:31 +01:00
|
|
|
String m = input.getText().toString();
|
|
|
|
m = Enigma.prepare(m);
|
|
|
|
input.setText(m);
|
|
|
|
output.setText(enigma.encrypt(m));
|
2015-02-11 20:56:43 +01:00
|
|
|
updateSpinner(enigma.getConfiguration());
|
2015-02-04 20:51:31 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Reset all the spinners and textboxes and the ringsettings memory
|
|
|
|
*/
|
2015-02-04 20:51:31 +01:00
|
|
|
private void reset()
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
rotor1.setSelection(0);
|
|
|
|
rotor2.setSelection(1);
|
|
|
|
rotor3.setSelection(2);
|
2015-02-16 13:56:05 +01:00
|
|
|
reversingRotor.setSelection(1);
|
2015-02-18 21:51:40 +01:00
|
|
|
rotor1Position.setSelection(0);
|
|
|
|
rotor2Position.setSelection(0);
|
|
|
|
rotor3Position.setSelection(0);
|
|
|
|
ringsettings = new int[]{0,0,0};
|
2015-02-04 20:51:31 +01:00
|
|
|
plugboard.setText("");
|
|
|
|
input.setText("");
|
|
|
|
output.setText("");
|
|
|
|
}
|
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
/**
|
|
|
|
* Initialize the Layout
|
|
|
|
*/
|
2015-02-04 20:51:31 +01:00
|
|
|
private void initLayout()
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
rotor1 = (Spinner) findViewById(R.id.rotor1);
|
|
|
|
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.enigma_rotors, android.R.layout.simple_spinner_item);
|
|
|
|
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor1.setAdapter(rotor1Adapter);
|
|
|
|
|
|
|
|
|
|
|
|
rotor2 = (Spinner) findViewById(R.id.rotor2);
|
|
|
|
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.enigma_rotors, android.R.layout.simple_spinner_item);
|
|
|
|
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor2.setAdapter(rotor2Adapter);
|
|
|
|
|
|
|
|
rotor3 = (Spinner) findViewById(R.id.rotor3);
|
|
|
|
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.enigma_rotors, android.R.layout.simple_spinner_item);
|
|
|
|
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor3.setAdapter(rotor3Adapter);
|
|
|
|
|
|
|
|
reversingRotor = (Spinner) findViewById(R.id.reflector);
|
|
|
|
ArrayAdapter<CharSequence> relfectorAdapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.enigma_reflectors, android.R.layout.simple_spinner_item);
|
|
|
|
relfectorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
reversingRotor.setAdapter(relfectorAdapter);
|
|
|
|
|
|
|
|
rotor1Position = (Spinner) findViewById(R.id.rotor1position);
|
|
|
|
ArrayAdapter<CharSequence> rotor1PositionAdapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.rotor_positions, android.R.layout.simple_spinner_item);
|
|
|
|
rotor1PositionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor1Position.setAdapter(rotor1PositionAdapter);
|
|
|
|
|
|
|
|
rotor2Position = (Spinner) findViewById(R.id.rotor2position);
|
|
|
|
ArrayAdapter<CharSequence> rotor2PositionAdapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.rotor_positions, android.R.layout.simple_spinner_item);
|
|
|
|
rotor2PositionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor2Position.setAdapter(rotor2PositionAdapter);
|
|
|
|
|
|
|
|
rotor3Position = (Spinner) findViewById(R.id.rotor3position);
|
|
|
|
ArrayAdapter<CharSequence> rotor3PositionAdapter = ArrayAdapter.createFromResource(this,
|
|
|
|
R.array.rotor_positions, android.R.layout.simple_spinner_item);
|
|
|
|
rotor3PositionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
rotor3Position.setAdapter(rotor3PositionAdapter);
|
2015-02-04 20:51:31 +01:00
|
|
|
|
|
|
|
plugboard = (EditText) findViewById(R.id.plugboard);
|
|
|
|
input = (EditText) findViewById(R.id.input);
|
|
|
|
output = (EditText) findViewById(R.id.output);
|
2015-02-05 19:42:38 +01:00
|
|
|
|
|
|
|
input.requestFocus();
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
|
|
|
|
2015-02-18 21:51:40 +01:00
|
|
|
/**
|
|
|
|
* Update the Spinners to their new Positions
|
|
|
|
* @param c Configuration
|
|
|
|
*/
|
2015-02-04 20:51:31 +01:00
|
|
|
public void updateSpinner(int[] c)
|
|
|
|
{
|
2015-02-18 21:51:40 +01:00
|
|
|
rotor1.setSelection(c[0] - 1);
|
|
|
|
rotor2.setSelection(c[1] - 1);
|
|
|
|
rotor3.setSelection(c[2] - 1);
|
|
|
|
rotor1Position.setSelection(c[4]);
|
|
|
|
rotor2Position.setSelection(c[5]);
|
|
|
|
rotor3Position.setSelection(c[6]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the dialog where the user can pick the ringsettings and set them if the user doesnt abort.
|
|
|
|
*/
|
|
|
|
public void showRingsettingsDialog()
|
|
|
|
{
|
|
|
|
View ringsettingsView = View.inflate(this, R.layout.dialog_ringsettings, null);
|
|
|
|
|
|
|
|
final Spinner ring1 = (Spinner) ringsettingsView.findViewById(R.id.rotor1ring);
|
|
|
|
ArrayAdapter<CharSequence> ring1Adapter = ArrayAdapter.createFromResource(this, R.array.ring_positions, android.R.layout.simple_spinner_item);
|
|
|
|
ring1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
ring1.setAdapter(ring1Adapter);
|
|
|
|
ring1.setSelection(ringsettings[0]);
|
|
|
|
|
|
|
|
final Spinner ring2 = (Spinner) ringsettingsView.findViewById(R.id.rotor2ring);
|
|
|
|
ArrayAdapter<CharSequence> ring2Adapter = ArrayAdapter.createFromResource(this, R.array.ring_positions, android.R.layout.simple_spinner_item);
|
|
|
|
ring2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
ring2.setAdapter(ring2Adapter);
|
|
|
|
ring2.setSelection(ringsettings[1]);
|
|
|
|
|
|
|
|
final Spinner ring3 = (Spinner) ringsettingsView.findViewById(R.id.rotor3ring);
|
|
|
|
ArrayAdapter<CharSequence> ring3Adapter = ArrayAdapter.createFromResource(this, R.array.ring_positions, android.R.layout.simple_spinner_item);
|
|
|
|
ring3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
|
|
|
ring3.setAdapter(ring3Adapter);
|
|
|
|
ring3.setSelection(ringsettings[2]);
|
|
|
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
|
|
builder.setTitle(R.string.title_ringsetting);
|
|
|
|
builder.setView(ringsettingsView)
|
|
|
|
.setCancelable(true)
|
|
|
|
.setPositiveButton(R.string.dialog_positiv, new DialogInterface.OnClickListener()
|
|
|
|
{
|
|
|
|
public void onClick(DialogInterface dialog, int id)
|
|
|
|
{
|
|
|
|
ringsettings = new int[]{ring1.getSelectedItemPosition(), ring2.getSelectedItemPosition(), ring3.getSelectedItemPosition()};
|
|
|
|
String message = getResources().getString(R.string.dialog_ringsettings_success) + " " + (ringsettings[2]+1) + ", " + (ringsettings[1]+1) + ", " + (ringsettings[0]+1) + ".";
|
|
|
|
Toast.makeText(getApplicationContext(), message,
|
|
|
|
Toast.LENGTH_LONG).show();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.setNegativeButton(R.string.dialog_negativ, new DialogInterface.OnClickListener()
|
|
|
|
{
|
|
|
|
public void onClick(DialogInterface dialog, int id)
|
|
|
|
{
|
|
|
|
dialog.cancel();
|
|
|
|
Toast.makeText(getApplicationContext(), R.string.dialog_ringsettings_abort,
|
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
}
|
|
|
|
}).show();
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|
2015-02-24 23:36:24 +01:00
|
|
|
|
|
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
|
|
super.onActivityResult(requestCode, resultCode, data);
|
|
|
|
|
|
|
|
switch (requestCode) {
|
|
|
|
case RESULT_SETTINGS:
|
|
|
|
{
|
|
|
|
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
boolean an = sharedPrefs.getBoolean("prefAnomaly", true);
|
|
|
|
System.out.println(an);
|
|
|
|
this.anomaly = an;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-02-04 20:51:31 +01:00
|
|
|
}
|