package com.jasonchen.microlang.activitys; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.jasonchen.microlang.R; import com.jasonchen.microlang.beans.AccountBean; import com.jasonchen.microlang.beans.FavBean; import com.jasonchen.microlang.beans.MessageBean; import com.jasonchen.microlang.dao.DestroyStatusDao; import com.jasonchen.microlang.dao.FavDao; import com.jasonchen.microlang.database.FriendsTimeLineDBTask; import com.jasonchen.microlang.debug.AppLogger; import com.jasonchen.microlang.exception.WeiboException; import com.jasonchen.microlang.fragments.WeiboDetailFragment; import com.jasonchen.microlang.swipeback.app.SwipeBackActivity; import com.jasonchen.microlang.tasks.MyAsyncTask; import com.jasonchen.microlang.utils.GlobalContext; import com.jasonchen.microlang.utils.Utility; import me.drakeet.materialdialog.MaterialDialog; /** * jasonchen * 2015/04/10 */ public class WeiboDetailActivity extends SwipeBackActivity{ private static final String ACTION_WITH_ID = "action_with_id"; private static final String ACTION_WITH_DETAIL = "action_with_detail"; private AccountBean accountBean; private MessageBean messageBean; private String messageId; private String token; private FavTask favTask; private UnFavTask unFavTask; private DestroyStatusTask deleteTask; public static Intent newIntent(Context context, AccountBean accountBean, String id, String token) { Intent intent = new Intent(context, WeiboDetailActivity.class); intent.putExtra("id", id); intent.putExtra("account", accountBean); intent.putExtra("token", token); intent.setAction(ACTION_WITH_ID); return intent; } public static Intent newIntent(Context context, AccountBean accountBean, MessageBean messageBean, String token){ Intent intent = new Intent(context, WeiboDetailActivity.class); intent.putExtra("token", token); intent.putExtra("account", accountBean); intent.putExtra("message", messageBean); intent.setAction(ACTION_WITH_DETAIL); return intent; } @Override public void onCreate(Bundle savedInstanceState) { mLayout = R.layout.activity_weibodetail; super.onCreate(savedInstanceState); initView(savedInstanceState); } private void initView(Bundle savedInstanceState) { getSupportActionBar().setTitle(getString(R.string.weibo_detail)); if (savedInstanceState != null) { accountBean = savedInstanceState.getParcelable("account"); messageBean = savedInstanceState.getParcelable("message"); token = savedInstanceState.getString("token"); if (messageBean != null) { buildContent(); } else { messageId = getIntent().getStringExtra("id"); fetchMessage(); } } else { String action = getIntent().getAction(); if (ACTION_WITH_ID.equalsIgnoreCase(action)) { token = getIntent().getStringExtra("token"); messageId = getIntent().getStringExtra("id"); accountBean = getIntent().getParcelableExtra("account"); } else if (ACTION_WITH_DETAIL.equalsIgnoreCase(action)) { Intent intent = getIntent(); token = intent.getStringExtra("token"); messageBean = intent.getParcelableExtra("message"); messageId = messageBean.getId(); accountBean = getIntent().getParcelableExtra("account"); } else { throw new IllegalArgumentException("activity intent action must be " + ACTION_WITH_DETAIL + " or " + ACTION_WITH_ID); } buildContent(); } } private void buildContent() { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { if (getSupportFragmentManager().findFragmentByTag(WeiboDetailFragment.class.getName()) == null) { getSupportFragmentManager() .beginTransaction() .replace(R.id.container, WeiboDetailFragment.newInstance(messageBean), WeiboDetailFragment.class.getName()) .commitAllowingStateLoss(); getSupportFragmentManager().executePendingTransactions(); findViewById(R.id.container).setBackgroundDrawable(null); } } }); } public Toolbar getToolbar(){ return mToolbar; } private void fetchMessage() { } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("message", messageBean); outState.putString("token", token); outState.putParcelable("account", accountBean); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (messageBean == null) { return super.onCreateOptionsMenu(menu); } getMenuInflater().inflate(R.menu.menu_activity_weibodetail, menu); if (messageBean.getUser() != null && messageBean.getUser().getId().equals(GlobalContext.getInstance().getCurrentAccountId())) { menu.findItem(R.id.menu_delete).setVisible(true); } if(messageBean.isFavorited()){ menu.findItem(R.id.menu_unfav).setVisible(true); }else{ menu.findItem(R.id.menu_fav).setVisible(true); } return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { if (messageBean == null) { return super.onPrepareOptionsMenu(menu); } if(messageBean.isFavorited()){ menu.findItem(R.id.menu_unfav).setVisible(true); menu.findItem(R.id.menu_fav).setVisible(false); }else{ menu.findItem(R.id.menu_unfav).setVisible(false); menu.findItem(R.id.menu_fav).setVisible(true); } return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; int itemId = item.getItemId(); if (itemId == R.id.menu_repost) { intent = WriteRepostActivity.newIntent(WeiboDetailActivity.this, accountBean, messageBean, token); startActivity(intent); return true; } else if (itemId == R.id.menu_comment) { intent = WriteCommentActivity.newIntent(WeiboDetailActivity.this, accountBean, messageBean, token); startActivity(intent); return true; } else if (itemId == R.id.menu_copy) { ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); cm.setPrimaryClip(ClipData.newPlainText("sinaweibo", messageBean.getText())); Toast.makeText(this, getString(R.string.copy_successfully), Toast.LENGTH_SHORT).show(); return true; } else if (itemId == R.id.menu_fav) { if (Utility.isTaskStopped(favTask) && Utility.isTaskStopped(unFavTask)) { favTask = new FavTask(WeiboDetailActivity.this); favTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } return true; } else if (itemId == R.id.menu_unfav) { if (Utility.isTaskStopped(favTask) && Utility.isTaskStopped(unFavTask)) { unFavTask = new UnFavTask(WeiboDetailActivity.this); unFavTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } return true; } else if (itemId == R.id.menu_delete) { final MaterialDialog deleteDialog = new MaterialDialog(WeiboDetailActivity.this); deleteDialog.setTitle(getString(R.string.notice)) .setMessage(getString(R.string.delete_status)) .setPositiveButton(getString(R.string.confirm), new View.OnClickListener() { @Override public void onClick(View view) { deleteDialog.dismiss(); if(Utility.isTaskStopped(deleteTask)){ deleteTask = new DestroyStatusTask(WeiboDetailActivity.this); deleteTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } }) .setNegativeButton(getString(R.string.cancel), new View.OnClickListener() { @Override public void onClick(View view) { deleteDialog.dismiss(); } }).show(); return true; } return false; } private class FavTask extends MyAsyncTask<Void, Void, FavBean> { FavBean favBean = null; Context context; WeiboException e; private FavTask(Context context) { this.context = context; } @Override protected FavBean doInBackground(Void... params) { FavDao dao = new FavDao(GlobalContext.getInstance().getSpecialToken(), messageBean.getId()); try { favBean = dao.favIt(); } catch (WeiboException e) { e.printStackTrace(); this.e = e; cancel(true); } return favBean; } @Override protected void onCancelled(FavBean favBean) { super.onCancelled(favBean); if (this.e != null) { Toast.makeText(GlobalContext.getInstance(), e.getError(), Toast.LENGTH_SHORT).show(); } } @Override protected void onPostExecute(FavBean favBean) { super.onPostExecute(favBean); if (favBean != null) { Toast.makeText(context, getResources().getString(R.string.favorite_success), Toast.LENGTH_SHORT).show(); messageBean.setFavorited(true); FriendsTimeLineDBTask.asyncUpdateMsg(messageBean.getId(), true); } } } private class UnFavTask extends MyAsyncTask<Void, Void, FavBean> { FavBean favBean = null; Context context; WeiboException e; private UnFavTask(Context context) { this.context = context; } @Override protected FavBean doInBackground(Void... params) { FavDao dao = new FavDao(GlobalContext.getInstance().getSpecialToken(), messageBean.getId()); try { favBean = dao.unFavIt(); } catch (WeiboException e) { e.printStackTrace(); this.e = e; cancel(true); return null; } return favBean; } @Override protected void onCancelled(FavBean favBean) { super.onCancelled(favBean); if (this.e != null) { Toast.makeText(GlobalContext.getInstance(), e.getError(), Toast.LENGTH_SHORT).show(); } } @Override protected void onPostExecute(FavBean favBean) { super.onPostExecute(favBean); if (favBean != null) { Toast.makeText(context, getResources().getString(R.string.unfavorite_success), Toast.LENGTH_SHORT).show(); messageBean.setFavorited(false); FriendsTimeLineDBTask.asyncUpdateMsg(messageBean.getId(), false); } } } private class DestroyStatusTask extends MyAsyncTask<Void, Void, DestroyResult> { boolean result; Context context; public DestroyStatusTask(Context context) { super(); this.context = context; } @Override protected DestroyResult doInBackground(Void... params) { DestroyStatusDao dao = new DestroyStatusDao(GlobalContext.getInstance().getSpecialToken(), messageId); try { result = dao.destroy(); } catch (WeiboException e) { e.printStackTrace(); } if (result) { return DestroyResult.success; } else { return DestroyResult.failed; } } @Override protected void onPostExecute(DestroyResult result) { super.onPostExecute(result); switch (result) { case success: Toast.makeText(context, getResources().getString(R.string.remove_successfully), Toast.LENGTH_SHORT).show(); FriendsTimeLineDBTask.deleteMsg(GlobalContext.getInstance() .getAccountBean().getUid(), messageId); break; case failed: Toast.makeText(context, getResources().getString(R.string.remove_fail), Toast.LENGTH_SHORT).show(); break; } } } public enum DestroyResult { success, failed } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if (getSupportFragmentManager().findFragmentByTag(WeiboDetailFragment.class.getName()) != null) { messageBean = ((WeiboDetailFragment) getSupportFragmentManager().findFragmentByTag(WeiboDetailFragment.class.getName())).getMessageBean(); Intent data = new Intent(); data.putExtra("msg", messageBean); AppLogger.d("评论数 " + messageBean.getCommentscountString()); setResult(1, data); } } return super.onKeyDown(keyCode, event); } }