package com.mcxiaoke.minicat.app; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.mcxiaoke.minicat.AppContext; import com.mcxiaoke.minicat.R; import com.mcxiaoke.minicat.controller.CacheController; import com.mcxiaoke.minicat.controller.EmptyViewController; import com.mcxiaoke.minicat.controller.UIController; import com.mcxiaoke.minicat.dao.model.StatusModel; import com.mcxiaoke.minicat.service.SyncService; import com.mcxiaoke.minicat.task.BetterAsyncTask; import com.mcxiaoke.minicat.util.DateTimeHelper; import com.mcxiaoke.minicat.util.IOHelper; import com.mcxiaoke.minicat.util.IntentHelper; import com.mcxiaoke.minicat.util.LogUtil; import com.mcxiaoke.minicat.util.StatusHelper; import com.mcxiaoke.minicat.util.Utils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; import pl.droidsonroids.gif.GifDrawable; import pl.droidsonroids.gif.GifImageView; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; /** * @author mcxiaoke * @version 5.0 2012.03.13 */ public class UIStatus extends UIBaseSupport { public static final String MY_TAG = UIStatus.class.getSimpleName(); public static final DisplayImageOptions DISPLAY_OPTIONS = new DisplayImageOptions.Builder() .cacheOnDisc(true).cacheInMemory(true) .showImageOnLoading(R.drawable.photo_loading) .showImageOnFail(R.drawable.photo_error) .showImageForEmptyUri(R.drawable.photo_error). imageScaleType(ImageScaleType.IN_SAMPLE_INT) .bitmapConfig(Bitmap.Config.RGB_565).build(); private static final String TAG = UIStatus.class.getSimpleName(); private View vContainer; private String statusId; private StatusModel status; private View vHeader; private ImageView headerImage; private TextView headerName; private TextView headerId; private TextView contentText; private ViewGroup contentPhoto; private ImageView imageView; private GifImageView gifView; private TextView contentMetaInfo; private ImageButton imThread; private ImageButton imReply; private ImageButton imRepost; private ImageButton imFavorite; private ImageButton imShare; private View vEmpty; private EmptyViewController emptyController; private boolean isMe; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); parseIntent(); setLayout(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_copy) { doCopy(); return true; } else if (item.getItemId() == R.id.menu_web) { IntentHelper.startWebIntent(this, "http://fanfou.com/statuses/" + status.getId()); return true; } return super.onOptionsItemSelected(item); } @Override protected int getMenuResourceId() { return R.menu.menu_status; } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.action_reply: if (isMe) { doDelete(); } else { UIController.doReply(mContext, status); } break; case R.id.action_retweet: UIController.doRetweet(mContext, status); break; case R.id.action_favorite: doFavorite(); break; case R.id.action_share: UIController.doShare(mContext, status); break; case R.id.header: UIController.showProfile(mContext, status.getUserId()); break; case R.id.content_photo: goPhotoViewer(); break; case R.id.thread_title: UIController.showThread(mContext, status.getId()); break; default: break; } } @Override protected void onNewIntent(Intent intent) { setIntent(intent); parseIntent(); updateUI(); } private void updateFavoriteAction(boolean favorited) { imFavorite.setImageLevel(favorited ? 1 : 0); } private void updateReplyAction() { imReply.setImageResource(isMe ? R.drawable.ic_delete : R.drawable.ic_reply); } private void parseIntent() { Intent intent = getIntent(); statusId = intent.getStringExtra("id"); status = intent.getParcelableExtra("data"); if (status != null) { statusId = status.getId(); } else { status = CacheController.getStatusAndCache(statusId, mContext); } // LogUtil.v(MY_TAG, "status:" + status); } protected void setLayout() { setContentView(R.layout.ui_status); setProgressBarIndeterminateVisibility(false); setTitle("消息"); findViews(); setEmptyView(); setListeners(); updateUI(); } private void findViews() { vContainer = findViewById(R.id.container); vEmpty = findViewById(android.R.id.empty); vHeader = findViewById(R.id.header); headerImage = (ImageView) findViewById(R.id.header_image); headerName = (TextView) findViewById(R.id.header_name); headerId = (TextView) findViewById(R.id.header_id); findViewById(R.id.header_follow).setVisibility(View.GONE); findViewById(R.id.header_album).setVisibility(View.GONE); contentText = (TextView) findViewById(R.id.content_text); contentPhoto = (ViewGroup) findViewById(R.id.content_photo); imageView = (ImageView) findViewById(R.id.image); gifView = (GifImageView) findViewById(R.id.gif); contentMetaInfo = (TextView) findViewById(R.id.content_metainfo); imThread = (ImageButton) findViewById(R.id.thread_title); imReply = (ImageButton) findViewById(R.id.action_reply); imRepost = (ImageButton) findViewById(R.id.action_retweet); imFavorite = (ImageButton) findViewById(R.id.action_favorite); imShare = (ImageButton) findViewById(R.id.action_share); } private void setEmptyView() { emptyController = new EmptyViewController(vEmpty); if (status == null) { fetchStatus(); showProgress(); } else { showContent(); } } private void showEmptyView(String text) { vContainer.setVisibility(View.GONE); emptyController.showEmpty(text); } private void showProgress() { vContainer.setVisibility(View.GONE); emptyController.showProgress(); if (AppContext.DEBUG) { Log.d(TAG, "showProgress"); } } private void showContent() { emptyController.hideProgress(); vContainer.setVisibility(View.VISIBLE); if (AppContext.DEBUG) { Log.d(TAG, "showContent"); } } private void setListeners() { vHeader.setOnClickListener(this); contentPhoto.setOnClickListener(this); imThread.setOnClickListener(this); imReply.setOnClickListener(this); imRepost.setOnClickListener(this); imFavorite.setOnClickListener(this); imShare.setOnClickListener(this); } private void updateUI(StatusModel model) { if (model != null) { status = model; } updateUI(); } private void updateUI() { if (status == null) { return; } isMe = status.getUserId().equals(AppContext.getAccount()); showContent(); updateHeader(); updateContent(); updateActions(); updatePhoto(); updateThread(); } private void updateHeader() { headerName.setText(status.getUserScreenName()); headerId.setText("@" + status.getUserId()); String headerImageUrl = status.getUserProfileImageUrl(); ImageLoader.getInstance().displayImage(headerImageUrl, headerImage); } private void updateContent() { StatusHelper.setStatus(contentText, status.getText()); StringBuilder sb = new StringBuilder(); sb.append(DateTimeHelper.formatDate(status.getTime())).append(" 通过") .append(status.getSource()); contentMetaInfo.setText(sb.toString()); } private void updateActions() { updateReplyAction(); updateFavoriteAction(status.isFavorited()); } private void updatePhoto() { if (!status.isPhoto()) { contentPhoto.setVisibility(View.GONE); return; } contentPhoto.setVisibility(View.VISIBLE); imageView.setVisibility(View.VISIBLE); gifView.setVisibility(View.GONE); String photoUrl = status.getPhotoLargeUrl().split("@")[0]; loadBigImage(photoUrl); } private void updateThread() { imThread.setVisibility(status.isThread() ? View.VISIBLE : View.GONE); } private void loadBigImage(final String imageUri) { ImageLoader.getInstance().loadImage(imageUri, DISPLAY_OPTIONS, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(final String imageUri, final View view, final Bitmap loadedImage) { showPhoto(imageUri, loadedImage); } @Override public void onLoadingFailed(final String imageUri, final View view, final FailReason failReason) { gifView.setVisibility(View.GONE); imageView.setVisibility(View.VISIBLE); imageView.setImageResource(R.drawable.photo_error); } }); } private void showPhoto(String imageUri, Bitmap bitmap) { if (bitmap == null) { return; } if (imageUri.endsWith(".gif")) { imageView.setVisibility(View.GONE); gifView.setVisibility(View.VISIBLE); try { final File file = ImageLoader.getInstance().getDiscCache().get(imageUri); final GifDrawable drawable = new GifDrawable(file); gifView.setImageDrawable(drawable); } catch (IOException e) { gifView.setVisibility(View.GONE); imageView.setVisibility(View.VISIBLE); imageView.setImageResource(R.drawable.photo_error); } } else { gifView.setVisibility(View.GONE); imageView.setVisibility(View.VISIBLE); imageView.setImageBitmap(bitmap); } } private void goPhotoViewer() { String photoUrl = status.getPhotoLargeUrl(); if (!TextUtils.isEmpty(photoUrl)) { if (AppContext.DEBUG) { Log.d(TAG, "goPhotoViewer() url=" + photoUrl); } UIController.showPhoto(mContext, photoUrl); } } private void fetchStatus() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case SyncService.RESULT_SUCCESS: StatusModel result = msg.getData().getParcelable("data"); onFetchStatusComplete(result); break; case SyncService.RESULT_ERROR: String errorMessage = msg.getData().getString( "error_message"); onFetchStatusError(errorMessage); break; default: break; } } }; if (AppContext.DEBUG) { Log.d(TAG, "fetchStatus"); } SyncService.showStatus(mContext, statusId, handler); } private void onDeleteComplete() { Utils.notify(mContext, "删除成功"); finish(); } private void onDeleteError(String message) { Utils.notify(mContext, message); } private void doDelete() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { int what = msg.what; switch (what) { case SyncService.RESULT_SUCCESS: onDeleteComplete(); break; case SyncService.RESULT_ERROR: int code = msg.getData().getInt("error_code"); String message = msg.getData().getString("error_message"); if (code == HttpURLConnection.HTTP_NOT_FOUND) { onDeleteComplete(); } else { onDeleteError(message); } break; default: break; } } }; final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("删除消息"); builder.setMessage("确定要删除这条消息吗?"); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); SyncService.deleteStatus(mContext, status.getId(), handler); } }); builder.create().show(); } private void onFavoriteComplete(boolean favorited) { if (AppContext.DEBUG) { LogUtil.v(TAG, "onFavoriteComplete() favorited=" + favorited); } status.setFavorited(favorited); updateFavoriteAction(status.isFavorited()); Utils.notify(mContext, favorited ? "收藏成功" : "取消收藏成功"); } private void onFavoriteError(String message) { } private void doFavorite() { final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case SyncService.RESULT_SUCCESS: boolean favorited = msg.getData().getBoolean("boolean"); onFavoriteComplete(favorited); break; case SyncService.RESULT_ERROR: onFavoriteError(null); break; default: break; } } }; updateFavoriteAction(!status.isFavorited()); if (AppContext.DEBUG) { LogUtil.v(TAG, "doFavorite() current=" + status.isFavorited()); } if (status.isFavorited()) { SyncService.unfavorite(mContext, status.getId(), handler); } else { SyncService.favorite(mContext, status.getId(), handler); } } private void doCopy() { if (status != null) { IOHelper.copyToClipBoard(this, status.getText()); Utils.notify(this, "消息内容已复制到剪贴板"); } } private void onFetchStatusComplete(StatusModel model) { updateUI(model); } private void onFetchStatusError(String message) { showEmptyView(message); } private class FetchStatusTask extends BetterAsyncTask<String, Void, StatusModel> { public FetchStatusTask(Context context) { super(context); } @Override protected void onPrepare(Context context) { } @Override protected void onPost(Context context, StatusModel result) { onFetchStatusComplete(result); } @Override protected void onError(Context context, Exception exception) { onFetchStatusError(exception.getMessage()); } @Override protected StatusModel run(String... params) throws Exception { return AppContext.getApi().showStatus(params[0]); } } }