package com.facebook.android;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Dialog;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
import android.widget.Toast;
public class FieldsConnectionsDialog extends Dialog {
private final static int TAB_HEIGHT = 50;
private Button mGetFieldsButton;
private ListView fieldsList, connectionsList;
private BaseAdapter fieldsAdapter, connectionsAdapter;
private GraphExplorer explorerActivity;
protected Vector<String> fieldsVector;
private ArrayList<JSONObject> fieldsArray;
private ArrayList<String> connectionsArray;
public FieldsConnectionsDialog(GraphExplorer explorerActivity, JSONObject metadata) {
super(explorerActivity);
this.explorerActivity = explorerActivity;
/*
* Sort the fields and connections
*/
try {
sortFields(metadata.getJSONArray("fields"));
sortConnections(metadata.getJSONObject("connections").names());
} catch (JSONException e) {
Toast.makeText(explorerActivity.getBaseContext(),
"Fields/Connections could not be fetched.", Toast.LENGTH_SHORT).show();
}
setTitle(explorerActivity.getString(R.string.fields_and_connections));
fieldsVector = new Vector<String>();
}
/*
* Sort fields which are returned as JSONObject in the JSONArray
*/
public void sortFields(JSONArray jsonFieldsArray) {
this.fieldsArray = new ArrayList<JSONObject>(jsonFieldsArray.length());
for (int i = 0; i < jsonFieldsArray.length(); i++) {
try {
this.fieldsArray.add(jsonFieldsArray.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
Collections.sort(this.fieldsArray, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject object1, JSONObject object2) {
try {
return object1.getString("name").compareToIgnoreCase(object2.getString("name"));
} catch (JSONException e) {
e.printStackTrace();
}
return 0;
}
});
}
/*
* Sort the Connections returned in the JSONArray
*/
public void sortConnections(JSONArray jsonConnectionsArray) {
this.connectionsArray = new ArrayList<String>(jsonConnectionsArray.length());
for (int i = 0; i < jsonConnectionsArray.length(); i++) {
try {
this.connectionsArray.add(jsonConnectionsArray.get(i).toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
Collections.sort(this.connectionsArray);
}
/*
* Layout the dialog
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fields_connections_list);
LayoutParams params = getWindow().getAttributes();
params.width = LayoutParams.FILL_PARENT;
params.height = LayoutParams.FILL_PARENT;
getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
fieldsList = (ListView) findViewById(R.id.fields_list);
connectionsList = (ListView) findViewById(R.id.connections_list);
fieldsAdapter = new FieldsListAdapter();
if (this.fieldsArray == null) {
fieldsList.setAdapter(new ArrayAdapter<String>(explorerActivity,
android.R.layout.simple_list_item_1, new String[] { "No fields available" }));
} else {
fieldsList.setAdapter(fieldsAdapter);
}
connectionsAdapter = new ConnectionsListAdapter();
if (this.connectionsArray == null) {
connectionsList.setAdapter(new ArrayAdapter<String>(explorerActivity,
android.R.layout.simple_list_item_1,
new String[] { "No connections available" }));
} else {
connectionsList.setAdapter(connectionsAdapter);
}
TabHost tabHost = (TabHost) findViewById(R.id.tabHost);
tabHost.setup();
TabSpec spec1 = tabHost.newTabSpec("Tab 1");
spec1.setIndicator(explorerActivity.getString(R.string.fields));
spec1.setContent(R.id.fields_layout);
TabSpec spec2 = tabHost.newTabSpec("Tab 2");
spec2.setIndicator(explorerActivity.getString(R.string.connections));
spec2.setContent(R.id.connections_list);
tabHost.addTab(spec1);
tabHost.addTab(spec2);
tabHost.setCurrentTab(0);
tabHost.getTabWidget().getChildAt(0).getLayoutParams().height = TAB_HEIGHT;
tabHost.getTabWidget().getChildAt(1).getLayoutParams().height = TAB_HEIGHT;
mGetFieldsButton = (Button) findViewById(R.id.get_fields_button);
mGetFieldsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
* Source Tag:
*/
FieldsConnectionsDialog.this.dismiss();
if (!fieldsVector.isEmpty()) {
explorerActivity.getFields(fieldsVector);
} else {
Toast.makeText(explorerActivity.getBaseContext(), "No Fields selected.",
Toast.LENGTH_SHORT).show();
}
}
});
connectionsList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
FieldsConnectionsDialog.this.dismiss();
explorerActivity.getConnection(connectionsArray.get(position));
}
});
}
/**
* Definition of the list adapter
*/
public class FieldsListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
boolean[] isChecked;
public FieldsListAdapter() {
mInflater = LayoutInflater.from(explorerActivity.getBaseContext());
isChecked = new boolean[fieldsArray.size()];
}
@Override
public int getCount() {
return fieldsArray.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View hView = convertView;
ViewHolder holder;
JSONObject fieldObject = null;
fieldObject = fieldsArray.get(position);
if (hView == null) {
hView = mInflater.inflate(R.layout.fields_item, null);
holder = new ViewHolder();
holder.checkbox = (CheckBox) hView.findViewById(R.id.fields_checkbox);
holder.fieldsInfo = (TextView) hView.findViewById(R.id.fields_info);
hView.setTag(holder);
} else {
holder = (ViewHolder) hView.getTag();
}
try {
holder.checkbox.setText(fieldObject.getString("name"));
} catch (JSONException e) {
holder.checkbox.setText("");
}
try {
holder.fieldsInfo.setText(fieldObject.getString("description"));
} catch (JSONException e) {
holder.fieldsInfo.setText("");
}
holder.checkbox.setId(position);
holder.checkbox.setChecked(isChecked[position]);
holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton button, boolean checked) {
isChecked[button.getId()] = checked;
String field = button.getText().toString();
if (checked) {
fieldsVector.add(field);
} else if (fieldsVector.contains(field)) {
fieldsVector.remove(field);
}
}
});
return hView;
}
}
class ViewHolder {
CheckBox checkbox;
TextView fieldsInfo;
}
/**
* Definition of the list adapter
*/
public class ConnectionsListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public ConnectionsListAdapter() {
mInflater = LayoutInflater.from(explorerActivity.getBaseContext());
}
@Override
public int getCount() {
return connectionsArray.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View hView = convertView;
TextView connection;
if (hView == null) {
hView = mInflater.inflate(R.layout.connection_item, null);
connection = (TextView) hView.findViewById(R.id.connection_name);
hView.setTag(connection);
} else {
connection = (TextView) hView.getTag();
}
SpannableString name;
name = new SpannableString(connectionsArray.get(position));
name.setSpan(new UnderlineSpan(), 0, name.length(), 0);
connection.setText(name);
return hView;
}
}
}