package com.buddycloud.fragments; import org.json.JSONObject; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.text.Editable; import android.text.SpannableString; import android.text.TextWatcher; import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.buddycloud.ChannelDetailActivity; import com.buddycloud.CreateAccountActivity; import com.buddycloud.GenericChannelActivity; import com.buddycloud.MainActivity; import com.buddycloud.R; import com.buddycloud.SearchActivity; import com.buddycloud.SettingsActivity; import com.buddycloud.fragments.adapter.FindFriendsAdapter; import com.buddycloud.fragments.adapter.MostActiveChannelsAdapter; import com.buddycloud.fragments.adapter.RecommendedChannelsAdapter; import com.buddycloud.fragments.adapter.SubscribedChannelsAdapter; import com.buddycloud.model.ChannelMetadataModel; import com.buddycloud.model.ModelCallback; import com.buddycloud.model.ModelListener; import com.buddycloud.model.SubscribedChannelsModel; import com.buddycloud.model.SyncModel; import com.buddycloud.model.TopicChannelModel; import com.buddycloud.preferences.Preferences; import com.buddycloud.utils.AvatarUtils; import com.buddycloud.utils.ChannelAdapterHelper; import com.buddycloud.utils.TextUtils; import com.nostra13.universalimageloader.core.ImageLoader; public class SubscribedChannelsFragment extends ContentFragment implements ModelListener { private ExpandableListView channelListView; private SubscribedChannelsAdapter adapter = new SubscribedChannelsAdapter(); private GenericChannelsFragment genericChannelFrag = new GenericChannelsFragment(adapter) { @Override public void channelSelected(JSONObject channelItem) { selectChannel(channelItem.optString("jid")); } }; public SubscribedChannelsFragment() { TopicChannelModel.getInstance().setListener(this); SubscribedChannelsModel.getInstance().setListener(this); ModelListener notifyChangeListener = new ModelListener() { @Override public void dataChanged() { adapter.sort(getActivity()); adapter.notifyDataSetChanged(); // my personal channel header updateChannelPersonalHeader(); } @Override public void itemRemoved(String channelJid, String itemId, String parentId) { } @Override public void pendingItemAdded(String channelJid, JSONObject pendingItem) { } }; SyncModel.getInstance().setListener(notifyChangeListener); ChannelMetadataModel.getInstance().setListener(notifyChangeListener); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { adapter.load(getActivity()); final String channelJid = getMyChannelJid(); final View personalHeaderView = ChannelAdapterHelper.createChannelPersonalHeader(container.getContext(), null, container, channelJid); final View view = genericChannelFrag.onCreateView(inflater, container, savedInstanceState); channelListView = (ExpandableListView) view.findViewById(R.id.channelListView); channelListView.addHeaderView(personalHeaderView); // update personal channel counters updateChannelPersonalHeader(); return view; } /** * Update the personal channel header information * such as (@mention, @replies, @views) */ private void updateChannelPersonalHeader() { if (channelListView == null) return ; final String channelJid = getMyChannelJid(); JSONObject allCounters = SyncModel.getInstance().getFromCache(getActivity(), channelJid); JSONObject counters = allCounters.optJSONObject(channelJid); Integer mentionsCount = (counters != null && counters.has("mentionsCount")) ? counters.optInt("mentionsCount") : 0; Integer replyCount = (counters != null && counters.has("replyCount")) ? counters.optInt("replyCount") : 0; Integer visitCount = (counters != null && counters.has("visitCount")) ? counters.optInt("visitCount") : 0; final String counts = String.format(getString(R.string.channel_list_counts_formatted_txt), mentionsCount, replyCount, visitCount); SpannableString boldSpan = new SpannableString(counts); boldSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, counts.indexOf("Mentions") - 1, 0); boldSpan.setSpan(new StyleSpan(Typeface.BOLD), counts.indexOf("|") + 1, counts.indexOf("Replies") - 1, 0); boldSpan.setSpan(new StyleSpan(Typeface.BOLD), counts.lastIndexOf("|") + 1, counts.indexOf("Views") - 1, 0); final TextView notifCount = (TextView)channelListView.findViewById(R.id.bcUserNotifCounts); notifCount.setText(boldSpan); final String avatarURL = AvatarUtils.avatarURL(getActivity(), channelJid); final ImageView avatar = (ImageView)channelListView.findViewById(R.id.bcProfilePic); avatar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getActivity(), ChannelDetailActivity.class); intent.putExtra(GenericChannelsFragment.CHANNEL, getMyChannelJid()); intent.putExtra(SubscribedChannelsModel.ROLE, getRole()); getActivity().startActivity(intent); } }); ImageLoader.getInstance().displayImage(avatarURL, avatar); } private String getMyChannelJid() { return Preferences.getPreference(getActivity(), Preferences.MY_CHANNEL_JID); } private String getRole() { JSONObject subscribed = SubscribedChannelsModel.getInstance().getFromCache(getActivity()); if (!subscribed.has(getMyChannelJid())) { return null; } return subscribed.optString(getMyChannelJid()); } private void selectChannel(String channelJid) { showChannelFragment(channelJid); hideMenu(); } private void hideMenu() { SlidingFragmentActivity activity = (SlidingFragmentActivity) getActivity(); if (activity.getSlidingMenu().isMenuShowing()) { activity.getSlidingMenu().showContent(); } } private void showChannelFragment(String channelJid) { MainActivity activity = (MainActivity) getActivity(); activity.getBackStack().clear(); activity.showChannelFragment(channelJid, true, true); } @Override public void attached(Activity activity) { SherlockFragmentActivity sherlockActivity = (SherlockFragmentActivity) activity; sherlockActivity.getSupportActionBar().setTitle(R.string.app_name); } @Override public void createOptions(Menu menu) { getSherlockActivity().getSupportMenuInflater().inflate( R.menu.subscribed_fragment_options, menu); } @Override public boolean menuItemSelected(int featureId, MenuItem item) { if (item.getItemId() == R.id.menu_search) { Intent searchActivityIntent = new Intent(); searchActivityIntent.setClass(getActivity(), SearchActivity.class); getActivity().startActivityForResult( searchActivityIntent, SearchActivity.REQUEST_CODE); return true; } else if (item.getItemId() == R.id.menu_find_active) { showGenericActivity(MostActiveChannelsAdapter.ADAPTER_NAME); return true; } else if (item.getItemId() == R.id.menu_find_recommended) { showGenericActivity(RecommendedChannelsAdapter.ADAPTER_NAME); return true; } else if (item.getItemId() == R.id.menu_create_channel) { createNewTopicChannel(); return true; } else if (item.getItemId() == R.id.menu_find_friends) { showGenericActivity(FindFriendsAdapter.ADAPTER_NAME); return true; } else if (item.getItemId() == R.id.menu_settings) { Intent settingsActivityIntent = new Intent(); settingsActivityIntent.setClass(getActivity(), SettingsActivity.class); getActivity().startActivityForResult( settingsActivityIntent, SettingsActivity.REQUEST_CODE); return true; } return false; } private void createNewTopicChannel() { final View view = LayoutInflater.from(getActivity()).inflate(R.layout.topic_channel_create, null); if (view == null) return; AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.setTitle(getString(R.string.title_topic_channel_create)); alert.setView(view); final EditText channelTopicTxt = (EditText)view.findViewById(R.id.topicChannelTxt); channelTopicTxt.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { if (s.length() == 0) { channelTopicTxt.setError(getString(R.string.message_topic_channel_manadatory)); } else if (s.toString().contains("@") || s.toString().contains(" ")) { channelTopicTxt.setError(getString(R.string.message_topic_channel_invalid)); } } }); final TextView topicChannelJidTxt = (TextView)view.findViewById(R.id.topicChannelJidTxt); topicChannelJidTxt.setText(String.format(getString(R.string.topic_channel_domain_hint), CreateAccountActivity.BUDDYCLOUD_DOMAIN)); alert.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String channelJid = channelTopicTxt.getText().toString(); if (TextUtils.isEmpty(channelJid)) { channelTopicTxt.setError(getString(R.string.message_topic_channel_manadatory)); return ; } channelJid = channelJid + "@" + CreateAccountActivity.BUDDYCLOUD_DOMAIN; TopicChannelModel.getInstance().save(getActivity(), null, new ModelCallback<Void>() { @Override public void success(Void response) { Toast.makeText(getActivity(), getString(R.string.message_topic_channel_create), Toast.LENGTH_LONG).show(); } @Override public void error(Throwable throwable) { Toast.makeText(getActivity(), getString(R.string.message_topic_channel_creation_failed), Toast.LENGTH_LONG).show(); } }, channelJid); } }); alert.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); } private void showGenericActivity(String adapterName) { Intent intent = new Intent(); intent.setClass(getActivity(), GenericChannelActivity.class); intent.putExtra(GenericChannelActivity.ADAPTER_NAME, adapterName); getActivity().startActivityForResult( intent, GenericChannelActivity.REQUEST_CODE); } @Override public void dataChanged() { adapter.reload(getActivity()); } @Override public void itemRemoved(String channelJid, String itemId, String parentId) { } @Override public void pendingItemAdded(String channelJid, JSONObject pendingItem) { // TODO Auto-generated method stub } }