package com.shejiaomao.weibo.service.listener;
import java.io.File;
import com.cattong.commons.util.StringUtil;
import com.cattong.entity.Status;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.text.ClipboardManager;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.shejiaomao.maobo.R;
import com.shejiaomao.weibo.activity.EditCommentActivity;
import com.shejiaomao.weibo.activity.EditMicroBlogActivity;
import com.shejiaomao.weibo.activity.MicroBlogActivity;
import com.shejiaomao.weibo.activity.ProfileActivity;
import com.shejiaomao.weibo.common.Constants;
import com.shejiaomao.weibo.common.EntityUtil;
import com.shejiaomao.weibo.db.LocalAccount;
import com.shejiaomao.weibo.db.LocalStatus;
import com.shejiaomao.weibo.service.adapter.AdapterUtil;
import com.shejiaomao.weibo.service.adapter.CacheAdapter;
import com.shejiaomao.weibo.service.adapter.StatusUtil;
import com.shejiaomao.weibo.service.cache.ImageCache;
import com.shejiaomao.weibo.service.cache.wrap.CachedImageKey;
import com.shejiaomao.weibo.service.task.DestroyStatusTask;
import com.shejiaomao.weibo.service.task.ToggleFavoriteTask;
public class MicroBlogContextMenuListener implements
OnCreateContextMenuListener {
private ListView lvMicroBlog;
private LocalAccount account;
private View targetView;
private int position;
public MicroBlogContextMenuListener(ListView lvMicroBlog) {
this.lvMicroBlog = lvMicroBlog;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Adapter adapter = lvMicroBlog.getAdapter();
this.position = info.position;
targetView = info.targetView;
Status status= (Status)adapter.getItem(position);
if (status == null
|| (status instanceof LocalStatus
&& ((LocalStatus)status).isDivider())) {
return;
}
Context context = v.getContext();
analyzeStatusMenu(adapter, status, menu, context);
}
private void analyzeStatusMenu(final Adapter adapter, final Status status, ContextMenu menu, final Context context) {
//menu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, outSpecificItems)
menu.setHeaderTitle(R.string.menu_title_blog);
int order = 0;
MenuItem commentMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_COMMENT, order++, R.string.menu_blog_comment);
Intent commentIntent = new Intent(context, EditCommentActivity.class);
commentIntent.putExtra("TYPE", Constants.EDIT_TYPE_COMMENT);
commentIntent.putExtra("STATUS", status);
commentMenu.setIntent(commentIntent);
MenuItem retweetMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_RETWEET, order++, R.string.menu_blog_retweet);
retweetMenu.setOnMenuItemClickListener(new MicroBlogRetweetClickListener(context, status));
MenuItem favoriteMenu = null;
if (status.isFavorited()) {
favoriteMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_FAVORITE, order++, R.string.menu_blog_favorite_cancel);
} else {
favoriteMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_FAVORITE, order++, R.string.menu_blog_favorite);
}
favoriteMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ToggleFavoriteTask task = new ToggleFavoriteTask(context, status, targetView);
task.execute();
return false;
}
});
account = getAccount(adapter);
if (account != null
&& account.getUser() != null
&& account.getUser().equals(status.getUser())) {
MenuItem deleteMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_DELETE, order++, R.string.menu_blog_delete);
deleteMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
CacheAdapter<Status> cacheAdapter = (CacheAdapter<Status>)AdapterUtil.getCacheAdapter(adapter);
new DestroyStatusTask(cacheAdapter, status).execute();
return false;
}
});
}
MenuItem userMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_PERSONAL, order++, R.string.menu_blog_personal);
Intent userIntent = new Intent(context, ProfileActivity.class);
userIntent.putExtra("USER", status.getUser());
userMenu.setIntent(userIntent);
final Status retweet = status.getRetweetedStatus();
if (retweet != null) {
MenuItem retweetOriginMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_RETWEET_ORIGIN,
order++, R.string.menu_blog_retweet_origin);
retweetOriginMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
StatusUtil.retweet(context, retweet);
return false;
}
});
}
if (retweet != null) {
MenuItem commentOriginMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_COMMENT_ORIGIN,
order++, R.string.menu_blog_comment_origin);
Intent commentOriginIntent = new Intent(context, EditCommentActivity.class);
commentOriginIntent.putExtra("TYPE", Constants.EDIT_TYPE_COMMENT);
commentOriginIntent.putExtra("STATUS", retweet);
commentOriginMenu.setIntent(commentOriginIntent);
}
if (retweet != null) {
MenuItem showOriginMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_SHOW_ORIGIN,
order++, R.string.menu_blog_show_origin);
Intent showOriginIntent = new Intent(context, MicroBlogActivity.class);
showOriginIntent.putExtra("STATUS", retweet);
showOriginMenu.setIntent(showOriginIntent);
}
MenuItem shareToAccountsMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_SHARE_TO_ACCOUNTS, order++, R.string.menu_blog_share_to_accounts);
shareToAccountsMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClass(context, EditMicroBlogActivity.class);
if (EntityUtil.hasPicture(status)) {
intent.setType("image/*");
CachedImageKey info = EntityUtil.getMaxLocalCachedImageInfo(status);
String imagePath = ImageCache.getRealPath(info);
if (StringUtil.isNotEmpty(imagePath)) {
if (info.getCacheType() == CachedImageKey.IMAGE_THUMBNAIL) {
Toast.makeText(
context,
context.getString(R.string.msg_blog_share_picture_thumbnail),
Toast.LENGTH_LONG
).show();
}
Uri uri = Uri.fromFile(new File(imagePath));
intent.putExtra(Intent.EXTRA_STREAM, uri);
} else {
intent.setType("text/plain");
Toast.makeText(context, context.getString(R.string.msg_blog_share_picture), Toast.LENGTH_LONG).show();
}
} else {
intent.setType("text/plain");
}
ClipboardManager clip = (ClipboardManager)context
.getSystemService(Context.CLIPBOARD_SERVICE);
String statusText = StatusUtil.extraSimpleStatus(context, status);
clip.setText(statusText);
intent.putExtra(Intent.EXTRA_TEXT, statusText);
intent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.msg_extra_subject));
context.startActivity(intent);
return false;
}
});
MenuItem copyMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_COPY, order++, R.string.menu_blog_copy);
copyMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ClipboardManager clip = (ClipboardManager)context
.getSystemService(Context.CLIPBOARD_SERVICE);
String statusText = StatusUtil.extraSimpleStatus(context, status);
clip.setText(statusText);
Toast.makeText(context, R.string.msg_blog_copy, Toast.LENGTH_SHORT).show();
return false;
}
});
MenuItem shareMenu = menu.add(0, Constants.CONTEXT_MENU_BLOG_SHARE, order++, R.string.menu_blog_share);
shareMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
if (EntityUtil.hasPicture(status)) {
intent.setType("image/*");
CachedImageKey info = EntityUtil.getMaxLocalCachedImageInfo(status);
String imagePath = ImageCache.getRealPath(info);
if (StringUtil.isNotEmpty(imagePath)) {
if (info.getCacheType() == CachedImageKey.IMAGE_THUMBNAIL) {
Toast.makeText(
context,
context.getString(R.string.msg_blog_share_picture_thumbnail),
Toast.LENGTH_LONG
).show();
}
Uri uri = Uri.fromFile(new File(imagePath));
intent.putExtra(Intent.EXTRA_STREAM, uri);
} else {
intent.setType("text/plain");
Toast.makeText(context, context.getString(R.string.msg_blog_share_picture), Toast.LENGTH_LONG).show();
}
} else {
intent.setType("text/plain");
}
ClipboardManager clip = (ClipboardManager)context
.getSystemService(Context.CLIPBOARD_SERVICE);
String statusText = StatusUtil.extraRichStatus(context, status);
clip.setText(statusText);
intent.putExtra(Intent.EXTRA_TEXT, statusText);
intent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.msg_extra_subject));
context.startActivity(intent);
return false;
}
});
}
private LocalAccount getAccount(Adapter adapter) {
LocalAccount account = null;
CacheAdapter<?> cacheAdapter = AdapterUtil.getCacheAdapter(adapter);
if (cacheAdapter != null) {
account = cacheAdapter.getAccount();
}
return account;
}
}