package com.cundong.izhihu.activity;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.Toast;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import com.actionbarsherlock.widget.ShareActionProvider;
import com.cundong.izhihu.R;
import com.cundong.izhihu.ZhihuApplication;
import com.cundong.izhihu.entity.NewsDetailEntity;
import com.cundong.izhihu.entity.NewsListEntity.NewsEntity;
import com.cundong.izhihu.fragment.NewsDetailFragment;
import com.cundong.izhihu.fragment.NewsDetailFragment.OnContentLoadListener;
import com.cundong.izhihu.task.MyAsyncTask;
/**
* 类说明: 新闻详情页,Activity
*
* @date 2014-9-20
* @version 1.0
*/
public class NewsDetailActivity extends BaseActivity implements OnContentLoadListener {
//手指在屏幕滑动,X轴最小变化值
private static final int FLING_MIN_DISTANCE_X = 200;
//手指在屏幕滑动,Y轴最小变化值
private static final int FLING_MIN_DISTANCE = 10;
//手指在屏幕滑动,最小速度
private static final int FLING_MIN_VELOCITY = 1;
private Menu mOptionsMenu;
private MenuItem mFavActionItem;
private GestureDetector mGestureDetector;
private long mNewsId = 0;
private NewsEntity mNewsEntity = null;
private NewsDetailEntity mNewsDetailEntity = null;
private boolean isInFavorite = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Load partially transparent black background
getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.ab_bg_black));
mGestureDetector = new GestureDetector(this, mOnGestureListener);
if (savedInstanceState == null) {
/**
* deal such scheme: <a href="http://daily.zhihu.com/story/4115152">go</>
*
* AndroidMainfext.xml config:
* <data android:scheme="http" android:host="daily.zhihu.com" android:pathPattern="/story/.*" />
*/
Uri data = getIntent().getData();
String scheme = data!=null ? data.getScheme() : ""; // "http"
String host = data!=null ? data.getHost() : ""; // "daily.zhihu.com"
List<String> params = data!=null ? data.getPathSegments() : null;
if (scheme.equals("http") && host.equals("daily.zhihu.com")
&& params != null && params.size() == 2) {
String storyId = params.get(1);
mNewsId = Long.parseLong(storyId);
} else {
mNewsId = getIntent().getLongExtra("id", 0);
mNewsEntity = (NewsEntity) getIntent().getSerializableExtra("newsEntity");
}
} else {
mNewsEntity = (NewsEntity) savedInstanceState.getSerializable("newsEntity");
mNewsId = savedInstanceState.getLong("newsID");
}
Bundle bundle = new Bundle();
bundle.putLong("id", mNewsId);
// Add the Sample Fragment if there is one
Fragment newFragment = getFragment();
newFragment.setArguments(bundle);
if (newFragment != null) {
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, newFragment).commit();
}
new FavoriteStatusGetTask().executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
protected void onResume() {
super.onResume();
updateCreateMenu();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("newsID", mNewsId);
outState.putSerializable("newsEntity", mNewsEntity);
}
@Override
protected Fragment getFragment() {
return new NewsDetailFragment();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_fav_action_bar:
if (isInFavorite) {
ZhihuApplication.getNewsFavoriteDataSource().deleteFromFavorite(String.valueOf(mNewsId));
Toast.makeText(this, R.string.fav_cancel_success, Toast.LENGTH_SHORT).show();
mFavActionItem.setIcon(R.drawable.ab_fav_normal);
mFavActionItem.setTitle(R.string.actionbar_item_fav_add);
isInFavorite = false;
} else {
String title = null, image = null, share_url = null;
if (mNewsDetailEntity != null) {
title = mNewsDetailEntity.title;
image = mNewsDetailEntity.image;
share_url = mNewsDetailEntity.share_url;
} else if (mNewsEntity != null) {
title = mNewsEntity.title;
image = mNewsEntity.images.get(0);
share_url = mNewsEntity.share_url;
}
if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(share_url)) {
ZhihuApplication.getNewsFavoriteDataSource().add2Favorite(
String.valueOf(mNewsId), title, image, share_url);
Toast.makeText(this, R.string.fav_add_success, Toast.LENGTH_SHORT).show();
mFavActionItem.setIcon(R.drawable.ab_fav_active);
mFavActionItem.setTitle(R.string.actionbar_item_fav_cancel);
isInFavorite = true;
} else {
Toast.makeText(this, R.string.fav_add_fail, Toast.LENGTH_SHORT).show();
}
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mOptionsMenu = menu;
// Inflate your menu.
getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);
// Set file with share history to the provider and set the share intent.
MenuItem shareActionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) shareActionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
actionProvider.setShareIntent(prepareIntent());
mFavActionItem = menu.findItem(R.id.menu_item_fav_action_bar);
if (isInFavorite) {
mFavActionItem.setIcon(R.drawable.ab_fav_active);
mFavActionItem.setTitle(R.string.actionbar_item_fav_cancel);
} else {
mFavActionItem.setIcon(R.drawable.ab_fav_normal);
mFavActionItem.setTitle(R.string.actionbar_item_fav_add);
}
return true;
}
@SuppressLint("NewApi")
private void updateCreateMenu() {
if (Build.VERSION.SDK_INT >= 11) {
invalidateOptionsMenu();
} else if (mOptionsMenu != null) {
mOptionsMenu.clear();
onCreateOptionsMenu(mOptionsMenu);
}
}
private Intent prepareIntent() {
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
if (mNewsDetailEntity != null) {
StringBuilder sb = new StringBuilder();
sb.append(mNewsDetailEntity.title).append(" ").append(mNewsDetailEntity.share_url);
shareIntent.putExtra(Intent.EXTRA_TEXT, sb.toString());
} else if (mNewsEntity != null) {
StringBuilder sb = new StringBuilder();
sb.append(mNewsEntity.title).append(" ").append(mNewsEntity.share_url);
shareIntent.putExtra(Intent.EXTRA_TEXT, sb.toString());
}
return shareIntent;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
try {
mGestureDetector.onTouchEvent(ev);
} catch (Exception e) {
e.printStackTrace();
}
return super.dispatchTouchEvent(ev);
}
private OnGestureListener mOnGestureListener = new OnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
boolean isXWell = Math.abs(e2.getX() - e1.getX()) < FLING_MIN_DISTANCE_X ? true : false;
if (isXWell && e1.getY() - e2.getY() > FLING_MIN_DISTANCE && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
getSupportActionBar().hide();
} else if (isXWell && e2.getY() - e1.getY() > FLING_MIN_DISTANCE && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
getSupportActionBar().show();
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
};
@Override
public void onComplete(NewsDetailEntity newsDetailEntity) {
mNewsDetailEntity = newsDetailEntity;
updateCreateMenu();
}
//获取当前新闻是否已被收藏过
private class FavoriteStatusGetTask extends MyAsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
return ZhihuApplication.getNewsFavoriteDataSource().isInFavorite(String.valueOf(mNewsId));
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
isInFavorite = result;
updateCreateMenu();
}
}
}