package org.pyload.android.client.fragments;
import java.util.ArrayList;
import java.util.HashMap;
import org.pyload.android.client.R;
import org.pyload.android.client.pyLoadApp;
import org.pyload.android.client.module.GuiTask;
import org.pyload.thrift.ConfigItem;
import org.pyload.thrift.ConfigSection;
import org.pyload.thrift.Pyload.Client;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.InputType;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class ConfigSectionFragment extends Fragment {
private pyLoadApp app;
private ConfigSection section;
private String type;
private HashMap<String, ConfigItemView> items = new HashMap<String, ConfigItemView>();
/**
* Called after settings were saved
*/
private final Runnable mRefresh;
public ConfigSectionFragment(Runnable mRefresh) {
this.mRefresh = mRefresh;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.config_section, null, false);
createLayout(view);
TextView t = (TextView) view.findViewById(R.id.list_header_title);
t.setText(section.description);
view.findViewById(R.id.button_submit)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
onSubmit();
}
});
view.findViewById(R.id.button_cancel)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
onCancel();
}
});
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (pyLoadApp) getActivity().getApplicationContext();
Bundle extras = getArguments();
section = (ConfigSection) extras.getSerializable("section");
type = extras.getString("type");
}
private View createLayout(View view) {
LinearLayout ll = (LinearLayout) view.findViewById(R.id.layout_root);
ll.setOrientation(LinearLayout.VERTICAL);
for (ConfigItem item : section.items) {
ConfigItemView c = new ConfigItemView(this.getActivity(), item);
items.put(item.name, c);
ll.addView(c);
}
return ll;
}
public void onSubmit() {
if (!app.hasConnection())
return;
app.addTask(new GuiTask(new Runnable() {
@Override
public void run() {
Client client = app.getClient();
for (ConfigItem item : section.items) {
ConfigItemView view = items.get(item.name);
String newValue = view.getValue();
if (!item.value.equals(newValue)) {
Log.d("pyLoad", String.format(
"Set config value: %s, %s, %s", type,
section.name, item.name));
client.setConfigValue(section.name, item.name,
newValue, type);
}
}
getFragmentManager().popBackStack();
}
}, mRefresh));
}
public void onCancel() {
getFragmentManager().popBackStack();
}
}
class ConfigItemView extends LinearLayout {
private ConfigItem item;
private View v;
private Spinner sp = null;
private ArrayList<String> choices = null;
public ConfigItemView(Context context, ConfigItem item) {
super(context);
this.item = item;
setOrientation(LinearLayout.VERTICAL);
if (!item.type.equals("bool")) {
TextView tv = new TextView(context);
tv.setText(item.description);
tv.setTextColor(Color.WHITE);
tv.setTextSize(16);
tv.setPadding(2, 0, 0, 0);
addView(tv);
}
if (item.type.equals("int")) {
EditText et = new EditText(context);
et.setInputType(InputType.TYPE_CLASS_NUMBER);
et.setText(item.value);
v = et;
} else if (item.type.equals("password")) {
EditText et = new EditText(context);
et.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
et.setTransformationMethod(PasswordTransformationMethod
.getInstance());
et.setText(item.value);
v = et;
} else if (item.type.equals("bool")) {
CheckBox cb = new CheckBox(context);
cb.setText(item.description);
if (item.value.equals("True")) {
cb.setChecked(true);
}
v = cb;
} else if (item.type.contains(";")) {
sp = new Spinner(context);
choices = new ArrayList<String>();
for (String s : item.type.split(";")) {
choices.add(s);
}
ArrayAdapter<String> adp = new ArrayAdapter<String>(context,
android.R.layout.simple_spinner_item, choices);
adp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adp);
sp.setSelection(choices.indexOf(item.value));
v = sp;
} else {
v = new EditText(context);
((EditText) v).setText(item.value);
}
addView(v);
}
/**
* Returns the string representation of the config item
*
* @return
*/
public String getValue() {
if (item.type.equals("bool")) {
CheckBox cb = (CheckBox) v;
if (cb.isChecked())
return "True";
else
return "False";
} else if (sp != null) {
return choices.get(sp.getSelectedItemPosition());
}
return ((EditText) v).getText().toString();
}
}