package org.qii.weiciyuan.ui.browser; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.MessageBean; import org.qii.weiciyuan.bean.android.AsyncTaskLoaderResult; import org.qii.weiciyuan.dao.destroy.DestroyStatusDao; import org.qii.weiciyuan.dao.show.ShowStatusDao; import org.qii.weiciyuan.support.error.WeiboException; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.ThemeUtility; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.ui.common.CommonErrorDialogFragment; import org.qii.weiciyuan.ui.common.CommonProgressDialogFragment; import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity; import org.qii.weiciyuan.ui.loader.AbstractAsyncNetRequestTaskLoader; import org.qii.weiciyuan.ui.main.MainTimeLineActivity; import org.qii.weiciyuan.ui.send.WriteCommentActivity; import org.qii.weiciyuan.ui.send.WriteRepostActivity; import org.qii.weiciyuan.ui.task.FavAsyncTask; import org.qii.weiciyuan.ui.task.UnFavAsyncTask; 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.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.view.GestureDetector; import android.view.Menu; import android.view.MenuItem; import android.widget.ShareActionProvider; import android.widget.Toast; /** * User: Jiang Qi * Date: 12-8-1 */ public class BrowserWeiboMsgActivity extends AbstractAppActivity implements RemoveWeiboMsgDialog.IRemove { private static final String ACTION_WITH_ID = "action_with_id"; private static final String ACTION_WITH_DETAIL = "action_with_detail"; private static final int REFRESH_LOADER_ID = 0; private MessageBean msg; private String msgId; private String token; private FavAsyncTask favTask = null; private UnFavAsyncTask unFavTask = null; private RemoveTask removeTask; private ShareActionProvider shareActionProvider; private GestureDetector gestureDetector; public static Intent newIntent(String weiboId, String token) { Intent intent = new Intent(GlobalContext.getInstance(), BrowserWeiboMsgActivity.class); intent.putExtra("weiboId", weiboId); intent.putExtra("token", token); intent.setAction(ACTION_WITH_ID); return intent; } public static Intent newIntent(MessageBean msg, String token) { Intent intent = new Intent(GlobalContext.getInstance(), BrowserWeiboMsgActivity.class); intent.putExtra("msg", msg); intent.putExtra("token", token); intent.setAction(ACTION_WITH_DETAIL); return intent; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("msg", msg); outState.putString("token", token); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initLayout(); if (savedInstanceState != null) { msg = savedInstanceState.getParcelable("msg"); token = savedInstanceState.getString("token"); if (msg != null) { buildContent(); } else { msgId = getIntent().getStringExtra("weiboId"); fetchUserInfoFromServer(); } } else { String action = getIntent().getAction(); if (ACTION_WITH_ID.equalsIgnoreCase(action)) { token = getIntent().getStringExtra("token"); msgId = getIntent().getStringExtra("weiboId"); fetchUserInfoFromServer(); findViewById(android.R.id.content).setBackgroundDrawable( ThemeUtility.getDrawable(android.R.attr.windowBackground)); } else if (ACTION_WITH_DETAIL.equalsIgnoreCase(action)) { Intent intent = getIntent(); token = intent.getStringExtra("token"); msg = intent.getParcelableExtra("msg"); buildContent(); } else { throw new IllegalArgumentException( "activity intent action must be " + ACTION_WITH_DETAIL + " or " + ACTION_WITH_ID); } } } @Override protected void onDestroy() { super.onDestroy(); Utility.cancelTasks(removeTask); } private void fetchUserInfoFromServer() { getActionBar().setTitle(getString(R.string.fetching_weibo_info)); CommonProgressDialogFragment dialog = CommonProgressDialogFragment .newInstance(getString(R.string.fetching_weibo_info)); getSupportFragmentManager().beginTransaction() .add(dialog, CommonProgressDialogFragment.class.getName()).commit(); getSupportLoaderManager().initLoader(REFRESH_LOADER_ID, null, refreshCallback); } private void initLayout() { getWindow().setBackgroundDrawable(getResources().getDrawable(R.color.transparent)); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setDisplayShowHomeEnabled(false); } private void buildContent() { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { if (getSupportFragmentManager() .findFragmentByTag(BrowserWeiboMsgFragment.class.getName()) == null) { getSupportFragmentManager().beginTransaction() .replace(android.R.id.content, BrowserWeiboMsgFragment.newInstance(msg), BrowserWeiboMsgFragment.class.getName()) .commitAllowingStateLoss(); getSupportFragmentManager().executePendingTransactions(); findViewById(android.R.id.content).setBackgroundDrawable(null); } } }); getActionBar().setTitle(getString(R.string.detail)); invalidateOptionsMenu(); } private Fragment getBrowserWeiboMsgFragment() { return getSupportFragmentManager() .findFragmentByTag(BrowserWeiboMsgFragment.class.getName()); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (msg == null) { return super.onCreateOptionsMenu(menu); } getMenuInflater().inflate(R.menu.actionbar_menu_browserweibomsgactivity, menu); if (msg.getUser() != null && msg.getUser().getId() .equals(GlobalContext.getInstance().getCurrentAccountId())) { menu.findItem(R.id.menu_delete).setVisible(true); } MenuItem item = menu.findItem(R.id.menu_share); shareActionProvider = (ShareActionProvider) item.getActionProvider(); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent intent = MainTimeLineActivity.newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); return true; case R.id.menu_repost: intent = new Intent(this, WriteRepostActivity.class); intent.putExtra("token", getToken()); intent.putExtra("id", getMsg().getId()); intent.putExtra("msg", getMsg()); startActivity(intent); return true; case R.id.menu_comment: intent = new Intent(this, WriteCommentActivity.class); intent.putExtra("token", getToken()); intent.putExtra("id", getMsg().getId()); intent.putExtra("msg", getMsg()); startActivity(intent); return true; case R.id.menu_share: buildShareActionMenu(); return true; case R.id.menu_copy: ClipboardManager cm = (ClipboardManager) getSystemService( Context.CLIPBOARD_SERVICE); cm.setPrimaryClip(ClipData.newPlainText("sinaweibo", getMsg().getText())); Toast.makeText(this, getString(R.string.copy_successfully), Toast.LENGTH_SHORT) .show(); return true; case R.id.menu_fav: if (Utility.isTaskStopped(favTask) && Utility.isTaskStopped(unFavTask)) { favTask = new FavAsyncTask(getToken(), msg.getId()); favTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } return true; case R.id.menu_unfav: if (Utility.isTaskStopped(favTask) && Utility.isTaskStopped(unFavTask)) { unFavTask = new UnFavAsyncTask(getToken(), msg.getId()); unFavTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } return true; case R.id.menu_delete: RemoveWeiboMsgDialog dialog = new RemoveWeiboMsgDialog(msg.getId()); dialog.show(getFragmentManager(), ""); return true; } return false; } private void buildShareActionMenu() { Utility.setShareIntent(BrowserWeiboMsgActivity.this, shareActionProvider, msg); } @Override public void removeMsg(String id) { if (Utility.isTaskStopped(removeTask)) { removeTask = new RemoveTask(id); removeTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } public void updateCommentCount(int count) { msg.setComments_count(count); Intent intent = new Intent(); intent.putExtra("msg", msg); setResult(0, intent); } public void updateRepostCount(int count) { msg.setReposts_count(count); Intent intent = new Intent(); intent.putExtra("msg", msg); setResult(0, intent); } public String getToken() { return token; } public MessageBean getMsg() { return msg; } class RemoveTask extends MyAsyncTask<Void, Void, Boolean> { String id; WeiboException e; public RemoveTask(String id) { this.id = id; } @Override protected Boolean doInBackground(Void... params) { DestroyStatusDao dao = new DestroyStatusDao(token, id); try { return dao.destroy(); } catch (WeiboException e) { this.e = e; cancel(true); return false; } } @Override protected void onCancelled(Boolean aBoolean) { super.onCancelled(aBoolean); if (this.e != null) { Toast.makeText(BrowserWeiboMsgActivity.this, e.getError(), Toast.LENGTH_SHORT) .show(); } } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); if (aBoolean) { finish(); } } } private static class RefreshLoader extends AbstractAsyncNetRequestTaskLoader<MessageBean> { private String msgId; public RefreshLoader(Context context, String msgId) { super(context); this.msgId = msgId; } @Override protected MessageBean loadData() throws WeiboException { return new ShowStatusDao(GlobalContext.getInstance().getSpecialToken(), msgId).getMsg(); } } private LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<MessageBean>> refreshCallback = new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<MessageBean>>() { @Override public Loader<AsyncTaskLoaderResult<MessageBean>> onCreateLoader(int id, Bundle args) { return new RefreshLoader(BrowserWeiboMsgActivity.this, msgId); } @Override public void onLoadFinished(Loader<AsyncTaskLoaderResult<MessageBean>> loader, AsyncTaskLoaderResult<MessageBean> result) { MessageBean data = result != null ? result.data : null; final WeiboException exception = result != null ? result.exception : null; new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { CommonProgressDialogFragment dialog = (CommonProgressDialogFragment) getSupportFragmentManager() .findFragmentByTag(CommonProgressDialogFragment.class.getName()); if (dialog != null) { dialog.dismiss(); } if (exception != null) { CommonErrorDialogFragment userInfoActivityErrorDialog = CommonErrorDialogFragment.newInstance(exception.getError()); getSupportFragmentManager().beginTransaction() .add(userInfoActivityErrorDialog, CommonErrorDialogFragment.class.getName()).commit(); } } }); if (data != null) { BrowserWeiboMsgActivity.this.msg = data; buildContent(); } getLoaderManager().destroyLoader(loader.getId()); } @Override public void onLoaderReset(Loader<AsyncTaskLoaderResult<MessageBean>> loader) { } }; }