package eu.tpmusielak.securephoto.verification;
import android.app.AlertDialog;
import android.app.Service;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.preference.*;
import eu.tpmusielak.securephoto.R;
import eu.tpmusielak.securephoto.verification.geo.CellularVerifierWrapper;
import eu.tpmusielak.securephoto.verification.geo.GeolocationVerifierWrapper;
import java.lang.ref.WeakReference;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Created by IntelliJ IDEA.
* User: Tomasz P. Musielak
* Date: 26/03/12
* Time: 02:38
*/
public class SCVerifierManager extends Service implements VerifierBinder {
private VerifierGUIReceiver guiReceiver;
private VerifierPreferenceReceiver preferenceReceiver;
protected List<VerifierWrapper> verifierWrappers;
private void initialize() {
verifierWrappers = new LinkedList<VerifierWrapper>();
new GeolocationVerifierWrapper().register(this);
new CellularVerifierWrapper().register(this);
// new TimestampVerifierWrapper().register(this);
// new GenericVerifierWrapper(new DummyVerifier()).register(this);
// new GenericVerifierWrapper(new DummyVerifier(2000)).register(this);
// new GenericVerifierWrapper(new DummyVerifier(30000)).register(this);
}
public class VerifierServiceBinder extends Binder {
private WeakReference<SCVerifierManager> managerReference;
public VerifierServiceBinder(SCVerifierManager verifierManager) {
managerReference = new WeakReference<SCVerifierManager>(verifierManager);
}
public SCVerifierManager getService() {
return managerReference.get();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
initialize();
initializeVWrappers();
}
@Override
public IBinder onBind(Intent intent) {
return new VerifierServiceBinder(this);
}
@Override
public void onDestroy() {
tearDownVWrappers();
super.onDestroy();
}
public void register(VerifierWrapper wrapper) {
verifierWrappers.add(wrapper);
}
public List<Verifier> getVerifiers() {
List<Verifier> verifiers = new LinkedList<Verifier>();
for (VerifierWrapper verifierWrapper : verifierWrappers) {
verifiers.add(verifierWrapper.getVerifier());
}
return verifiers;
}
public void initializeVWrappers() {
for (VerifierWrapper verifierWrapper : verifierWrappers) {
verifierWrapper.initializeWrapper();
}
}
public void tearDownVWrappers() {
for (VerifierWrapper verifierWrapper : verifierWrappers) {
verifierWrapper.onDestroy();
}
}
public void bindToGUI(VerifierGUIReceiver r) {
this.guiReceiver = r;
for (VerifierWrapper verifierWrapper : verifierWrappers) {
verifierWrapper.setReceiver(guiReceiver);
verifierWrapper.bindToGUI();
verifierWrapper.onCameraStart();
}
}
public void unbindFromGUI() {
for (VerifierWrapper verifierWrapper : verifierWrappers) {
verifierWrapper.onCameraExit();
}
}
public void bindToPreferences(VerifierPreferenceReceiver r) {
this.preferenceReceiver = r;
}
public void generateVerifierEnablers() {
PreferenceActivity preferenceActivity = preferenceReceiver.getPreferenceActivity();
String title = preferenceActivity.getResources().getString(R.string.pick_vfactor);
PreferenceScreen ps = preferenceReceiver.getPreferenceScreen();
PreferenceCategory preferenceCategory =
new PreferenceCategory(preferenceActivity);
preferenceCategory.setTitle(title);
ps.addPreference(preferenceCategory);
for (VerifierWrapper verifierWrapper : verifierWrappers) {
CheckBoxPreference preference = new CheckBoxPreference(preferenceActivity);
preference.setKey(verifierWrapper.getName());
preference.setTitle(verifierWrapper.getName());
preference.setChecked(verifierWrapper.isEnabled());
preference.setOnPreferenceChangeListener(new VerifierEnableListener(verifierWrapper));
preferenceCategory.addPreference(preference);
}
}
public void loadVerifierPreferences() {
Set<Integer> addedPreferences = new HashSet<Integer>();
for (VerifierWrapper verifierWrapper : verifierWrappers) {
int id = verifierWrapper.getPreferenceID();
if (id > 0 && !addedPreferences.contains(id)) {
preferenceReceiver.addPreferencesFromResource(id);
addedPreferences.add(id);
}
}
}
private boolean isBoundToGUI() {
return guiReceiver != null;
}
public void showVerificationFactors() {
if (!isBoundToGUI())
return;
List<CharSequence> verificationFactorNames = new LinkedList<CharSequence>();
boolean[] enabledV = new boolean[verifierWrappers.size()];
int i = 0;
for (VerifierWrapper v : verifierWrappers) {
verificationFactorNames.add(v.getName());
enabledV[i++] = v.isEnabled();
}
CharSequence[] items = new CharSequence[verificationFactorNames.size()];
verificationFactorNames.toArray(items);
AlertDialog.Builder builder = new AlertDialog.Builder(guiReceiver.getContext());
builder.setTitle(R.string.pick_vfactor);
builder.setCancelable(true);
builder.setMultiChoiceItems(items, enabledV, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
verifierWrappers.get(i).setEnabled(b);
}
});
AlertDialog alert = builder.create();
alert.show();
}
private class VerifierEnableListener implements Preference.OnPreferenceChangeListener {
VerifierWrapper wrapper;
public VerifierEnableListener(VerifierWrapper wrapper) {
this.wrapper = wrapper;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
wrapper.setEnabled((Boolean) newValue);
return true;
}
}
}