Added Enigma K, KSwiss, KSwissAirforce, R, G31, G260, G312, changed identifiers of models, changed landscape layout d, updated about-dialog

This commit is contained in:
VanitasVitae 2015-09-16 14:38:46 +02:00
parent 802b51f91d
commit 63682d6462
29 changed files with 2016 additions and 155 deletions

View file

@ -1,16 +1,24 @@
CHANGELOG ENIGMANDROID
v0.1.7-15.09.2015<
*Added Enigma K
*Added Enigma T
*Created Plugboard-/pluggable Reflector-Setting-Dialog
v0.1.8-not-yet-released<
*Added Enigma G31
*Added Enigma G312
*Added Enigma G260
*Replaced Enigma K with Enigma K, K (Swiss) and K (Swiss, Airforce)
*Added Enigma R
*Changed identifiers of enigma models
*Changed landscape layout of enigma model d
*Updated the about-dialog text.
*TODO: Add Enigma Z (Probably wont happen due to lack of information :/)
*TODO: Add Enigma G
*TODO: Add Enigma R
*TODO: Rework Rotor-/Reflector creation
*TODO: Add multi-Enigma (select any rotor/reflector etc. Probably wont happen too soon)
*TODO: Rework InputPreparer using decorator pattern to allow user customization
*
v0.1.7-15.09.2015<
*Added Enigma K
*Added Enigma T
*Created Plugboard-/pluggable Reflector-Setting-Dialog
v0.1.6-10.09.2015<
*Fixed about dialog (outdated manual)
*Updated CHANGELOG (oops)

View file

@ -163,10 +163,14 @@ public class MainActivity extends Activity
this.setContentView(R.layout.activity_main_d);
break;
case "K":
this.setContentView(R.layout.activity_main_k_t);
break;
case "KS":
case "KSA":
case "T":
this.setContentView(R.layout.activity_main_k_t);
case "R":
case "G31":
case "G312":
case "G260":
this.setContentView(R.layout.activity_main_g_k_t);
break;
default:
this.setContentView(R.layout.activity_main_i_m3);
@ -217,7 +221,7 @@ public class MainActivity extends Activity
if(prefAnomaly !=anomaly)
{
prefAnomaly = anomaly;
if(layoutContainer != null) layoutContainer.getEnigma().setPrefAnomaly(anomaly);
if(layoutContainer != null && layoutContainer.getEnigma() != null) layoutContainer.getEnigma().setPrefAnomaly(anomaly);
}
}

View file

@ -28,7 +28,7 @@ public class Enigma_D extends Enigma {
protected Rotor rotor2;
protected Rotor rotor3;
protected Reflector.ReflectorEnigmaDKD reflector;
protected Reflector.ReflectorEnigma_D_KD_G31 reflector;
public Enigma_D()
{
@ -43,7 +43,7 @@ public class Enigma_D extends Enigma {
this.rotor1 = Rotor.createRotor(11, 0, 0);
this.rotor2 = Rotor.createRotor(12, 0, 0);
this.rotor3 = Rotor.createRotor(13, 0, 0);
this.reflector = new Reflector.ReflectorEnigmaDKD();
this.reflector = new Reflector.ReflectorEnigma_D_KD_G31();
}
@Override
@ -96,7 +96,7 @@ public class Enigma_D extends Enigma {
this.rotor1 = Rotor.createRotor(state.getTypeRotor1(), state.getRotationRotor1(), state.getRingSettingRotor1());
this.rotor2 = Rotor.createRotor(state.getTypeRotor2(), state.getRotationRotor2(), state.getRingSettingRotor2());
this.rotor3 = Rotor.createRotor(state.getTypeRotor3(), state.getRotationRotor3(), state.getRingSettingRotor3());
this.reflector = new Reflector.ReflectorEnigmaDKD();
this.reflector = new Reflector.ReflectorEnigma_D_KD_G31();
this.reflector.setConfiguration(state.getConfigurationReflector());
this.reflector.setRotation(state.getRotationReflector());
this.reflector.setRingSetting(state.getRingSettingReflector());

View file

@ -0,0 +1,41 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type G31 (Abwehr)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_G260 extends Enigma_G31
{
public Enigma_G260()
{
super();
machineType = "G260";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(29, 0, 0);
this.rotor2 = Rotor.createRotor(30, 0, 0);
this.rotor3 = Rotor.createRotor(31, 0, 0);
this.reflector = Reflector.createReflector(10);
}
}

View file

@ -0,0 +1,129 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type G31 (Abwehr)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_G31 extends Enigma
{
protected Rotor entryWheel;
protected Rotor rotor1;
protected Rotor rotor2;
protected Rotor rotor3;
protected Reflector reflector;
public Enigma_G31()
{
super();
machineType = "G31";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(32, 0, 0);
this.rotor2 = Rotor.createRotor(33, 0, 0);
this.rotor3 = Rotor.createRotor(34, 0, 0);
this.reflector = Reflector.createReflector(6);
}
@Override
public void nextState()
{
rotor1.rotate();
if (rotor1.isAtTurnoverPosition() || (this.doAnomaly && prefAnomaly))
{
rotor2.rotate();
this.doAnomaly = rotor2.doubleTurnAnomaly();
if (rotor2.isAtTurnoverPosition())
{
rotor3.rotate();
if(rotor3.isAtTurnoverPosition())
{
reflector.setRotation(reflector.getRotation()+1);
}
}
}
}
@Override
public char encryptChar(char k) {
nextState();
int x = ((int) k)-65; //Cast to int and remove Unicode Offset (A=65 in Unicode.)
//Encryption
//forward direction
x = entryWheel.encryptForward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting());
x = rotor1.encryptForward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting() + rotor2.getRotation() - rotor2.getRingSetting());
x = rotor2.encryptForward(x);
x = rotor1.normalize(x - rotor2.getRotation() + rotor2.getRingSetting() + rotor3.getRotation() - rotor3.getRingSetting());
x = rotor3.encryptForward(x);
x = rotor1.normalize(x - rotor3.getRotation() + rotor3.getRingSetting() + reflector.getRotation() - reflector.getRingSetting());
//backward direction
x = reflector.encrypt(x);
x = rotor1.normalize(x + rotor3.getRotation() - rotor3.getRingSetting() - reflector.getRotation() + reflector.getRingSetting());
x = rotor3.encryptBackward(x);
x = rotor1.normalize(x + rotor2.getRotation() - rotor2.getRingSetting() - rotor3.getRotation() + rotor3.getRingSetting());
x = rotor2.encryptBackward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting() - rotor2.getRotation() + rotor2.getRingSetting());
x = rotor1.encryptBackward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting());
x = entryWheel.encryptBackward(x);
return (char) (x + 65); //Add Offset again, cast back to char and return
}
@Override
public void setState(EnigmaStateBundle state)
{
this.entryWheel = Rotor.createRotor(state.getTypeEntryWheel(), 0, 0);
this.rotor1 = Rotor.createRotor(state.getTypeRotor1(), state.getRotationRotor1(), state.getRingSettingRotor1());
this.rotor2 = Rotor.createRotor(state.getTypeRotor2(), state.getRotationRotor2(), state.getRingSettingRotor2());
this.rotor3 = Rotor.createRotor(state.getTypeRotor3(), state.getRotationRotor3(), state.getRingSettingRotor3());
this.reflector = Reflector.createReflector(state.getTypeReflector());
this.reflector.setRotation(state.getRotationReflector());
this.reflector.setRingSetting(state.getRingSettingReflector());
}
@Override
public EnigmaStateBundle getState() {
EnigmaStateBundle state = new EnigmaStateBundle();
state.setTypeRotor1(rotor1.getNumber());
state.setTypeRotor2(rotor2.getNumber());
state.setTypeRotor3(rotor3.getNumber());
state.setRotationRotor1(rotor1.getRotation());
state.setRotationRotor2(rotor2.getRotation());
state.setRotationRotor3(rotor3.getRotation());
state.setRingSettingRotor1(rotor1.getRingSetting());
state.setRingSettingRotor2(rotor2.getRingSetting());
state.setRingSettingRotor3(rotor3.getRingSetting());
state.setTypeReflector(reflector.getNumber());
state.setRotationReflector(reflector.getRotation());
state.setRingSettingReflector(reflector.getRingSetting());
return state;
}
}

View file

@ -0,0 +1,41 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type G31 (Abwehr)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_G312 extends Enigma_G31
{
public Enigma_G312()
{
super();
machineType = "G312";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(26, 0, 0);
this.rotor2 = Rotor.createRotor(27, 0, 0);
this.rotor3 = Rotor.createRotor(28, 0, 0);
this.reflector = Reflector.createReflector(9);
}
}

View file

@ -4,7 +4,7 @@ import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type K (Switzerland)
* Implementation of the Enigma machine of type K
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
@ -40,9 +40,9 @@ public class Enigma_K extends Enigma
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(14, 0, 0);
this.rotor2 = Rotor.createRotor(15, 0, 0);
this.rotor3 = Rotor.createRotor(16, 0, 0);
this.rotor1 = Rotor.createRotor(35, 0, 0);
this.rotor2 = Rotor.createRotor(36, 0, 0);
this.rotor3 = Rotor.createRotor(37, 0, 0);
this.reflector = Reflector.createReflector(7);
}

