package com.buddycloud;
import java.io.File;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.MenuItem;
import com.buddycloud.fragments.GenericChannelsFragment;
import com.buddycloud.model.ChannelMetadataModel;
import com.buddycloud.model.MediaModel;
import com.buddycloud.model.ModelCallback;
import com.buddycloud.model.SubscribedChannelsModel;
import com.buddycloud.utils.ActionbarUtil;
import com.buddycloud.utils.AvatarUtils;
import com.buddycloud.utils.ImageHelper;
import com.buddycloud.utils.InputUtils;
import com.buddycloud.utils.TextUtils;
import com.buddycloud.utils.TimeUtils;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.DiscCacheUtil;
import com.nostra13.universalimageloader.core.assist.MemoryCacheUtil;
public class ChannelDetailActivity extends SherlockActivity {
private static final int SELECT_PHOTO_REQUEST_CODE = 110;
private ProgressDialog mProgressDialog;
private final static List<String> ROLES = Arrays.asList(new String[] {
SubscribedChannelsModel.ROLE_MEMBER,
SubscribedChannelsModel.ROLE_PUBLISHER });
private final static Integer[] ROLE_DETAILS = new Integer[] {
R.string.channel_details_role_member,
R.string.channel_details_role_publisher };
private final static List<String> ACCESS_MODELS = Arrays.asList(new String[] {
SubscribedChannelsModel.ACCESS_MODEL_OPEN,
SubscribedChannelsModel.ACCESS_MODEL_AUTHORIZE });
private final static Integer[] ACCESS_MODELS_DETAILS = new Integer[] {
R.string.channel_details_access_model_open,
R.string.channel_details_access_model_member };
private int selectedRole;
private int selectedAccessModel;
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case SELECT_PHOTO_REQUEST_CODE:
if (resultCode == RESULT_OK) {
Uri selectedImage = imageReturnedIntent.getData();
Context context = getApplicationContext();
File tempAvatar = null;
try {
tempAvatar = AvatarUtils.downSample(context, selectedImage);
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
getString(R.string.message_avatar_upload_failed),
Toast.LENGTH_SHORT).show();
return;
}
uploadAvatar(tempAvatar);
}
}
}
private void uploadAvatar(final File tempAvatar) {
final String channelJid = getIntent().getStringExtra(
GenericChannelsFragment.CHANNEL);
Toast.makeText(getApplicationContext(),
getString(R.string.message_avatar_uploading), Toast.LENGTH_LONG).show();
MediaModel.getInstance().saveAvatar(this, null,
new ModelCallback<JSONObject>() {
@Override
public void success(JSONObject response) {
tempAvatar.delete();
loadAvatar(channelJid, true);
Toast.makeText(getApplicationContext(),
getString(R.string.message_avatar_uploaded),
Toast.LENGTH_SHORT).show();
}
@Override
public void error(Throwable throwable) {
Toast.makeText(
getApplicationContext(),
getString(R.string.message_avatar_upload_failed),
Toast.LENGTH_SHORT).show();
}
}, Uri.fromFile(tempAvatar).toString(), channelJid);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_channel_details);
final String channelJid = getIntent().getStringExtra(
GenericChannelsFragment.CHANNEL);
final String role = getIntent().getStringExtra(
SubscribedChannelsModel.ROLE);
final boolean editable = SubscribedChannelsModel.canEditMetadata(role);
ActionbarUtil.showActionBarwithBack(this, channelJid);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(getString(R.string.message_metadata_saving));
mProgressDialog.setCancelable(false);
if (!fillFields(editable, channelJid)) {
ChannelMetadataModel.getInstance().fill(getApplicationContext(),
new ModelCallback<Void>() {
@Override
public void success(Void response) {
fillFields(editable, channelJid);
}
@Override
public void error(Throwable throwable) {
}
}, channelJid);
}
ImageView avatarView = loadAvatar(channelJid, false);
if (editable) {
avatarView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent,
SELECT_PHOTO_REQUEST_CODE);
}
});
}
final Button saveMetadataBtn = (Button) findViewById(R.id.saveSettingsBtn);
if (editable) {
saveMetadataBtn.setEnabled(true);
saveMetadataBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mProgressDialog.show();
JSONObject newMetadata = createMetadataJSON();
ChannelMetadataModel.getInstance().save(
getApplicationContext(), newMetadata,
new ModelCallback<JSONObject>() {
@Override
public void success(JSONObject response) {
mProgressDialog.dismiss();
Toast.makeText(
getApplicationContext(),
getString(R.string.message_metadata_updated),
Toast.LENGTH_SHORT).show();
finish();
}
@Override
public void error(Throwable throwable) {
mProgressDialog.dismiss();
Toast.makeText(
getApplicationContext(),
getString(R.string.message_metadata_update_failed)
+ throwable.getMessage(),
Toast.LENGTH_SHORT).show();
}
}, channelJid);
}
});
}
else {
saveMetadataBtn.setEnabled(false);
}
}
@Override
protected void onResume() {
super.onResume();
ImageLoader.getInstance().resume();
}
@Override
protected void onStop() {
super.onStop();
ImageLoader.getInstance().stop();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
InputUtils.hideKeyboard(ChannelDetailActivity.this);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private ImageView loadAvatar(final String channelJid, boolean skipCache) {
ImageView avatarView = (ImageView) findViewById(R.id.bcProfilePic);
DisplayImageOptions dio = new DisplayImageOptions.Builder()
.cloneFrom(ImageHelper.defaultImageOptions())
.showImageOnFail(R.drawable.ic_avatar)
.showImageOnLoading(R.drawable.ic_avatar)
.preProcessor(ImageHelper.createRoundProcessor(16, false, -1))
.resetViewBeforeLoading(true)
.build();
String avatarURL = AvatarUtils.avatarURL(this, channelJid);
if (skipCache) {
DiscCacheUtil.removeFromCache(avatarURL, ImageLoader.getInstance()
.getDiscCache());
MemoryCacheUtil.removeFromCache(avatarURL, ImageLoader
.getInstance().getMemoryCache());
}
ImageLoader.getInstance().displayImage(avatarURL, avatarView, dio);
return avatarView;
}
private JSONObject createMetadataJSON() {
Map<String, String> metadata = new HashMap<String, String>();
metadata.put("title", getEditText(R.id.titleTxt));
metadata.put("description", getEditText(R.id.descriptionTxt));
metadata.put("access_model", ACCESS_MODELS.get(selectedAccessModel));
metadata.put("default_affiliation", ROLES.get(selectedRole));
return new JSONObject(metadata);
}
private String getEditText(int resId) {
return ((EditText) findViewById(resId)).getText().toString();
}
private void setSpinnerText(Spinner spinner,
List<String> values,
Integer[] valueDetails,
String selectedValue) {
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
this, R.layout.spinner_item_layout);
for (int pos=0; pos < valueDetails.length; pos++) {
adapter.add(getString(valueDetails[pos]));
}
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(values.indexOf(selectedValue));
}
private boolean fillFields(boolean editable, String channelJid) {
JSONObject metadata = ChannelMetadataModel.getInstance().getFromCache(
this, channelJid);
if (metadata == null) {
return false;
}
EditText titleTxt = (EditText) findViewById(R.id.titleTxt);
titleTxt.setText(metadata.optString("title"));
setEditable(editable, titleTxt);
EditText descriptionTxt = (EditText) findViewById(R.id.descriptionTxt);
descriptionTxt.setText(metadata.optString("description"));
setEditable(editable, descriptionTxt);
Spinner accessModelTxt = (Spinner) findViewById(R.id.accessModelTxt);
setSpinnerText(accessModelTxt, ACCESS_MODELS, ACCESS_MODELS_DETAILS, metadata.optString("accessModel"));
setSelectedAccessModel(ACCESS_MODELS.indexOf(metadata.optString("accessModel")));
accessModelTxt.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
setSelectedAccessModel(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
setEditable(editable, accessModelTxt);
TextView creationDateTxt = (TextView) findViewById(R.id.creationDateTxt);
try {
if (metadata != null && !TextUtils.isEmpty(metadata.optString("creationDate"))) {
long creationDateTime = TimeUtils.fromISOToDate(metadata.optString("creationDate")).getTime();
creationDateTxt.setText(
DateUtils.getRelativeTimeSpanString(creationDateTime,
new Date().getTime(), DateUtils.MINUTE_IN_MILLIS));
}
} catch (ParseException e) {
e.printStackTrace();
}
TextView channelTypeTxt = (TextView) findViewById(R.id.channelTypeTxt);
channelTypeTxt.setText(metadata.optString("channelType"));
Spinner defaultAffiliationTxt = (Spinner) findViewById(R.id.defaultAffiliationTxt);
setSpinnerText(defaultAffiliationTxt, ROLES, ROLE_DETAILS, metadata.optString("defaultAffiliation"));
setSelectedRole(ROLES.indexOf(metadata.optString("defaultAffiliation")));
defaultAffiliationTxt.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
setSelectedRole(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
setEditable(editable, defaultAffiliationTxt);
return true;
}
private void setEditable(boolean editable, EditText editText) {
if (!editable) {
editText.setKeyListener(null);
}
}
private void setEditable(boolean editable, Spinner spinner) {
if (!editable) {
spinner.setEnabled(false);
spinner.setClickable(false);
}
}
public int getSelectedRole() {
return selectedRole;
}
public int getSelectedAccessModel() {
return selectedAccessModel;
}
public void setSelectedRole(int selectedRole) {
this.selectedRole = selectedRole;
}
public void setSelectedAccessModel(int selectedAccessModel) {
this.selectedAccessModel = selectedAccessModel;
}
}