package com.buddycloud.fragments.adapter;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import com.buddycloud.R;
import com.buddycloud.fragments.GenericSelectableChannelsFragment;
import com.buddycloud.fragments.contacts.ContactMatcher;
import com.buddycloud.fragments.contacts.DeviceContactMatcher;
import com.buddycloud.fragments.contacts.FacebookContactMatcher;
import com.buddycloud.model.ModelCallback;
public class FindFriendsAdapter extends GenericChannelAdapter {
private static final String ADAPTER_STATE = "ADAPTER_STATE";
private static final int IN_DEVICE = 1;
private static final int FACEBOOK = 0;
public static final String ADAPTER_NAME = "FIND_FRIENDS";
public String getTitle(final Context context) {
return (context != null) ? context.getResources().getString(R.string.menu_find_friends) : null;
}
@Override
public void configure(final GenericSelectableChannelsFragment fragment, View view) {
String adapterState = fragment.getActivity().getIntent().getStringExtra(ADAPTER_STATE);
final Context context = fragment.getActivity();
if (adapterState != null) {
restoreAdapterState(adapterState, context);
return;
}
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
context, android.R.layout.select_dialog_item);
arrayAdapter.add(context.getString(R.string.contact_matching_facebook));
arrayAdapter.add(context.getString(R.string.contact_matching_contact_list));
final AlertDialog.Builder builderSingle = new AlertDialog.Builder(context);
builderSingle.setTitle(context.getString(R.string.contact_matching_title));
builderSingle.setAdapter(arrayAdapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContactMatcher matcher = createMatcher(which);
final String matcherName = matcher.getName();
matcher.match(fragment.getActivity(), new ModelCallback<JSONArray>() {
@SuppressLint("DefaultLocale")
@Override
public void success(JSONArray response) {
if (response.length() == 0) {
Toast.makeText(context,
context.getString(R.string.contact_matching_no_friends_found),
Toast.LENGTH_LONG).show();
builderSingle.show();
return;
}
for (int i = 0; i < response.length(); i++) {
addChannel(matcherName.toUpperCase(Locale.getDefault()),
response.optJSONObject(i), context);
}
saveAdapterState(fragment.getActivity());
}
@Override
public void error(Throwable throwable) {
Toast.makeText(fragment.getActivity(),
throwable.getMessage(), Toast.LENGTH_LONG).show();
builderSingle.show();
}
});
}
});
builderSingle.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
fragment.getActivity().finish();
}
});
builderSingle.show();
super.configure(fragment, view);
}
private void restoreAdapterState(String adapterStateStr, Context context) {
JSONObject adapterState = null;
try {
adapterState = new JSONObject(adapterStateStr);
} catch (JSONException e) {
return; // Do not restore anything
}
JSONArray categories = adapterState.names();
for (int i = 0; i < categories.length(); i++) {
String category = categories.optString(i);
JSONArray channelsPerCategory = adapterState.optJSONArray(category);
for (int j = 0; j < channelsPerCategory.length(); j++) {
JSONObject channel = channelsPerCategory.optJSONObject(j);
addChannel(category, channel, context);
}
}
}
private void saveAdapterState(FragmentActivity fragmentActivity) {
Map<String, List<JSONObject>> categories = getChannelsPerCategory();
JSONObject adapterState = new JSONObject();
for (String category : categories.keySet()) {
try {
adapterState.put(category, new JSONArray(categories.get(category)));
} catch (JSONException e) {
// Skip category
}
}
fragmentActivity.getIntent().putExtra(ADAPTER_STATE, adapterState.toString());
}
protected ContactMatcher createMatcher(int which) {
ContactMatcher matcher = null;
switch (which) {
case FACEBOOK:
matcher = new FacebookContactMatcher();
break;
case IN_DEVICE:
matcher = new DeviceContactMatcher();
break;
default:
break;
}
return matcher;
}
}