View file

@ -0,0 +1,125 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type K (Switzerland, Airforce)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_K_Swiss_Airforce extends Enigma_K
{
protected Rotor entryWheel;
protected Rotor rotor1;
protected Rotor rotor2;
protected Rotor rotor3;
protected Reflector reflector;
public Enigma_K_Swiss_Airforce()
{
super();
machineType = "KSA";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(38, 0, 0);
this.rotor2 = Rotor.createRotor(39, 0, 0);
this.rotor3 = Rotor.createRotor(40, 0, 0);
this.reflector = Reflector.createReflector(7);
}
@Override
public void nextState()
{
rotor1.rotate();
if (rotor1.isAtTurnoverPosition() || (this.doAnomaly && prefAnomaly))
{
rotor2.rotate();
this.doAnomaly = rotor2.doubleTurnAnomaly();
if (rotor2.isAtTurnoverPosition())
{
rotor3.rotate();
}
}
}
@Override
public char encryptChar(char k) {
nextState();
int x = ((int) k)-65; //Cast to int and remove Unicode Offset (A=65 in Unicode.)
//Encryption
//forward direction
x = entryWheel.encryptForward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting());
x = rotor1.encryptForward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting() + rotor2.getRotation() - rotor2.getRingSetting());
x = rotor2.encryptForward(x);
x = rotor1.normalize(x - rotor2.getRotation() + rotor2.getRingSetting() + rotor3.getRotation() - rotor3.getRingSetting());
x = rotor3.encryptForward(x);
x = rotor1.normalize(x - rotor3.getRotation() + rotor3.getRingSetting() + reflector.getRotation() - reflector.getRingSetting());
//backward direction
x = reflector.encrypt(x);
x = rotor1.normalize(x + rotor3.getRotation() - rotor3.getRingSetting() - reflector.getRotation() + reflector.getRingSetting());
x = rotor3.encryptBackward(x);
x = rotor1.normalize(x + rotor2.getRotation() - rotor2.getRingSetting() - rotor3.getRotation() + rotor3.getRingSetting());
x = rotor2.encryptBackward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting() - rotor2.getRotation() + rotor2.getRingSetting());
x = rotor1.encryptBackward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting());
x = entryWheel.encryptBackward(x);
return (char) (x + 65); //Add Offset again, cast back to char and return
}
@Override
public void setState(EnigmaStateBundle state)
{
this.entryWheel = Rotor.createRotor(state.getTypeEntryWheel(), 0, 0);
this.rotor1 = Rotor.createRotor(state.getTypeRotor1(), state.getRotationRotor1(), state.getRingSettingRotor1());
this.rotor2 = Rotor.createRotor(state.getTypeRotor2(), state.getRotationRotor2(), state.getRingSettingRotor2());
this.rotor3 = Rotor.createRotor(state.getTypeRotor3(), state.getRotationRotor3(), state.getRingSettingRotor3());
this.reflector = Reflector.createReflector(state.getTypeReflector());
this.reflector.setRotation(state.getRotationReflector());
this.reflector.setRingSetting(state.getRingSettingReflector());
}
@Override
public EnigmaStateBundle getState() {
EnigmaStateBundle state = new EnigmaStateBundle();
state.setTypeRotor1(rotor1.getNumber());
state.setTypeRotor2(rotor2.getNumber());
state.setTypeRotor3(rotor3.getNumber());
state.setRotationRotor1(rotor1.getRotation());
state.setRotationRotor2(rotor2.getRotation());
state.setRotationRotor3(rotor3.getRotation());
state.setRingSettingRotor1(rotor1.getRingSetting());
state.setRingSettingRotor2(rotor2.getRingSetting());
state.setRingSettingRotor3(rotor3.getRingSetting());
state.setTypeReflector(reflector.getNumber());
state.setRotationReflector(reflector.getRotation());
state.setRingSettingReflector(reflector.getRingSetting());
return state;
}
}

View file

@ -0,0 +1,125 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type K (Switzerland)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_K_Swiss_Standard extends Enigma_K
{
protected Rotor entryWheel;
protected Rotor rotor1;
protected Rotor rotor2;
protected Rotor rotor3;
protected Reflector reflector;
public Enigma_K_Swiss_Standard()
{
super();
machineType = "KS";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(14, 0, 0);
this.rotor2 = Rotor.createRotor(15, 0, 0);
this.rotor3 = Rotor.createRotor(16, 0, 0);
this.reflector = Reflector.createReflector(7);
}
@Override
public void nextState()
{
rotor1.rotate();
if (rotor1.isAtTurnoverPosition() || (this.doAnomaly && prefAnomaly))
{
rotor2.rotate();
this.doAnomaly = rotor2.doubleTurnAnomaly();
if (rotor2.isAtTurnoverPosition())
{
rotor3.rotate();
}
}
}
@Override
public char encryptChar(char k) {
nextState();
int x = ((int) k)-65; //Cast to int and remove Unicode Offset (A=65 in Unicode.)
//Encryption
//forward direction
x = entryWheel.encryptForward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting());
x = rotor1.encryptForward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting() + rotor2.getRotation() - rotor2.getRingSetting());
x = rotor2.encryptForward(x);
x = rotor1.normalize(x - rotor2.getRotation() + rotor2.getRingSetting() + rotor3.getRotation() - rotor3.getRingSetting());
x = rotor3.encryptForward(x);
x = rotor1.normalize(x - rotor3.getRotation() + rotor3.getRingSetting() + reflector.getRotation() - reflector.getRingSetting());
//backward direction
x = reflector.encrypt(x);
x = rotor1.normalize(x + rotor3.getRotation() - rotor3.getRingSetting() - reflector.getRotation() + reflector.getRingSetting());
x = rotor3.encryptBackward(x);
x = rotor1.normalize(x + rotor2.getRotation() - rotor2.getRingSetting() - rotor3.getRotation() + rotor3.getRingSetting());
x = rotor2.encryptBackward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting() - rotor2.getRotation() + rotor2.getRingSetting());
x = rotor1.encryptBackward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting());
x = entryWheel.encryptBackward(x);
return (char) (x + 65); //Add Offset again, cast back to char and return
}
@Override
public void setState(EnigmaStateBundle state)
{
this.entryWheel = Rotor.createRotor(state.getTypeEntryWheel(), 0, 0);
this.rotor1 = Rotor.createRotor(state.getTypeRotor1(), state.getRotationRotor1(), state.getRingSettingRotor1());
this.rotor2 = Rotor.createRotor(state.getTypeRotor2(), state.getRotationRotor2(), state.getRingSettingRotor2());
this.rotor3 = Rotor.createRotor(state.getTypeRotor3(), state.getRotationRotor3(), state.getRingSettingRotor3());
this.reflector = Reflector.createReflector(state.getTypeReflector());
this.reflector.setRotation(state.getRotationReflector());
this.reflector.setRingSetting(state.getRingSettingReflector());
}
@Override
public EnigmaStateBundle getState() {
EnigmaStateBundle state = new EnigmaStateBundle();
state.setTypeRotor1(rotor1.getNumber());
state.setTypeRotor2(rotor2.getNumber());
state.setTypeRotor3(rotor3.getNumber());
state.setRotationRotor1(rotor1.getRotation());
state.setRotationRotor2(rotor2.getRotation());
state.setRotationRotor3(rotor3.getRotation());
state.setRingSettingRotor1(rotor1.getRingSetting());
state.setRingSettingRotor2(rotor2.getRingSetting());
state.setRingSettingRotor3(rotor3.getRingSetting());
state.setTypeReflector(reflector.getNumber());
state.setRotationReflector(reflector.getRotation());
state.setRingSettingReflector(reflector.getRingSetting());
return state;
}
}

View file

