package net.dev123.yibo.service.listener; import java.io.File; import net.dev123.commons.util.StringUtil; import net.dev123.mblog.entity.Status; import net.dev123.yibo.EditCommentActivity; import net.dev123.yibo.EditMicroBlogActivity; import net.dev123.yibo.MicroBlogActivity; import net.dev123.yibo.ProfileActivity; import net.dev123.yibo.R; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.EntityUtil; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.db.LocalStatus; import net.dev123.yibo.service.adapter.AdapterUtil; import net.dev123.yibo.service.adapter.CacheAdapter; import net.dev123.yibo.service.adapter.StatusUtil; import net.dev123.yibo.service.cache.ImageCache; import net.dev123.yibo.service.cache.wrap.CachedImageKey; import net.dev123.yibo.service.task.DestroyStatusTask; import net.dev123.yibo.service.task.ToggleFavoriteTask; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.text.ClipboardManager; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.view.View.OnCreateContextMenuListener; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; 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 && status.getUser().equals(account.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; } }