package com.cnblogs.android;
import java.io.InputStream;
import com.cnblogs.android.core.Config;
import com.cnblogs.android.utility.AppUtil;
import com.cnblogs.android.utility.NetHelper;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.OnGestureListener;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* ������������
*
* @author walkingp
* @date 2012-3
*/
public class RssDetailActivity extends SuperView
implements
OnGestureListener {
private String blogTitle;// ����
private String blogAuthor;// ����
private String blogDate;// ����ʱ��
private String blogUrl;// ��������
private String blogContent;// ��������
static final int MENU_FORMAT_HTML = Menu.FIRST;// ��ʽ���Ķ�
static final int MENU_READ_MODE = Menu.FIRST + 1;// �л��Ķ�ģʽ
final String mimeType = "text/html";
final String encoding = "utf-8";
private Button blog_button_back;// ����
WebView webView;
ProgressBar blogBody_progressBar;
RelativeLayout rl_blog_detail;// ͷ������
boolean isFullScreen = false;// �Ƿ�ȫ��
private GestureDetector gestureScanner;// ����
Resources res;// ��Դ
SharedPreferences sharePreferencesSettings;// ����
TextView tvSeekBar;// SeekBar��ʾ�ı���
SeekBar seekBar;// SeekBar
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ��ֹ����
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
this.setContentView(R.layout.rss_detail);
res = this.getResources();
sharePreferencesSettings = getSharedPreferences(
res.getString(R.string.preferences_key), MODE_PRIVATE);
InitialData();
MarkAsReaded();
}
/**
* �������ݿ�
*/
private void MarkAsReaded() {
}
/**
* ��ʼ��
*/
private void InitialData() {
// ���ݹ�����ֵ
blogTitle = getIntent().getStringExtra("title");
blogAuthor = getIntent().getStringExtra("author");
blogDate = getIntent().getStringExtra("date");
blogUrl = getIntent().getStringExtra("link");
blogContent = getIntent().getStringExtra("content");
TextView txtAppTitle = (TextView) findViewById(R.id.txtAppTitle);
txtAppTitle.setText(blogTitle);
// ͷ��
rl_blog_detail = (RelativeLayout) findViewById(R.id.rl_blog_detail);
// ˫��ȫ��
rl_blog_detail.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureScanner.onTouchEvent(event);
}
});
// ����
blog_button_back = (Button) findViewById(R.id.blog_button_back);
blog_button_back.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
RssDetailActivity.this.finish();
}
});
try {
webView = (WebView) findViewById(R.id.rss_body_webview_content);
webView.getSettings().setDefaultTextEncodingName("utf-8");// ������������
webView.addJavascriptInterface(this, "javatojs");
webView.setSelected(true);
webView.setScrollBarStyle(0);
WebSettings webSetting = webView.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setPluginsEnabled(true);
webSetting.setNeedInitialFocus(false);
webSetting.setSupportZoom(true);
webSetting.setDefaultFontSize(14);
webSetting.setCacheMode(WebSettings.LOAD_DEFAULT
| WebSettings.LOAD_CACHE_ELSE_NETWORK);
// ˫��ȫ��
webView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureScanner.onTouchEvent(event);
}
});
int scalePercent = 120;
// ��һ�α�������ű���
float webviewScale = sharePreferencesSettings.getFloat(
res.getString(R.string.preferences_webview_zoom_scale),
(float) 1.2);
scalePercent = (int) (webviewScale * 100);
webView.setInitialScale(scalePercent);
blogBody_progressBar = (ProgressBar) findViewById(R.id.blogBody_progressBar);
blogBody_progressBar.setVisibility(View.VISIBLE);
// ��һ��ȫ������״̬
isFullScreen = sharePreferencesSettings.getBoolean(
res.getString(R.string.preferences_is_fullscreen), false);
// ��ʼ�Ƿ�ȫ��
if (isFullScreen) {
setFullScreen();
}
PageTask task = new PageTask();
task.execute(blogUrl);
} catch (Exception ex) {
Toast.makeText(getApplicationContext(), R.string.sys_error,
Toast.LENGTH_SHORT).show();
}
// ������Ļ�����¼� ȫ��
gestureScanner = new GestureDetector(this);
gestureScanner.setIsLongpressEnabled(true);
gestureScanner
.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
public boolean onDoubleTap(MotionEvent e) {
if (!isFullScreen) {
setFullScreen();
} else {
quitFullScreen();
}
isFullScreen = !isFullScreen;
// ��������
sharePreferencesSettings
.edit()
.putBoolean(
res.getString(R.string.preferences_is_fullscreen),
isFullScreen).commit();
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
});
}
// �����˵�
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
if (v.getId() == R.id.blog_body_webview_content) {
menu.setHeaderTitle("��ѡ�����");
menu.add(0, MENU_FORMAT_HTML, 0, "�鿴����");
menu.add(0, MENU_READ_MODE, 1, "�л���ģʽ");
}
}
/**
* �������ű���
*/
public void onDestroy() {
float webviewScale = webView.getScale();
sharePreferencesSettings
.edit()
.putFloat(
res.getString(R.string.preferences_webview_zoom_scale),
webviewScale).commit();
super.onDestroy();
}
/**
* ���߳�����
*
* @author walkingp
*
*/
public class PageTask extends AsyncTask<String, Integer, String> {
// �ɱ䳤�������������AsyncTask.exucute()��Ӧ
@Override
protected String doInBackground(String... params) {
try {
String _blogContent = blogContent;// BlogHelper.GetBlogById(blogId,
// getApplicationContext());
return _blogContent;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
@Override
protected void onCancelled() {
super.onCancelled();
}
/**
* ��������
*/
@Override
protected void onPostExecute(String _blogContent) {
String htmlContent = "";
try {
InputStream in = getAssets().open("NewsDetail.html");
byte[] temp = NetHelper.readInputStream(in);
htmlContent = new String(temp);
} catch (Exception e) {
Log.e("error", e.toString());
}
String blogInfo = "����: " + blogAuthor + " ����ʱ��:" + blogDate;
// ��ʽ��html
_blogContent = AppUtil.FormatContent(getApplicationContext(),
_blogContent);
htmlContent = htmlContent.replace("#title#", blogTitle)
.replace("#time#", blogInfo)
.replace("#content#", _blogContent);
LoadWebViewContent(webView, htmlContent);
blogBody_progressBar.setVisibility(View.GONE);
}
@Override
protected void onPreExecute() {
blogBody_progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onProgressUpdate(Integer... values) {
}
}
/**
* ��������
*
* @param webView
* @param content
*/
private void LoadWebViewContent(WebView webView, String content) {
webView.loadDataWithBaseURL(Config.LOCAL_PATH, content, "text/html",
Config.ENCODE_TYPE, null);
}
/**
* �˵�
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.blog_detail_menu, menu);
return super.onCreateOptionsMenu(menu);
}
/**
* ȫ��
*/
private void setFullScreen() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// ���ص���
rl_blog_detail.setVisibility(View.GONE);
}
/**
* �˳�ȫ��
*/
private void quitFullScreen() {
final WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
getWindow()
.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
// ��ʾ����
rl_blog_detail.setVisibility(View.VISIBLE);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_blog_back :// �����б�
RssDetailActivity.this.setResult(0, getIntent());
RssDetailActivity.this.finish();
break;
case R.id.menu_blog_comment :// �鿴����
break;
case R.id.menu_blog_share :// ����
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, blogTitle);
String shareContent = "��" + blogTitle + "��,���ߣ�" + blogAuthor
+ "��ԭ�����ӣ�" + blogUrl + " �����ԣ�"
+ res.getString(R.string.app_name) + "Android�ͻ���("
+ res.getString(R.string.app_homepage) + ")";
intent.putExtra(Intent.EXTRA_TEXT, shareContent);
startActivity(Intent.createChooser(intent, blogTitle));
break;
case R.id.menu_blog_author :// ����
break;
case R.id.menu_blog_browser :// �鿴��ҳ
Uri blogUri = Uri.parse(blogUrl);
Intent it = new Intent(Intent.ACTION_VIEW, blogUri);
startActivity(it);
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@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;
}
}