@ -0,0 +1,125 @@
package de.vanitasvitae.enigmandroid.enigma;
import de.vanitasvitae.enigmandroid.enigma.rotors.Reflector;
import de.vanitasvitae.enigmandroid.enigma.rotors.Rotor;
/**
* Implementation of the Enigma machine of type R ("Rocket", Reichsbahn)
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class Enigma_R extends Enigma
{
protected Rotor entryWheel;
protected Rotor rotor1;
protected Rotor rotor2;
protected Rotor rotor3;
protected Reflector reflector;
public Enigma_R()
{
super();
machineType = "R";
}
@Override
public void initialize()
{
this.entryWheel = Rotor.createRotor(0, 0, 0);
this.rotor1 = Rotor.createRotor(41, 0, 0);
this.rotor2 = Rotor.createRotor(42, 0, 0);
this.rotor3 = Rotor.createRotor(43, 0, 0);
this.reflector = Reflector.createReflector(11);
}
@Override
public void nextState()
{
rotor1.rotate();
if (rotor1.isAtTurnoverPosition() || (this.doAnomaly && prefAnomaly))
{
rotor2.rotate();
this.doAnomaly = rotor2.doubleTurnAnomaly();
if (rotor2.isAtTurnoverPosition())
{
rotor3.rotate();
}
}
}
@Override
public char encryptChar(char k) {
nextState();
int x = ((int) k)-65; //Cast to int and remove Unicode Offset (A=65 in Unicode.)
//Encryption
//forward direction
x = entryWheel.encryptForward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting());
x = rotor1.encryptForward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting() + rotor2.getRotation() - rotor2.getRingSetting());
x = rotor2.encryptForward(x);
x = rotor1.normalize(x - rotor2.getRotation() + rotor2.getRingSetting() + rotor3.getRotation() - rotor3.getRingSetting());
x = rotor3.encryptForward(x);
x = rotor1.normalize(x - rotor3.getRotation() + rotor3.getRingSetting() + reflector.getRotation() - reflector.getRingSetting());
//backward direction
x = reflector.encrypt(x);
x = rotor1.normalize(x + rotor3.getRotation() - rotor3.getRingSetting() - reflector.getRotation() + reflector.getRingSetting());
x = rotor3.encryptBackward(x);
x = rotor1.normalize(x + rotor2.getRotation() - rotor2.getRingSetting() - rotor3.getRotation() + rotor3.getRingSetting());
x = rotor2.encryptBackward(x);
x = rotor1.normalize(x + rotor1.getRotation() - rotor1.getRingSetting() - rotor2.getRotation() + rotor2.getRingSetting());
x = rotor1.encryptBackward(x);
x = rotor1.normalize(x - rotor1.getRotation() + rotor1.getRingSetting());
x = entryWheel.encryptBackward(x);
return (char) (x + 65); //Add Offset again, cast back to char and return
}
@Override
public void setState(EnigmaStateBundle state)
{
this.entryWheel = Rotor.createRotor(state.getTypeEntryWheel(), 0, 0);
this.rotor1 = Rotor.createRotor(state.getTypeRotor1(), state.getRotationRotor1(), state.getRingSettingRotor1());
this.rotor2 = Rotor.createRotor(state.getTypeRotor2(), state.getRotationRotor2(), state.getRingSettingRotor2());
this.rotor3 = Rotor.createRotor(state.getTypeRotor3(), state.getRotationRotor3(), state.getRingSettingRotor3());
this.reflector = Reflector.createReflector(state.getTypeReflector());
this.reflector.setRotation(state.getRotationReflector());
this.reflector.setRingSetting(state.getRingSettingReflector());
}
@Override
public EnigmaStateBundle getState() {
EnigmaStateBundle state = new EnigmaStateBundle();
state.setTypeRotor1(rotor1.getNumber());
state.setTypeRotor2(rotor2.getNumber());
state.setTypeRotor3(rotor3.getNumber());
state.setRotationRotor1(rotor1.getRotation());
state.setRotationRotor2(rotor2.getRotation());
state.setRotationRotor3(rotor3.getRotation());
state.setRingSettingRotor1(rotor1.getRingSetting());
state.setRingSettingRotor2(rotor2.getRingSetting());
state.setRingSettingRotor3(rotor3.getRingSetting());
state.setTypeReflector(reflector.getNumber());
state.setRotationReflector(reflector.getRotation());
state.setRingSettingReflector(reflector.getRingSetting());
return state;
}
}

View file

@ -71,9 +71,12 @@ public class Reflector
* 3 -> ReflectorC
* 4 -> ReflectorThinB
* 5 -> ReflectorThinC
* 6 -> ReflectorEnigmaD
* 7 -> ReflectorK
* 7 -> ReflectorT
* 6 -> ReflectorEnigma_D_KD_G31
* 7 -> Reflector_K
* 8 -> Reflector_T
* 9 -> Reflector_G312
* 10 -> Reflector_G260
* 11 -> Reflector_R
* default -> ReflectorB
* @return Reflector
*/
@ -86,9 +89,12 @@ public class Reflector
case 3: return new ReflectorC();
case 4: return new ReflectorThinB();
case 5: return new ReflectorThinC();
case 6: return new ReflectorEnigmaDKD();
case 7: return new ReflectorEnigmaK();
case 8: return new ReflectorEnigmaT();
case 6: return new ReflectorEnigma_D_KD_G31();
case 7: return new ReflectorEnigma_K();
case 8: return new ReflectorEnigma_T();
case 9: return new Reflector_G312();
case 10: return new Reflector_G260();
case 11: return new Reflector_R();
default: return new ReflectorB();
}
}
@ -215,10 +221,10 @@ public class Reflector
* Standard wiring: AI,BM,CE,DT,FG,HR,JY,KS,LQ,NZ,OX,PW,UV
* Has additional ringSetting and can rotate
*/
public static class ReflectorEnigmaDKD extends Reflector
public static class ReflectorEnigma_D_KD_G31 extends Reflector
{
public static final int[] defaultWiring = {8,12,4,19,2,6,5,17,0,24,18,16,1,25,23,22,11,7,10,3,21,20,15,14,9,13};
public ReflectorEnigmaDKD()
public ReflectorEnigma_D_KD_G31()
{
super("Ref-D", 6, defaultWiring);
}
@ -234,9 +240,13 @@ public class Reflector
}
}
private static class ReflectorEnigmaK extends Reflector
/**
* Reflector as used in various Enigma models of the K-Series
* I M E T C G F R A Y S Q B Z X W L H K D V U P O J N
*/
private static class ReflectorEnigma_K extends Reflector
{
public ReflectorEnigmaK()
public ReflectorEnigma_K()
{
super("Ref-K", 7, new int[]{8,12,4,19,2,6,5,17,0,24,18,16,1,25,23,22,11,7,10,3,21,20,15,14,9,13});
}
@ -245,12 +255,47 @@ public class Reflector
* Reflector as used in the Enigma type T (Tirpitz)
* G E K P B T A U M O C N I L J D X Z Y F H W V Q S R
*/
private static class ReflectorEnigmaT extends Reflector
private static class ReflectorEnigma_T extends Reflector
{
public ReflectorEnigmaT()
public ReflectorEnigma_T()
{
super("Ref-T", 8, new int[]{6,4,10,15,1,19,0,20,12,14,2,13,8,11,9,3,23,25,24,5,7,22,21,16,18,17});
}
}
/**
* Reflector as used in the Enigma type G-312 Abwehr
* R U L Q M Z J S Y G O C E T K W D A H N B X P V I F
*/
private static class Reflector_G312 extends Reflector
{
public Reflector_G312()
{
super("Ref-G312", 9, new int[]{17,20,11,16,12,25,9,18,24,6,14,2,4,19,10,22,3,0,7,13,1,23,15,21,8,5});
}
}
/**
* Reflector as used in the Enigma type G-260 Abwehr
* I M E T C G F R A Y S Q B Z X W L H K D V U P O J N
*/
private static class Reflector_G260 extends Reflector
{
public Reflector_G260()
{
super("Ref-G260", 10, new int[]{8,12,4,19,2,6,5,17,0,24,18,16,1,25,23,22,11,7,10,3,21,20,15,14,9,13});
}
}
/**
* Reflector as used in the Enigma Type R "Rocket" (Reichsbahn)
*/
private static class Reflector_R extends Reflector
{
public Reflector_R()
{
super("Ref-R", 11, new int[]{16,24,7,14,6,13,4,2,21,15,20,25,19,5,3,9,0,23,22,12,10,8,18,17,1,11});
}
}
}

View file

