package com.bigpupdev.synodroid.wizard;
import java.util.HashMap;
import java.util.List;
import com.bigpupdev.synodroid.Synodroid;
import com.bigpupdev.synodroid.data.DSMVersion;
import com.bigpupdev.synodroid.ui.DownloadPreferenceActivity;
import com.bigpupdev.synodroid.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
/**
* The wizard which try to find server on a local network
*
* @author Eric Taix
*/
public class AddServerWizard {
public static final String META_NAME = "NAME";
public static final String META_PORT = "PORT";
public static final String META_HOST = "HOST";
public static final String META_SCHEME = "SCHEME";
public static final String META_PASSWORD = "PASSWORD";
public static final String META_USERNAME = "USERNAME";
public static final String META_DSM = "DSM";
public static final String META_DDNS_NAME = "DDNS-NAME";
public static final String META_DDNS = "DDNS";
public static final String META_HTTPS = "HTTPS";
public static final String META_WIFI = "WIFI";
private static final int MSG_USER_EDITED = 1;
private static final int MSG_DSM_SELECTED = 2;
private static final int MSG_OPTIONS_HTTPS_EDITED = 3;
private static final int MSG_OPTIONS_INTERNET_EDITED = 4;
private static final int MSG_OPTIONS_NAME_EDITED = 5;
private static final int MSG_OPTIONS_WIFI_EDITED = 6;
private HashMap<String, Object> metaData = new HashMap<String, Object>();
private boolean canceled = false;
private boolean DEBUG;
// ====================================================================
// The message handler
private AddHandler handler = new AddHandler() {
@Override
public void handleMessage(Message msg) {
if (!canceled) {
switch (msg.what) {
// Name was given to the server
case MSG_OPTIONS_NAME_EDITED:
try {
optionsSRVName.dismiss();
optionsSRVName = null;
if (metaData.get(META_NAME).equals("")){
createNewServer();
}
else{
editUser();
}
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
// User informations has been edited
case MSG_USER_EDITED:
try {
userDialog.dismiss();
userDialog = null;
if (metaData.get(META_PASSWORD).equals("") || metaData.get(META_USERNAME).equals("")){
editUser();
}
else{
selectDSM();
}
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
// User informations has been edited
case MSG_DSM_SELECTED:
try {
dsmDialog.dismiss();
dsmDialog = null;
editOptionsSecure();
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
// Options have been edited
case MSG_OPTIONS_HTTPS_EDITED:
try {
optionsHTTPSDialog.dismiss();
optionsHTTPSDialog = null;
switch(wizardDirType){
case TYPE_WIFI_ONLY:
case TYPE_WIFI_3G:
show_wifi();
break;
case TYPE_3G_ONLY:
metaData.put(META_WIFI, "");
metaData.put(META_HOST, "");
show_internet();
break;
}
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
// Options have been edited
case MSG_OPTIONS_WIFI_EDITED:
try {
optionsWifi.dismiss();
optionsWifi = null;
if (metaData.get(META_WIFI).equals("") || metaData.get(META_HOST).equals("")){
show_wifi();
}
else{
switch(wizardDirType){
case TYPE_WIFI_3G:
show_internet();
break;
default:
metaData.put(META_DDNS_NAME, "");
metaData.put(META_DDNS, false);
createServers();
break;
}
}
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
case MSG_OPTIONS_INTERNET_EDITED:
try {
optionsInternetDialog.dismiss();
optionsInternetDialog = null;
if (metaData.get(META_DDNS_NAME).equals("")){
show_internet();
}
else{
createServers();
}
} catch (Exception e) {
if (DEBUG) Log.e(Synodroid.DS_TAG, "Exception thrown: ", e);
}
break;
default:
break;
}
}
}
};
// The cancel listener available for every dialogs
private DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// If we want to add a message when the user cancel the wizard: it's here
// !
canceled = true;
}
};
// The current context in which this wizard is executed
private DownloadPreferenceActivity context;
// The view inflater
private LayoutInflater inflater;
// Often used label
private CharSequence cancelSeq;
// The user dialog
private AlertDialog userDialog;
// The DSM dialog
private AlertDialog dsmDialog;
// The HTTPS option dialog
private AlertDialog optionsHTTPSDialog;
// The HTTPS option dialog
private AlertDialog optionsSRVName;
// The Internet option dialog
private AlertDialog optionsInternetDialog;
// The Wifi option dialog
private AlertDialog optionsWifi;
private int wizardDirType = 0;
final static int TYPE_WIFI_ONLY = 0;
final static int TYPE_3G_ONLY = 1;
final static int TYPE_WIFI_3G = 2;
/**
* Constructor
*
* @param ctxP
*/
public AddServerWizard(DownloadPreferenceActivity ctxP, boolean debug) {
context = ctxP;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cancelSeq = context.getText(R.string.button_cancel);
DEBUG = debug;
}
/**
* Start the wizard
*
* @param contextP
* @return
*/
public void start() {
createNewServer();
}
private void createNewServer(){
View ll = inflater.inflate(R.layout.add_wizard_create_server, null);
final EditText name = (EditText) ll.findViewById(R.id.add_wzi_srv_name);
final Spinner type = (Spinner) ll.findViewById(R.id.add_wiz_srv_type);
optionsSRVName = new AddWizardBuilder(context).setTitle(context.getText(R.string.add_wizard_srv_sel_title)).setView(ll).setPositiveButton(context.getText(R.string.button_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
metaData.put(META_NAME, name.getText().toString());
metaData.put(META_SCHEME, "HTTP");
metaData.put(META_PORT, 5000);
wizardDirType = (int) type.getSelectedItemId();
Message msg = new Message();
msg.what = MSG_OPTIONS_NAME_EDITED;
handler.sendMessage(msg);
}
}).create();
optionsSRVName.show();
}
private void show_wifi(){
View ll = inflater.inflate(R.layout.add_wizard_wifi_selector, null);
final EditText host = (EditText) ll.findViewById(R.id.add_wiz_srv_host);
final Spinner wifi = (Spinner) ll.findViewById(R.id.add_wiz_wifi_list);
final EditText name = (EditText) ll.findViewById(R.id.add_wiz_wifi_name);
WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiMgr.isWifiEnabled()){
List<WifiConfiguration> wifis = wifiMgr.getConfiguredNetworks();
if (wifis.size()==0){
wifi.setVisibility(View.GONE);
}
else{
name.setVisibility(View.GONE);
String[] wifiSSIDs = new String[wifis.size()];
for (int iLoop = 0; iLoop < wifis.size(); iLoop++) {
String ssid = wifis.get(iLoop).SSID;
if (ssid != null) {
if (ssid.startsWith("\"") && ssid.endsWith("\"")) {
ssid = ssid.substring(1, ssid.length() - 1);
}
wifiSSIDs[iLoop] = ssid;
}
}
ArrayAdapter<String> sa = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, wifiSSIDs);
sa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
wifi.setAdapter(sa);
}
}
else{
wifi.setVisibility(View.GONE);
}
optionsWifi = new AddWizardBuilder(context).setTitle(context.getText(R.string.add_wizard_wifi_title)).setView(ll).setPositiveButton(context.getText(R.string.button_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
metaData.put(META_HOST, host.getText().toString());
if (wifi.getVisibility() == View.VISIBLE){
metaData.put(META_WIFI, wifi.getSelectedItem().toString());
}
else{
metaData.put(META_WIFI, name.getText().toString());
}
Message msg = new Message();
msg.what = MSG_OPTIONS_WIFI_EDITED;
handler.sendMessage(msg);
}
}).create();
optionsWifi.show();
}
/**
* Create server(s)
*/
private void createServers() {
context.onWizardFinished(metaData);
}
/**
* Edit HTTPS options
*/
private void editOptionsSecure() {
View ll = inflater.inflate(R.layout.wizard_options_secured, null);
final CheckBox httpsCB = (CheckBox) ll.findViewById(R.id.https_option);
optionsHTTPSDialog = new AddWizardBuilder(context).setTitle(context.getText(R.string.add_wizard_sec_title)).setView(ll).setPositiveButton(context.getText(R.string.button_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
metaData.put(META_HTTPS, httpsCB.isChecked());
metaData.put(META_HTTPS, httpsCB.isChecked());
Message msg = new Message();
msg.what = MSG_OPTIONS_HTTPS_EDITED;
handler.sendMessage(msg);
}
}).create();
optionsHTTPSDialog.show();
}
/**
* Edit Internet options
*/
private void show_internet() {
View ll = inflater.inflate(R.layout.wizard_options_internet, null);
final CheckBox ddnsCB = (CheckBox) ll.findViewById(R.id.ddns_option);
final EditText ddnsET = (EditText) ll.findViewById(R.id.ddns_hostname);
ddnsCB.setVisibility(View.GONE);
ddnsET.setEnabled(true);
optionsInternetDialog = new AddWizardBuilder(context).setTitle(context.getText(R.string.add_wizard_cell_title)).setView(ll).setPositiveButton(context.getText(R.string.button_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
metaData.put(META_DDNS, true);
metaData.put(META_DDNS_NAME, ddnsET.getText().toString());
Message msg = new Message();
msg.what = MSG_OPTIONS_INTERNET_EDITED;
handler.sendMessage(msg);
}
}).create();
optionsInternetDialog.show();
}
/**
* Select the DSM version
*/
private void selectDSM() {
final DSMVersion[] versions = DSMVersion.values();
dsmDialog = new AddWizardBuilder(context).setTitle(context.getText(R.string.wizard_selectdsm_title)).setAdapter(new ArrayAdapter<DSMVersion>(context, R.layout.wizard_dsmrow, R.id.label, versions), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
DSMVersion dsm = versions[which];
metaData.put(META_DSM, dsm.getTitle());
Message msg = new Message();
msg.what = MSG_DSM_SELECTED;
handler.sendMessage(msg);
}
}).create();
dsmDialog.show();
}
/**
* Show and edit user informations (username & password)
*/
private void editUser() {
View ll = inflater.inflate(R.layout.wizard_user_pass_form, null);
final TextView uView = (TextView) ll.findViewById(R.id.user);
final TextView pView = (TextView) ll.findViewById(R.id.password);
userDialog = new AddWizardBuilder(context).setTitle(context.getText(R.string.wizard_user_title)).setView(ll).setPositiveButton(context.getText(R.string.button_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
metaData.put(META_USERNAME, uView.getText().toString());
metaData.put(META_PASSWORD, pView.getText().toString());
Message msg = new Message();
msg.what = MSG_USER_EDITED;
handler.sendMessage(msg);
}
}).create();
userDialog.show();
}
/* ======================================================================== */
/**
* An AlertDailog builder which add some default behaviour
*/
private class AddWizardBuilder extends AlertDialog.Builder {
/**
* Default constructor
*
* @param ctxP
*/
public AddWizardBuilder(Context ctxP) {
super(ctxP);
}
/*
* (non-Javadoc)
*
* @see android.app.AlertDialog.Builder#create()
*/
@Override
public AlertDialog create() {
// First add default values
setCancelable(false);
setNegativeButton(cancelSeq, cancelListener);
// Then create the dialog
return super.create();
}
}
}