/* Copyright (c) 2009 Miltiadis Allamanis
*
* The MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package app.randgen;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.Toast;
import app.randgen.backend.AccelerometerSeeder;
import app.randgen.backend.CompassSeeder;
import app.randgen.backend.LinuxRandomSeeder;
import app.randgen.backend.NormalFloatGenerator;
import app.randgen.backend.PassPhraseGenerator;
import app.randgen.backend.PoissonIntegerGenerator;
import app.randgen.backend.RandGenApp;
import app.randgen.backend.RandomGenerator;
import app.randgen.backend.SeedProvider;
import app.randgen.backend.TouchSeeder;
import app.randgen.backend.UniformFloatGenerator;
import app.randgen.backend.UniformIntegerGenerator;
public class randomMain extends Activity {
public static randomMain getInstance() {
return singleton;
}
private Button setSeed;
private Button startGenerator;
private final Activity thisActivity = this;
private Spinner selectDistribution;
private Spinner selectSeeder;
private static randomMain singleton;
private int currentLayout;
private ArrayList<RandomGenerator> Generators;
private ArrayList<SeedProvider> Seeders;
// index into arrays - used for saving preferences
private int generatorNum = -1;
private int seederNum = -1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
/** Create local UI objects */
super.onCreate(savedInstanceState);
singleton = this;
setContentView(R.layout.main);
Eula.show(this);
// Populate generators
Generators = new ArrayList<RandomGenerator>();
Generators.add(new UniformIntegerGenerator());
Generators.add(new UniformFloatGenerator());
Generators.add(new NormalFloatGenerator());
Generators.add(new PoissonIntegerGenerator());
Generators.add(new PassPhraseGenerator());
// Populate seeders
Seeders = new ArrayList<SeedProvider>();
Seeders.add(new LinuxRandomSeeder());
Seeders.add(new AccelerometerSeeder());
Seeders.add(new CompassSeeder());
Seeders.add(new TouchSeeder());
// Set Button variables
setSeed = (Button) this.findViewById(R.id.setSeedButton);
startGenerator = (Button) this.findViewById(R.id.startGeneration);
final CheckBox chkRepeats = (CheckBox) findViewById(R.id.chkAllowRepeats);
// Create listeners
OnClickListener setSeedListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
RandGenApp.getRandomGenerator().getMySeedProvider()
.getNewSeed(thisActivity);
}
};
setSeed.setOnClickListener(setSeedListener);
OnClickListener startGeneratorListener = new OnClickListener() {
@Override
public void onClick(View arg0) {
if (RandGenApp.getRandomGenerator() != null) { // should never
// fail
if (RandGenApp.getRandomGenerator().getMySeedProvider() != null) { // should
// never
// fail
if (RandGenApp.getRandomGenerator().getMySeedProvider()
.isSeeded()) {
RandGenApp.getRandomGenerator().repeating = chkRepeats
.isChecked();
if (RandGenApp.getRandomGenerator().setParameters(
singleton)) {
// TODO: Delete and instead start new activity
Intent intent = new Intent();
intent.setClassName("app.randgen",
"app.randgen.RandomGeneration");
thisActivity.startActivity(intent);
return;
} // else - setParameters failed and will have
// created a toast
} else {
Toast error = Toast.makeText(singleton,
"Please seed first.", Toast.LENGTH_SHORT);
error.show();
}
}
;
}
// TODO: Determine if the Seeder has been seeded...
}
};
startGenerator.setOnClickListener(startGeneratorListener);
// Set Spinner variables
selectDistribution = (Spinner) this.findViewById(R.id.distrSelect);
selectSeeder = (Spinner) this.findViewById(R.id.seedSelect);
// Configure spinners
selectDistribution.setPrompt(getText(R.string.selDistr));
selectSeeder.setPrompt(getText(R.string.selSeeder));
// Fill Distribution Spinner with the name of each generator in
// Generators
ArrayAdapter<CharSequence> distributionAdapter = new ArrayAdapter<CharSequence>(
this, android.R.layout.simple_spinner_item);
distributionAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
for (RandomGenerator g : Generators) {
distributionAdapter.add(g.getName());
}
selectDistribution.setAdapter(distributionAdapter);
OnItemSelectedListener distributionSelectListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
generatorNum = arg2; // for prefs
SeedProvider currentSeeder = RandGenApp.getRandomGenerator()
.getMySeedProvider();
RandGenApp.setRandomGenerator(Generators.get(arg2))
.setSeedProvider(currentSeeder);
singleton.findViewById(currentLayout).setVisibility(View.GONE);
currentLayout = Generators.get(arg2).getParamsLayoutID();
singleton.findViewById(currentLayout).setVisibility(
View.VISIBLE);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {// TODO Do we
// add something
// here?
};
};
selectDistribution
.setOnItemSelectedListener(distributionSelectListener);
// Fill Seeder Spinner with the name of each seeder in Seeders
ArrayAdapter<CharSequence> seederAdapter = new ArrayAdapter<CharSequence>(
this, android.R.layout.simple_spinner_item);
seederAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
for (SeedProvider s : Seeders) {
seederAdapter.add(s.getName());
}
selectSeeder.setAdapter(seederAdapter);
OnItemSelectedListener seederSelectListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
seederNum = arg2;
RandGenApp.getRandomGenerator().setSeedProvider(
Seeders.get(arg2)); // The actual ID as defined by
// RandGenApp, is as it is sorted
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {// TODO Do we
// add something
// here?
};
};
selectSeeder.setOnItemSelectedListener(seederSelectListener);
// Restore previous session / set defaults
SharedPreferences settings = getPreferences(MODE_PRIVATE);
generatorNum = settings.getInt("generator", 0); // default generator = 0
selectDistribution.setSelection(generatorNum);
seederNum = settings.getInt("seeder", 0);
selectSeeder.setSelection(seederNum);
RandGenApp.setRandomGenerator(Generators.get(generatorNum))
.setSeedProvider(Seeders.get(seederNum));
((CheckBox) findViewById(R.id.chkAllowRepeats)).setChecked(settings
.getBoolean("allowRepeats", true));
currentLayout = RandGenApp.getRandomGenerator().getParamsLayoutID(); // the
// spinner
// callback
// will
// make
// this
// view
// visible
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences settings = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("allowRepeats",
((CheckBox) findViewById(R.id.chkAllowRepeats)).isChecked());
editor.putInt("generator", generatorNum);
editor.putInt("seeder", seederNum);
editor.commit();
}
}