@ -79,39 +79,63 @@ public class Rotor
{
switch (type)
{
case 0: return new EntryWheelDK();
case 0: return new EntryWheel_QWERTZ();
case 1: return new RotorI(rotation, ringSetting);
case 2: return new RotorII(rotation, ringSetting);
case 3: return new RotorIII(rotation, ringSetting);
case 4: return new RotorIV(rotation, ringSetting);
case 5: return new RotorV(rotation, ringSetting);
case 6: return new RotorVI(rotation, ringSetting);
case 7: return new RotorVII(rotation, ringSetting);
case 8: return new RotorVIII(rotation, ringSetting);
case 1: return new Rotor_I(rotation, ringSetting);
case 2: return new Rotor_II(rotation, ringSetting);
case 3: return new Rotor_III(rotation, ringSetting);
case 4: return new Rotor_IV(rotation, ringSetting);
case 5: return new Rotor_V(rotation, ringSetting);
case 6: return new Rotor_VI(rotation, ringSetting);
case 7: return new Rotor_VII(rotation, ringSetting);
case 8: return new Rotor_VIII(rotation, ringSetting);
case 9: return new RotorBeta(rotation, ringSetting);
case 10: return new RotorGamma(rotation, ringSetting);
case 9: return new Rotor_M4_Beta(rotation, ringSetting);
case 10: return new Rotor_M4_Gamma(rotation, ringSetting);
case 11: return new RotorDI(rotation, ringSetting);
case 12: return new RotorDII(rotation, ringSetting);
case 13: return new RotorDIII(rotation, ringSetting);
case 11: return new Rotor_D_I(rotation, ringSetting);
case 12: return new Rotor_D_II(rotation, ringSetting);
case 13: return new Rotor_D_III(rotation, ringSetting);
case 14: return new RotorKI(rotation, ringSetting);
case 15: return new RotorKII(rotation, ringSetting);
case 16: return new RotorKIII(rotation, ringSetting);
case 14: return new Rotor_KSwiss_Standard_I(rotation, ringSetting);
case 15: return new Rotor_KSwiss_Standard_II(rotation, ringSetting);
case 16: return new Rotor_KSwiss_Standard_III(rotation, ringSetting);
case 17: return new EntryWheelT();
case 18: return new RotorTI(rotation, ringSetting);
case 19: return new RotorTII(rotation, ringSetting);
case 20: return new RotorTIII(rotation, ringSetting);
case 21: return new RotorTIV(rotation, ringSetting);
case 22: return new RotorTV(rotation, ringSetting);
case 23: return new RotorTVI(rotation, ringSetting);
case 24: return new RotorTVII(rotation, ringSetting);
case 25: return new RotorTVIII(rotation, ringSetting);
case 17: return new EntryWheel_T();
case 18: return new Rotor_T_I(rotation, ringSetting);
case 19: return new Rotor_T_II(rotation, ringSetting);
case 20: return new Rotor_T_III(rotation, ringSetting);
case 21: return new Rotor_T_IV(rotation, ringSetting);
case 22: return new Rotor_T_V(rotation, ringSetting);
case 23: return new Rotor_T_VI(rotation, ringSetting);
case 24: return new Rotor_T_VII(rotation, ringSetting);
case 25: return new Rotor_T_VIII(rotation, ringSetting);
default: return new RotorI(rotation, ringSetting);
case 26: return new Rotor_G312_I(rotation, ringSetting);
case 27: return new Rotor_G312_II(rotation, ringSetting);
case 28: return new Rotor_G312_III(rotation, ringSetting);
case 29: return new Rotor_G260_I(rotation, ringSetting);
case 30: return new Rotor_G260_II(rotation, ringSetting);
case 31: return new Rotor_G260_III(rotation, ringSetting);
case 32: return new Rotor_G31_I(rotation, ringSetting);
case 33: return new Rotor_G31_II(rotation, ringSetting);
case 34: return new Rotor_G31_III(rotation, ringSetting);
case 35: return new Rotor_K_I(rotation, ringSetting);
case 36: return new Rotor_K_II(rotation, ringSetting);
case 37: return new Rotor_K_III(rotation, ringSetting);
case 38: return new Rotor_K_Swiss_Airforce_I(rotation, ringSetting);
case 39: return new Rotor_K_Swiss_Airforce_II(rotation, ringSetting);
case 40: return new Rotor_K_Swiss_Airforce_III(rotation, ringSetting);
case 41: return new Rotor_R_I(rotation, ringSetting);
case 42: return new Rotor_R_II(rotation, ringSetting);
case 43: return new Rotor_R_III(rotation, ringSetting);
default: return new Rotor_I(rotation, ringSetting);
}
}
@ -249,9 +273,9 @@ public class Rotor
* Used in Enigma I, M3, M4
* E K M F L G D Q V Z N T O W Y H X U S P A I B R C J
*/
private static class RotorI extends Rotor
private static class Rotor_I extends Rotor
{
public RotorI(int rotation, int ringSetting)
public Rotor_I(int rotation, int ringSetting)
{
super("I", 1,
new Integer[]{4, 10, 12, 5, 11, 6, 3, 16, 21, 25, 13, 19, 14, 22, 24, 7, 23, 20, 18, 15, 0, 8, 1, 17, 2, 9},
@ -265,9 +289,9 @@ public class Rotor
* Used in Enigma I, M3, M4
* A J D K S I R U X B L H W T M C Q G Z N P Y F V O E
*/
private static class RotorII extends Rotor
private static class Rotor_II extends Rotor
{
public RotorII(int rotation, int ringSetting)
public Rotor_II(int rotation, int ringSetting)
{
super("II", 2,
new Integer[]{0, 9, 3, 10, 18, 8, 17, 20, 23, 1, 11, 7, 22, 19, 12, 2, 16, 6, 25, 13, 15, 24, 5, 21, 14, 4},
@ -281,9 +305,9 @@ public class Rotor
* Used in Enigma I, M3, M4
* B D F H J L C P R T X V Z N Y E I W G A K M U S Q O
*/
private static class RotorIII extends Rotor
private static class Rotor_III extends Rotor
{
public RotorIII(int rotation, int ringSetting)
public Rotor_III(int rotation, int ringSetting)
{
super("III", 3,
new Integer[]{1, 3, 5, 7, 9, 11, 2, 15, 17, 19, 23, 21, 25, 13, 24, 4, 8, 22, 6, 0, 10, 12, 20, 18, 16, 14},
@ -297,9 +321,9 @@ public class Rotor
* Used in Enigma M3, M4
* E S O V P Z J A Y Q U I R H X L N F T G K D C M W B
*/
private static class RotorIV extends Rotor
private static class Rotor_IV extends Rotor
{
public RotorIV(int rotation, int ringSetting)
public Rotor_IV(int rotation, int ringSetting)
{
super("IV", 4,
new Integer[]{4, 18, 14, 21, 15, 25, 9, 0, 24, 16, 20, 8, 17, 7, 23, 11, 13, 5, 19, 6, 10, 3, 2, 12, 22, 1},
@ -313,9 +337,9 @@ public class Rotor
* Used in Enigma M3, M4
* V Z B R G I T Y U P S D N H L X A W M J Q O F E C K
*/
private static class RotorV extends Rotor
private static class Rotor_V extends Rotor
{
public RotorV(int rotation, int ringSetting)
public Rotor_V(int rotation, int ringSetting)
{
super("V", 5,
new Integer[]{21, 25, 1, 17, 6, 8, 19, 24, 20, 15, 18, 3, 13, 7, 11, 23, 0, 22, 12, 9, 16, 14, 5, 4, 2, 10},
@ -329,9 +353,9 @@ public class Rotor
* Used in Enigma M3, M4
* J P G V O U M F Y Q B E N H Z R D K A S X L I C T W
*/
private static class RotorVI extends Rotor
private static class Rotor_VI extends Rotor
{
public RotorVI(int rotation, int ringSetting)
public Rotor_VI(int rotation, int ringSetting)
{
super("VI", 6,
new Integer[]{9,15,6,21,14,20,12,5,24,16,1,4,13,7,25,17,3,10,0,18,23,11,8,2,19,22},
@ -345,9 +369,9 @@ public class Rotor
* Used in Enigma M3, M4
* N Z J H G R C X M Y S W B O U F A I V L P E K Q D T
*/
private static class RotorVII extends Rotor
private static class Rotor_VII extends Rotor
{
public RotorVII(int rotation, int ringSetting)
public Rotor_VII(int rotation, int ringSetting)
{
super("VII", 7,
new Integer[]{13,25,9,7,6,17,2,23,12,24,18,22,1,14,20,5,0,8,21,11,15,4,10,16,3,19},
@ -361,9 +385,9 @@ public class Rotor
* Used in Enigma M3, M4
* F K Q H T L X O C B J S P D Z R A M E W N I U Y G V
*/
private static class RotorVIII extends Rotor
private static class Rotor_VIII extends Rotor
{
public RotorVIII(int rotation, int ringSetting)
public Rotor_VIII(int rotation, int ringSetting)
{
super("VIII", 8,
new Integer[]{5,10,16,7,19,11,23,14,2,1,9,18,15,3,25,17,0,12,4,22,13,8,20,24,6,21},
@ -380,9 +404,9 @@ public class Rotor
* That way the M4 was backwards compatible to the M3
* Used in M4
*/
private static class RotorBeta extends Rotor
private static class Rotor_M4_Beta extends Rotor
{
public RotorBeta(int rotation, int ringSetting)
public Rotor_M4_Beta(int rotation, int ringSetting)
{
super("Beta", 9,
new Integer[]{11,4,24,9,21,2,13,8,23,22,15,1,16,12,3,17,19,0,10,25,6,5,20,7,14,18},
@ -411,9 +435,9 @@ public class Rotor
* (if rotation == 0). That way the M4 was backwards compatible to the M3
* Used in M4
*/
private static class RotorGamma extends Rotor
private static class Rotor_M4_Gamma extends Rotor
{
public RotorGamma(int rotation, int ringSetting)
public Rotor_M4_Gamma(int rotation, int ringSetting)
{
super("Gamma", 10,
new Integer[]{5,18,14,10,0,13,20,4,17,7,12,1,19,8,24,2,22,11,16,15,25,23,21,6,9,3},
@ -435,12 +459,12 @@ public class Rotor
}
/**
* EntryWheel as used in the Enigma models D, K
* EntryWheel as used in the Enigma models D, K, G
* Q W E R T Z U I O A S D F G H J K P Y X C V B N M L
*/
private static class EntryWheelDK extends Rotor
private static class EntryWheel_QWERTZ extends Rotor
{
public EntryWheelDK()
public EntryWheel_QWERTZ()
{
super("ETW-D", 0,
new Integer[]{9,22,20,11,2,12,13,14,7,15,16,25,24,23,8,17,0,3,10,4,6,21,1,19,18,5},
@ -466,9 +490,9 @@ public class Rotor
* L P G S Z M H A E O Q K V X R F Y B U T N I C J D W
* Turnover Z
*/
private static class RotorDI extends Rotor
private static class Rotor_D_I extends Rotor
{
public RotorDI(int rotation, int ringSetting)
public Rotor_D_I(int rotation, int ringSetting)
{
super("D-I", 11,
new Integer[]{11,15,6,18,25,12,7,0,4,14,16,10,21,23,17,5,24,1,20,19,13,8,2,9,3,22},
@ -482,9 +506,9 @@ public class Rotor
* S L V G B T F X J Q O H E W I R Z Y A M K P C N D U
* Turnover F
*/
private static class RotorDII extends Rotor
private static class Rotor_D_II extends Rotor
{
public RotorDII(int rotation, int ringSetting)
public Rotor_D_II(int rotation, int ringSetting)
{
super("D-II", 12,
new Integer[]{18,11,21,6,1,19,5,23,9,16,14,7,4,22,8,17,25,24,0,12,10,15,2,13,3,20},
@ -498,9 +522,9 @@ public class Rotor
* C J G D P S H K T U R A W Z X F M Y N Q O B V L I E
* Turnover O
*/
private static class RotorDIII extends Rotor
private static class Rotor_D_III extends Rotor
{
public RotorDIII(int rotation, int ringSetting)
public Rotor_D_III(int rotation, int ringSetting)
{
super("D-III", 13,
new Integer[]{2,9,6,3,15,18,7,10,19,20,17,0,22,25,23,5,12,24,13,16,14,1,21,11,8,4},
@ -514,11 +538,11 @@ public class Rotor
* P E Z U O H X S C V F M T B G L R I N Q J W A Y D K
* Turnover Z
*/
private static class RotorKI extends Rotor
private static class Rotor_KSwiss_Standard_I extends Rotor
{
public RotorKI(int rotation, int ringSetting)
public Rotor_KSwiss_Standard_I(int rotation, int ringSetting)
{
super("K-I", 14,
super("KS-I", 14,
new Integer[]{15,4,25,20,14,7,23,18,2,21,5,12,19,1,6,11,17,8,13,16,9,22,0,24,3,10},
new Integer[]{22,13,8,24,1,10,14,5,17,20,25,15,11,18,4,0,19,16,7,12,3,9,21,6,23,2},
new Integer[]{25}, ringSetting, rotation);
@ -530,11 +554,11 @@ public class Rotor
* Z O U E S Y D K F W P C I Q X H M V B L G N J R A T
* Turnover F
*/
private static class RotorKII extends Rotor
private static class Rotor_KSwiss_Standard_II extends Rotor
{
public RotorKII(int rotation, int ringSetting)
public Rotor_KSwiss_Standard_II(int rotation, int ringSetting)
{
super("K-II", 15,
super("KS-II", 15,
new Integer[]{25,14,20,4,18,24,3,10,5,22,15,2,8,16,23,7,12,21,1,11,6,13,9,17,0,19},
new Integer[]{24,18,11,6,3,8,20,15,12,22,7,19,16,21,1,10,13,23,4,25,2,17,9,14,5,0},
new Integer[]{5}, ringSetting, rotation);
@ -546,11 +570,11 @@ public class Rotor
* E H R V X G A O B Q U S I M Z F L Y N W K T P D J C
* Turnover O
*/
private static class RotorKIII extends Rotor
private static class Rotor_KSwiss_Standard_III extends Rotor
{
public RotorKIII(int rotation, int ringSetting)
public Rotor_KSwiss_Standard_III(int rotation, int ringSetting)
{
super("K-III", 16,
super("KS-III", 16,
new Integer[]{4,7,17,21,23,6,0,14,1,16,20,18,8,12,25,5,11,24,13,22,10,19,15,3,9,2},
new Integer[]{6,8,25,23,0,15,5,1,12,24,20,16,13,18,7,22,9,2,11,21,10,3,19,4,17,14},
new Integer[]{14}, ringSetting, rotation);
@ -561,9 +585,9 @@ public class Rotor
* EntryWheel as used only in the Enigma Type T Tirpitz
* K Z R O U Q H Y A I G B L W V S T D X F P N M C J E
*/
private static class EntryWheelT extends Rotor
private static class EntryWheel_T extends Rotor
{
public EntryWheelT()
public EntryWheel_T()
{
super("T-ETW", 17,
new Integer[]{8,11,23,17,25,19,10,6,9,24,0,12,22,21,3,20,5,2,15,16,4,14,13,18,7,1},
@ -588,9 +612,9 @@ public class Rotor
* K P T Y U E L O C V G R F Q D A N J M B S W H Z X I
* Turnover X A F L R
*/
private static class RotorTI extends Rotor
private static class Rotor_T_I extends Rotor
{
public RotorTI(int rotation, int ringSetting)
public Rotor_T_I(int rotation, int ringSetting)
{
super("T-I", 18,
new Integer[]{10,15,19,24,20,4,11,14,2,21,6,17,5,16,3,0,13,9,12,1,18,22,7,25,23,8},
@ -604,9 +628,9 @@ public class Rotor
* U P H Z L W E Q M T D J X C A K S O I G V B Y F N R
* Turnover X A G M S
*/
private static class RotorTII extends Rotor
private static class Rotor_T_II extends Rotor
{
public RotorTII(int rotation, int ringSetting)
public Rotor_T_II(int rotation, int ringSetting)
{
super("T-II", 19,
new Integer[]{20,15,7,25,11,22,4,16,12,19,3,9,23,2,0,10,18,14,8,6,21,1,24,5,13,17},
@ -620,9 +644,9 @@ public class Rotor
* Q U D L Y R F E K O N V Z A X W H M G P J B S I C T
* Turnover X A F L R
*/
private static class RotorTIII extends Rotor
private static class Rotor_T_III extends Rotor
{
public RotorTIII(int rotation, int ringSetting) {
public Rotor_T_III(int rotation, int ringSetting) {
super("T-III", 20,
new Integer[]{16,20,3,11,24,17,5,4,10,14,13,21,25,0,23,22,7,12,6,15,9,1,18,8,2,19},
new Integer[]{13,21,24,2,7,6,18,16,23,20,8,3,17,10,9,19,0,5,22,25,1,11,15,14,4,12},
@ -635,9 +659,9 @@ public class Rotor
* C I W T B K X N R E S P F L Y D A G V H Q U O J Z M
* Turnover X A G M S
*/
private static class RotorTIV extends Rotor
private static class Rotor_T_IV extends Rotor
{
public RotorTIV(int rotation, int ringSetting)
public Rotor_T_IV(int rotation, int ringSetting)
{
super("T-IV", 21,
new Integer[]{2,8,22,19,1,10,23,13,17,4,18,15,5,11,24,3,0,6,21,7,16,20,14,9,25,12},
@ -651,9 +675,9 @@ public class Rotor
* U A X G I S N J B V E R D Y L F Z W T P C K O H M Q
* Turnover Z D G L S
*/
private static class RotorTV extends Rotor
private static class Rotor_T_V extends Rotor
{
public RotorTV(int rotation, int ringSetting)
public Rotor_T_V(int rotation, int ringSetting)
{
super("T-V", 22,
new Integer[]{20,0,23,6,8,18,13,9,1,21,4,17,3,24,11,5,25,22,19,15,2,10,14,7,12,16},
@ -667,9 +691,9 @@ public class Rotor
* X F U Z G A L V H C N Y S E W Q T D M R B K P I O J
* Turnover Y F J N R
*/
private static class RotorTVI extends Rotor
private static class Rotor_T_VI extends Rotor
{
public RotorTVI(int rotation, int ringSetting)
public Rotor_T_VI(int rotation, int ringSetting)
{
super("T-VI", 23,
new Integer[]{23,5,20,25,6,0,11,21,7,2,13,24,18,4,22,16,19,3,12,17,1,10,15,8,14,9},
@ -683,9 +707,9 @@ public class Rotor
* B J V F T X P L N A Y O Z I K W G D Q E R U C H S M
* Turnover Z D G L S
*/
private static class RotorTVII extends Rotor
private static class Rotor_T_VII extends Rotor
{
public RotorTVII(int rotation, int ringSetting)
public Rotor_T_VII(int rotation, int ringSetting)
{
super("T-VII", 24,
new Integer[]{1,9,21,5,19,23,15,11,13,0,24,14,25,8,10,22,6,3,16,4,17,20,2,7,18,12},
@ -699,9 +723,9 @@ public class Rotor
* Y M T P N Z H W K O D A J X E L U Q V G C B I S F R
* Turnover Y F J N R
*/
private static class RotorTVIII extends Rotor
private static class Rotor_T_VIII extends Rotor
{
public RotorTVIII(int rotation, int ringSetting)
public Rotor_T_VIII(int rotation, int ringSetting)
{
super("T-VIII", 25,
new Integer[]{24,12,19,15,13,25,7,22,10,14,3,0,9,23,4,11,20,16,21,6,2,1,8,18,5,17},
@ -709,4 +733,290 @@ public class Rotor
new Integer[]{24,5,9,13,17}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type G312 Abwehr
* D M T W S I L R U Y Q N K F E J C A Z B P G X O H V
* Turnover T V W X A B C D F G H J L M P Q R
*/
private static class Rotor_G312_I extends Rotor
{
public Rotor_G312_I(int rotation, int ringSetting)
{
super("G312-I", 26,
new Integer[]{3,12,19,22,18,8,11,17,20,24,16,13,10,5,4,9,2,0,25,1,15,6,23,14,7,21},
new Integer[]{17,19,16,0,14,13,21,24,5,15,12,6,1,11,23,20,10,7,4,2,8,25,3,22,9,18},
new Integer[]{19,21,22,23,0,1,2,3,5,6,7,9,11,12,15,16,17}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma Type G312 Abwehr
* H Q Z G P J T M O B L N C I F D Y A W V E U S R K X
* Turnover T U W Z A B D E G H I L N O R
*/
private static class Rotor_G312_II extends Rotor
{
public Rotor_G312_II(int rotation, int ringSetting)
{
super("G312-II", 27,
new Integer[]{7,16,25,6,15,9,19,12,14,1,11,13,2,8,5,3,24,0,22,21,4,20,18,17,10,23},
new Integer[]{17,9,12,15,20,14,3,0,13,5,24,10,7,11,8,4,1,23,22,6,21,19,18,25,16,2},
new Integer[]{19,20,22,25,0,1,3,4,6,7,8,11,13,14,17}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type G312 Abwehr
* U Q N T L S Z F M R E H D P X K I B V Y G J C W O A
* Turnover V X Y B F G I L N O S
*/
private static class Rotor_G312_III extends Rotor
{
public Rotor_G312_III(int rotation, int ringSetting)
{
super("G312-III", 28,
new Integer[]{20,16,13,19,11,18,25,5,12,17,4,7,3,15,23,10,8,1,21,24,6,9,2,22,14,0},
new Integer[]{25,17,22,12,10,7,20,11,16,21,15,4,8,2,24,13,1,9,5,3,0,18,23,14,19,6},
new Integer[]{21,23,24,1,5,6,8,11,13,14,18}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type G260 Abwehr
* R C S P B L K Q A U M H W Y T I F Z V G O J N E X D
* Turnover T V W X A B C D F G H J L M P Q R
*/
private static class Rotor_G260_I extends Rotor
{
public Rotor_G260_I(int rotation, int ringSetting)
{
super("G260-I", 29,
new Integer[]{17,2,18,15,1,11,10,16,0,20,12,7,22,24,19,8,5,25,21,6,14,9,13,4,23,3},
new Integer[]{8,4,1,25,23,16,19,11,15,21,6,5,10,22,20,3,7,0,2,14,9,18,12,24,13,17},
new Integer[]{19,21,22,23,0,1,2,3,5,6,7,9,11,12,15,16,17}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma Type G260 Abwehr
* W C M I B V P J X A R O S G N D L Z K E Y H U F Q T
* Turnover T U W Z A B D E G H I L N O R
*/
private static class Rotor_G260_II extends Rotor
{
public Rotor_G260_II(int rotation, int ringSetting)
{
super("G260-II", 30,
new Integer[]{22,2,12,8,1,21,15,9,23,0,17,14,18,6,13,3,11,25,10,4,24,7,20,5,16,19},
new Integer[]{9,4,1,15,19,23,13,21,3,7,18,16,2,14,11,6,24,10,12,25,22,5,0,8,20,17},
new Integer[]{19,20,22,25,0,1,3,4,6,7,8,11,13,14,17}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type G260 Abwehr
* F V D H Z E L S Q M A X O K Y I W P G C B U J T N R
* Turnover V X Y B F G I L N O S
*/
private static class Rotor_G260_III extends Rotor
{
public Rotor_G260_III(int rotation, int ringSetting)
{
super("G260-III", 31,
new Integer[]{5,21,3,7,25,4,11,18,16,12,0,23,14,10,24,8,22,15,6,2,1,20,9,19,13,17},
new Integer[]{10,20,19,2,5,0,18,3,15,22,13,6,9,24,12,17,8,25,7,23,21,1,16,11,14,4},
new Integer[]{21,23,24,1,5,6,8,11,13,14,18}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type G31 Abwehr
* L P G S Z M H A E O Q K V X R F Y B U T N I C J D W
* Turnover T V W X A B C D F G H J L M P Q R
*/
private static class Rotor_G31_I extends Rotor
{
public Rotor_G31_I(int rotation, int ringSetting)
{
super("G31-I", 32,
new Integer[]{11,15,6,18,25,12,7,0,4,14,16,10,21,23,17,5,24,1,20,19,13,8,2,9,3,22},
new Integer[]{7,17,22,24,8,15,2,6,21,23,11,0,5,20,9,1,10,14,3,19,18,12,25,13,16,4},
new Integer[]{19,21,22,23,0,1,2,3,5,6,7,9,11,12,15,16,17}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma Type G31 Abwehr
* S L V G B T F X J Q O H E W I R Z Y A M K P C N D U
* Turnover T U W Z A B D E G H I L N O R
*/
private static class Rotor_G31_II extends Rotor
{
public Rotor_G31_II(int rotation, int ringSetting)
{
super("G31_II", 33,
new Integer[]{18,11,21,6,1,19,5,23,9,16,14,7,4,22,8,17,25,24,0,12,10,15,2,13,3,20},
new Integer[]{18,4,22,24,12,6,3,11,14,8,20,1,19,23,10,21,9,15,0,5,25,2,13,7,17,16},
new Integer[]{19,20,22,25,0,1,3,4,6,7,8,11,13,14,17}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type G31 Abwehr
* C J G D P S H K T U R A W Z X F M Y N Q O B V L I E
* Turnover V X Y B F G I L N O S
*/
private static class Rotor_G31_III extends Rotor
{
public Rotor_G31_III(int rotation, int ringSetting)
{
super("G31_III", 34,
new Integer[]{2,9,6,3,15,18,7,10,19,20,17,0,22,25,23,5,12,24,13,16,14,1,21,11,8,4},
new Integer[]{11,21,0,3,25,15,2,6,24,1,7,23,16,18,20,4,19,10,5,8,9,22,12,14,17,13},
new Integer[]{21,23,24,1,5,6,8,11,13,14,18}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type K
* L P G S Z M H A E O Q K V X R F Y B U T N I C J D W
* Turnover Z
*/
private static class Rotor_K_I extends Rotor
{
public Rotor_K_I(int rotation, int ringSetting)
{
super("K-I", 35,
new Integer[]{11,15,6,18,25,12,7,0,4,14,16,10,21,23,17,5,24,1,20,19,13,8,2,9,3,22},
new Integer[]{7,17,22,24,8,15,2,6,21,23,11,0,5,20,9,1,10,14,3,19,18,12,25,13,16,4},
new Integer[]{25}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma type K
* S L V G B T F X J Q O H E W I R Z Y A M K P C N D U
* Turnover F
*/
private static class Rotor_K_II extends Rotor
{
public Rotor_K_II(int rotation, int ringSetting)
{
super("K-II", 36,
new Integer[]{18,11,21,6,1,19,5,23,9,16,14,7,4,22,8,17,25,24,0,12,10,15,2,13,3,20},
new Integer[]{18,4,22,24,12,6,3,11,14,8,20,1,19,23,10,21,9,15,0,5,25,2,13,7,17,16},
new Integer[]{5}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type K
* C J G D P S H K T U R A W Z X F M Y N Q O B V L I E
* Turnover O
*/
private static class Rotor_K_III extends Rotor
{
public Rotor_K_III(int rotation, int ringSetting)
{
super("K-III", 37,
new Integer[]{2,9,6,3,15,18,7,10,19,20,17,0,22,25,23,5,12,24,13,16,14,1,21,11,8,4},
new Integer[]{11,21,0,3,25,15,2,6,24,1,7,23,16,18,20,4,19,10,5,8,9,22,12,14,17,13},
new Integer[]{14}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type K (Swiss, Airforce)
* PEZUOHXSCVFMTBGLRINQJWAYDK
* Turnover Z
*/
private static class Rotor_K_Swiss_Airforce_I extends Rotor
{
public Rotor_K_Swiss_Airforce_I(int rotation, int ringSetting)
{
super("KSA-I", 38,
new Integer[]{15,4,25,20,14,7,23,18,2,21,5,12,19,1,6,11,17,8,13,16,9,22,0,24,3,10},
new Integer[]{22,13,8,24,1,10,14,5,17,20,25,15,11,18,4,0,19,16,7,12,3,9,21,6,23,2},
new Integer[]{25}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma Type K (Swiss, Airforce)
* ZOUESYDKFWPCIQXHMVBLGNJRAT
* Turnover F
*/
private static class Rotor_K_Swiss_Airforce_II extends Rotor
{
public Rotor_K_Swiss_Airforce_II(int rotation, int ringSetting)
{
super("KSA-II", 39,
new Integer[]{25,14,20,4,18,24,3,10,5,22,15,2,8,16,23,7,12,21,1,11,6,13,9,17,0,19},
new Integer[]{24,18,11,6,3,8,20,15,12,22,7,19,16,21,1,10,13,23,4,25,2,17,9,14,5,0},
new Integer[]{5}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type K (Swiss, Airforce)
* EHRVXGAOBQUSIMZFLYNWKTPDJC
* Turnover O
*/
private static class Rotor_K_Swiss_Airforce_III extends Rotor
{
public Rotor_K_Swiss_Airforce_III(int rotation, int ringSetting)
{
super("KSA-III", 40,
new Integer[]{4,7,17,21,23,6,0,14,1,16,20,18,8,12,25,5,11,24,13,22,10,19,15,3,9,2},
new Integer[]{6,8,25,23,0,15,5,1,12,24,20,16,13,18,7,22,9,2,11,21,10,3,19,4,17,14},
new Integer[]{14}, ringSetting, rotation);
}
}
/**
* Rotor I as used in the Enigma Type R (Rocket)
* JGDQOXUSCAMIFRVTPNEWKBLZYH
* Turnover O
*/
private static class Rotor_R_I extends Rotor
{
public Rotor_R_I(int rotation, int ringSetting)
{
super("R-I", 41,
new Integer[]{9,6,3,16,14,23,20,18,2,0,12,8,5,17,21,19,15,13,4,22,10,1,11,25,24,7},
new Integer[]{9,21,8,2,18,12,1,25,11,0,20,22,10,17,4,16,3,13,7,15,6,14,19,5,24,23},
new Integer[]{14}, ringSetting, rotation);
}
}
/**
* Rotor II as used in the Enigma Type R (Rocket)
* NTZPSFBOKMWRCJDIVLAEYUXHGQ
* Turnover F
*/
private static class Rotor_R_II extends Rotor
{
public Rotor_R_II(int rotation, int ringSetting)
{
super("R-II", 42,
new Integer[]{13,19,25,15,18,5,1,14,10,12,22,17,2,9,3,8,21,11,0,4,24,20,23,7,6,16},
new Integer[]{18,6,12,14,19,5,24,23,15,13,8,17,9,0,7,3,25,11,4,1,21,16,10,22,20,2},
new Integer[]{5}, ringSetting, rotation);
}
}
/**
* Rotor III as used in the Enigma Type R (Rocket)
* JVIUBHTCDYAKEQZPOSGXNRMWFL
* Turnover Z
*/
private static class Rotor_R_III extends Rotor
{
public Rotor_R_III(int rotation, int ringSetting)
{
super("R-III", 43,
new Integer[]{9,21,8,20,1,7,19,2,3,24,0,10,4,16,25,15,14,18,6,23,13,17,12,22,5,11},
new Integer[]{10,4,7,8,12,24,18,5,2,0,11,25,22,20,16,15,13,21,17,6,3,1,23,19,9,14},
new Integer[]{25}, ringSetting, rotation);
}
}
}

View file

@ -116,8 +116,20 @@ public abstract class LayoutContainer
return new LayoutContainer_D();
case "K":
return new LayoutContainer_K();
case "KS":
return new LayoutContainer_K_Swiss();
case "KSA":
return new LayoutContainer_K_Swiss_Airforce();
case "T":
return new LayoutContainer_T();
case "R":
return new LayoutContainer_R();
case "G31":
return new LayoutContainer_G31();
case "G312":
return new LayoutContainer_G312();
case "G260":
return new LayoutContainer_G260();
default:
return new LayoutContainer_I();
}

View file

@ -10,7 +10,7 @@ import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_D;
/**
* Concrete LayoutContainer for the M3 layout.
* Concrete LayoutContainer for the D layout.
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub

View file

@ -0,0 +1,146 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_G260;
/**
* LayoutContainer for the Enigma Model G260
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_G260 extends LayoutContainer
{
private Enigma_G260 enigma;
protected int offsetRot = 29;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_G260()
{
super();
main.setTitle("G260 - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_G260();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - offsetRot);
this.rotor2View.setSelection(state.getTypeRotor2() - offsetRot);
this.rotor3View.setSelection(state.getTypeRotor3() - offsetRot);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + offsetRot);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -0,0 +1,146 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_G31;
/**
* LayoutContainer for the Enigma Model G31
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_G31 extends LayoutContainer
{
private Enigma_G31 enigma;
protected int offsetRot = 32;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_G31()
{
super();
main.setTitle("G31 - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_G31();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - offsetRot);
this.rotor2View.setSelection(state.getTypeRotor2() - offsetRot);
this.rotor3View.setSelection(state.getTypeRotor3() - offsetRot);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + offsetRot);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -0,0 +1,146 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_G312;
/**
* LayoutContainer for the Enigma Model G312
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_G312 extends LayoutContainer
{
private Enigma_G312 enigma;
protected int offsetRot = 26;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_G312()
{
super();
main.setTitle("G312 - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_G312();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - offsetRot);
this.rotor2View.setSelection(state.getTypeRotor2() - offsetRot);
this.rotor3View.setSelection(state.getTypeRotor3() - offsetRot);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + offsetRot);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + offsetRot);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -7,6 +7,7 @@ import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K_Swiss_Standard;
/**
* LayoutContainer for the Enigma Model K
@ -114,9 +115,9 @@ public class LayoutContainer_K extends LayoutContainer
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1()-14);
this.rotor2View.setSelection(state.getTypeRotor2()-14);
this.rotor3View.setSelection(state.getTypeRotor3()-14);
this.rotor1View.setSelection(state.getTypeRotor1() - 35);
this.rotor2View.setSelection(state.getTypeRotor2() - 35);
this.rotor3View.setSelection(state.getTypeRotor3() - 35);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
@ -126,9 +127,9 @@ public class LayoutContainer_K extends LayoutContainer
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + 14);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + 14);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + 14);
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + 35);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + 35);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + 35);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());

View file

@ -0,0 +1,145 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K_Swiss_Standard;
/**
* LayoutContainer for the Enigma Model K
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_K_Swiss extends LayoutContainer
{
private Enigma_K_Swiss_Standard enigma;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_K_Swiss()
{
super();
main.setTitle("KS - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_K_Swiss_Standard();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - 14);
this.rotor2View.setSelection(state.getTypeRotor2() - 14);
this.rotor3View.setSelection(state.getTypeRotor3() - 14);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + 14);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + 14);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + 14);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -0,0 +1,145 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K;
import de.vanitasvitae.enigmandroid.enigma.Enigma_K_Swiss_Airforce;
/**
* LayoutContainer for the Enigma Model K
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_K_Swiss_Airforce extends LayoutContainer
{
private Enigma_K_Swiss_Airforce enigma;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_K_Swiss_Airforce()
{
super();
main.setTitle("KSA - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_K_Swiss_Airforce();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - 38);
this.rotor2View.setSelection(state.getTypeRotor2() - 38);
this.rotor3View.setSelection(state.getTypeRotor3() - 38);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + 38);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + 38);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + 38);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -0,0 +1,144 @@
package de.vanitasvitae.enigmandroid.layout;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import de.vanitasvitae.enigmandroid.R;
import de.vanitasvitae.enigmandroid.enigma.Enigma;
import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_R;
/**
* LayoutContainer for the Enigma Model R
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* @author vanitasvitae
*/
public class LayoutContainer_R extends LayoutContainer
{
private Enigma_R enigma;
protected Spinner rotor1View;
protected Spinner rotor2View;
protected Spinner rotor3View;
protected Spinner rotor1PositionView;
protected Spinner rotor2PositionView;
protected Spinner rotor3PositionView;
protected Spinner reflectorPositionView;
public LayoutContainer_R()
{
super();
main.setTitle("R - EnigmAndroid");
this.resetLayout();
}
@Override
public Enigma getEnigma() {
return this.enigma;
}
@Override
protected void initializeLayout() {
this.rotor1View = (Spinner) main.findViewById(R.id.rotor1);
this.rotor2View = (Spinner) main.findViewById(R.id.rotor2);
this.rotor3View = (Spinner) main.findViewById(R.id.rotor3);
this.rotor1PositionView = (Spinner) main.findViewById(R.id.rotor1position);
this.rotor2PositionView = (Spinner) main.findViewById(R.id.rotor2position);
this.rotor3PositionView = (Spinner) main.findViewById(R.id.rotor3position);
this.reflectorPositionView = (Spinner) main.findViewById(R.id.reflector_position);
Character[] rotorPositionArray = new Character[26];
for(int i=0; i<26; i++) {rotorPositionArray[i] = (char) (65+i); /**Fill with A..Z*/}
ArrayAdapter<CharSequence> rotor1Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor1View.setAdapter(rotor1Adapter);
ArrayAdapter<CharSequence> rotor2Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor2View.setAdapter(rotor2Adapter);
ArrayAdapter<CharSequence> rotor3Adapter = ArrayAdapter.createFromResource(main, R.array.rotors_1_3,
android.R.layout.simple_spinner_item);
rotor3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
rotor3View.setAdapter(rotor3Adapter);
ArrayAdapter<Character> rotor1PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor1PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor1PositionView.setAdapter(rotor1PositionAdapter);
ArrayAdapter<Character> rotor2PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor2PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor2PositionView.setAdapter(rotor2PositionAdapter);
ArrayAdapter<Character> rotor3PositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
rotor3PositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
rotor3PositionView.setAdapter(rotor3PositionAdapter);
ArrayAdapter<Character> reflectorPositionAdapter = new ArrayAdapter<>(main.getApplicationContext(),
android.R.layout.simple_spinner_item, rotorPositionArray);
reflectorPositionAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
reflectorPositionView.setAdapter(reflectorPositionAdapter);
}
@Override
public void resetLayout() {
enigma = new Enigma_R();
setLayoutState(enigma.getState());
output.setText("");
input.setText("");
}
@Override
protected void setLayoutState(EnigmaStateBundle state)
{
this.state = state;
this.rotor1View.setSelection(state.getTypeRotor1() - 41);
this.rotor2View.setSelection(state.getTypeRotor2() - 41);
this.rotor3View.setSelection(state.getTypeRotor3() - 41);
this.rotor1PositionView.setSelection(state.getRotationRotor1());
this.rotor2PositionView.setSelection(state.getRotationRotor2());
this.rotor3PositionView.setSelection(state.getRotationRotor3());
this.reflectorPositionView.setSelection(state.getRotationReflector());
}
@Override
protected void refreshState()
{
state.setTypeRotor1(rotor1View.getSelectedItemPosition() + 41);
state.setTypeRotor2(rotor2View.getSelectedItemPosition() + 41);
state.setTypeRotor3(rotor3View.getSelectedItemPosition() + 41);
state.setRotationRotor1(rotor1PositionView.getSelectedItemPosition());
state.setRotationRotor2(rotor2PositionView.getSelectedItemPosition());
state.setRotationRotor3(rotor3PositionView.getSelectedItemPosition());
state.setRotationReflector(reflectorPositionView.getSelectedItemPosition());
}
@Override
public void showRingSettingsDialog()
{
new RingSettingsDialogBuilder.RingSettingsDialogBuilderRotRotRotRef().
createRingSettingsDialog(state);
}
}

View file

@ -9,7 +9,7 @@ import de.vanitasvitae.enigmandroid.enigma.EnigmaStateBundle;
import de.vanitasvitae.enigmandroid.enigma.Enigma_T;
/**
* LayoutContainer for the Enigma Model K
* LayoutContainer for the Enigma Model T
* This class contains the layout and controls the layout elements such as spinners and stuff
* Copyright (C) 2015 Paul Schaub

View file

@ -68,12 +68,36 @@
</Spinner>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/lin_lay_1"
android:layout_above="@+id/buttons_lay"
android:id="@+id/text_layer">
<EditText
android:layout_width="0dp"
android:layout_weight=".50"
android:layout_height="match_parent"
android:id="@+id/input"
android:inputType="textNoSuggestions|textMultiLine"
android:hint="@string/hint_enigma_type_here" />
<EditText
android:layout_width="0dp"
android:layout_weight=".50"
android:layout_height="match_parent"
android:inputType="none"
android:textIsSelectable="true"
android:id="@+id/output"
android:hint="@string/hint_enigma_code"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/buttons_lay"
android:layout_below="@+id/lin_lay_1"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<Button
@ -94,28 +118,4 @@
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/buttons_lay"
android:layout_alignParentBottom="true"
android:id="@+id/text_layer">
<EditText
android:layout_width="0dp"
android:layout_weight=".50"
android:layout_height="match_parent"
android:id="@+id/input"
android:inputType="textNoSuggestions|textMultiLine"
android:hint="@string/hint_enigma_type_here" />
<EditText
android:layout_width="0dp"
android:layout_weight=".50"
android:layout_height="match_parent"
android:inputType="none"
android:textIsSelectable="true"
android:id="@+id/output"
android:hint="@string/hint_enigma_code"/>
</LinearLayout>
</RelativeLayout>

View file

@ -8,7 +8,8 @@
<string name="description_text">EnigmAndroid ist die Implementation einer Simulation der Enigma Maschine.
Die Enigma Maschine ist eine in den 1920er Jahren entwickelte Verschlüsselungsmaschine,
die unter anderem im zweiten Weltkrieg von der deutschen Wehrmacht eingesetzt wurde,
um geheime Nachrichten zu verschlüsseln. Dabei wird jeder einzelne Buchstabe elektronisch
um geheime Nachrichten zu verschlüsseln. Es gab mehrere verschiedene Enigmamodelle.
Zur Verschlüsselung wird jeder einzelne Buchstabe elektronisch
durch eine Reihe von rotierbaren Walzen geleitet, sodass nach jedem Buchstaben ein anderes
Verschlüsselungsalphabet genutzt wird (Polyalphabetische Substitution).
Die Walzen konnte man aus einem Set von 5 Walzen wählen. Zusätzlich gab es ein Steckbrett, an dem
@ -19,10 +20,10 @@
<string name="section_how_to_use">Um einen Text mit EnigmAndroid zu ver- oder entschlüsseln, wählen Sie zunächst das entsprechende Maschinenmodell aus.
Sie finden eine Liste, aus der Sie wählen können in den Einstellungen. Tippen Sie dann den Klar- oder Geheimtext in das Feld \"Hier tippen\".
Wählen Sie anschließend je nach gewähltem Modell eine Umkehrwalze, sowie weitere Walzen aus. Legen Sie außerdem die Startpositionen der Walzen fest.
Zuletzt können Sie ggf. noch einige Steckerpaare auf dem Steckbrett festlegen, oder die Verkabelung der Umkehrwalze ändern. Tippen Sie dazu die
gewünschten Paare mit Komma getrennt in das entsprechende Textfeld (zb. \"ab,cd\").
Beachten Sie, dass Sie einen Stecker nicht doppelt nutzen dürfen.
Optional können Sie auch noch die Ringstellung definieren. Öffnen Sie dazu das Optionsmenü und wählen Sie den Punkt \"Ringstellung\".
Zuletzt können Sie ggf. noch einige Steckerpaare auf dem Steckbrett festlegen, oder die Verkabelung der Umkehrwalze ändern. Tippen Sie dazu den
jeweiligen Button an und verbinden Sie die gewünschten Steckerpaare, indem Sie im sich öffnenden Dialog nacheinander jeweils zwei
Stecker berühren. Falls sie eine Verbindung trennen möchten, klicken Sie einen der betroffenen Stecker doppelt an.
Optional können Sie außerdem auch noch die Ringstellung definieren. Öffnen Sie dazu das Optionsmenü und wählen Sie den Punkt \"Ringstellung\".
Haben Sie alle Einstellungen getätigt klicken Sie auf den Button \"Ver-Entschlüsseln\".</string>
<string name="title_section_developer">Entwickler</string>

View file

@ -7,7 +7,7 @@
<string name="title_about_dialog">About EnigmAndroid</string>
<string name="description_text">EnigmAndroid is an implementation of a simulation of the Enigma Machine.
The Enigma Machine is a cypher machine developed in the 1920s. It was used by the german Wehrmacht to
encipher secret messaged during the second world war. For enciphering text, every letter is passed through 3 mechanical rotors that rotate with every keypress.
encipher secret messaged during the second world war. There were multiple different Enigma models. For enciphering text, every letter is passed through 3-4 mechanical rotors that rotate with every keypress.
That way the enigma achieves polyalphabetic substitution and the output appears random. The rotors could be chosen from a set of 5. Additionally there was a
so called plugboard, where one could switch over pairs of letters.
</string>
@ -16,9 +16,10 @@
<string name="section_how_to_use">In the beginning, choose a model of the enigma machine to work with.
You can do this in the settings. To encrypt/decrpyt a message, you can type it into the input field.
Afterwards you can - depending on the chosen model - select a reflector and the some rotors. Also select their initial positions.
Then you may set pairs on the plugboard or on the pluggable reflector. Therefore you just type the pairs separated by commas (e.g. \"ab,cd\").
Notice that you can\'t plug a letter twice.
Optionally you can set custom ring settings. Open the options menu and select \"Ringsettings\".
Then you may set pairs on the plugboard or on the pluggable reflector.
Therefore press the respective button and connect the characters you wish to connect by clicking them one after another.
If you want to disconnect two plugs, just touch one of the plugs twice.
Also you can optionally set custom ring settings. Open the options menu and select \"Ringsettings\".
When you are ready press \"En-/Decrypt!\".</string>
<string name="title_section_developer">Developer</string>

View file

@ -5,13 +5,34 @@
<string name="pref_title_machine_type">Enigma Model</string>
<string name="pref_description_machine_type">Which model do you want to simulate?</string>
<string-array translatable="false" name="pref_list_machine_type">
<item>I (Heer, Luftwaffe)</item>
<item>M3 (Heer, Marine)</item>
<item>M4 (\"Shark\", Marine)</item>
<item>G31/A865 (Abwehr)</item>
<item>G312 (Abwehr)</item>
<item>G260 (Abwehr)</item>
<item>D (Kommerziell)</item>
<item>K</item>
<item>K (Swiss)</item>
<item>K (Swiss, Airforce)</item>
<item>R (\"Rocket\", Reichsbahn)</item>
<item>T (\"Tirpitz\", Japan)</item>
</string-array>
<string-array translatable="false" name="pref_alias_machine_type">
<item>I</item>
<item>M3</item>
<item>M4</item>
<item>G31</item>
<item>G312</item>
<item>G260</item>
<item>D</item>
<item>K</item>
<item>KS</item>
<item>KSA</item>
<item>R</item>
<item>T</item>
</string-array>
<string name="pref_title_simulate_anomaly">Simulate Anomaly</string>
<string name="pref_description_simulate_anomaly">The double step anomaly causes the middle rotor
to rotate twice, if it is one step before its turnover point.

View file

@ -7,7 +7,7 @@
android:title="@string/pref_title_machine_type"
android:summary="@string/pref_description_machine_type"
android:entries="@array/pref_list_machine_type"
android:entryValues="@array/pref_list_machine_type"
android:entryValues="@array/pref_alias_machine_type"
android:defaultValue="Enigma I"/>
<CheckBoxPreference
android:key="prefAnomaly"