package net.oschina.app.ui; import net.oschina.app.AppContext; import net.oschina.app.AppException; import net.oschina.app.R; import net.oschina.app.api.ApiClient; import net.oschina.app.bean.FavoriteList; import net.oschina.app.bean.Notice; import net.oschina.app.bean.Result; import net.oschina.app.bean.Software; import net.oschina.app.common.StringUtils; import net.oschina.app.common.UIHelper; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.webkit.WebView; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.ScrollView; import android.widget.TextView; /** * 软件详情 * * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class SoftwareDetail extends BaseActivity { private FrameLayout mHeader; private ImageView mBack; private ImageView mFavorite; private ImageView mRefresh; private ProgressBar mProgressbar; private ScrollView mScrollView; private ImageView mLogo; private TextView mTitle; private TextView mLicense; private TextView mLanguage; private TextView mOS; private TextView mRecordtime; private LinearLayout ll_language; private LinearLayout ll_os; private ImageView iv_language; private ImageView iv_os; private Button mHomepage; private Button mDocment; private Button mDownload; private WebView mWebView; private Handler mHandler; private Software softwareDetail; private Bitmap logo; private String ident; private final static int DATA_LOAD_ING = 0x001; private final static int DATA_LOAD_COMPLETE = 0x002; private final static int DATA_LOAD_FAIL = 0x003; private GestureDetector gd; private boolean isFullScreen; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.software_detail); this.initView(); this.initData(); // 注册双击全屏事件 this.regOnDoubleEvent(); } // 初始化视图控件 private void initView() { mHeader = (FrameLayout) findViewById(R.id.software_detail_header); mBack = (ImageView) findViewById(R.id.software_detail_back); mFavorite = (ImageView) findViewById(R.id.software_detail_favorite); mRefresh = (ImageView) findViewById(R.id.software_detail_refresh); mProgressbar = (ProgressBar) findViewById(R.id.software_detail_head_progress); mScrollView = (ScrollView) findViewById(R.id.software_detail_scrollview); mLogo = (ImageView) findViewById(R.id.software_detail_logo); mTitle = (TextView) findViewById(R.id.software_detail_title); mLicense = (TextView) findViewById(R.id.software_detail_license); mLanguage = (TextView) findViewById(R.id.software_detail_language); mOS = (TextView) findViewById(R.id.software_detail_os); mRecordtime = (TextView) findViewById(R.id.software_detail_recordtime); mHomepage = (Button) findViewById(R.id.software_detail_homepage); mDocment = (Button) findViewById(R.id.software_detail_document); mDownload = (Button) findViewById(R.id.software_detail_download); ll_language = (LinearLayout) findViewById(R.id.software_detail_language_ll); ll_os = (LinearLayout) findViewById(R.id.software_detail_os_ll); iv_language = (ImageView) findViewById(R.id.software_detail_language_iv); iv_os = (ImageView) findViewById(R.id.software_detail_os_iv); mWebView = (WebView) findViewById(R.id.software_detail_webview); mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.getSettings().setDefaultFontSize(15); UIHelper.addWebImageShow(this, mWebView); mBack.setOnClickListener(UIHelper.finish(this)); mFavorite.setOnClickListener(favoriteClickListener); mRefresh.setOnClickListener(refreshClickListener); } // 初始化控件数据 private void initData() { ident = getIntent().getStringExtra("ident"); mHandler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { headButtonSwitch(DATA_LOAD_COMPLETE); // 是否收藏 if (softwareDetail.getFavorite() == 1) mFavorite.setImageResource(R.drawable.head_favorite_y); else mFavorite.setImageResource(R.drawable.head_favorite_n); mLogo.setImageBitmap(logo); String title = softwareDetail.getExtensionTitle() + " " + softwareDetail.getTitle(); mTitle.setText(title); String body = UIHelper.WEB_STYLE + softwareDetail.getBody(); // 读取用户设置:是否加载文章图片--默认有wifi下始终加载图片 boolean isLoadImage; AppContext ac = (AppContext) getApplication(); if (AppContext.NETTYPE_WIFI == ac.getNetworkType()) { isLoadImage = true; } else { isLoadImage = ac.isLoadImage(); } if (isLoadImage) { body = body.replaceAll("(<img[^>]*?)\\s+width\\s*=\\s*\\S+", "$1"); body = body.replaceAll("(<img[^>]*?)\\s+height\\s*=\\s*\\S+", "$1"); // 添加点击图片放大支持 body = body.replaceAll("(<img[^>]+src=\")(\\S+)\"", "$1$2\" onClick=\"javascript:mWebViewImageListener.onImageClick('$2')\""); } else { body = body.replaceAll("<\\s*img\\s+([^>]*)\\s*>", ""); } mWebView.loadDataWithBaseURL(null, body, "text/html", "utf-8", null); mWebView.setWebViewClient(UIHelper.getWebViewClient()); mLicense.setText(softwareDetail.getLicense()); mRecordtime.setText(softwareDetail.getRecordtime()); String language = softwareDetail.getLanguage(); String os = softwareDetail.getOs(); if (StringUtils.isEmpty(language)) { ll_language.setVisibility(View.GONE); iv_language.setVisibility(View.GONE); } else { mLanguage.setText(language); } if (StringUtils.isEmpty(os)) { ll_os.setVisibility(View.GONE); iv_os.setVisibility(View.GONE); } else { mOS.setText(os); } if (StringUtils.isEmpty(softwareDetail.getHomepage())) { mHomepage.setVisibility(View.GONE); } else { mHomepage.setOnClickListener(homepageClickListener); } if (StringUtils.isEmpty(softwareDetail.getDocument())) { mDocment.setVisibility(View.GONE); } else { mDocment.setOnClickListener(docmentClickListener); } if (StringUtils.isEmpty(softwareDetail.getDownload())) { mDownload.setVisibility(View.GONE); } else { mDownload.setOnClickListener(downloadClickListener); } // 发送通知广播 if (msg.obj != null) { UIHelper.sendBroadCast(SoftwareDetail.this, (Notice) msg.obj); } } else if (msg.what == 0) { headButtonSwitch(DATA_LOAD_FAIL); UIHelper.ToastMessage(SoftwareDetail.this, R.string.msg_load_is_null); } else if (msg.what == -1 && msg.obj != null) { headButtonSwitch(DATA_LOAD_FAIL); ((AppException) msg.obj).makeToast(SoftwareDetail.this); } } }; initData(ident, false); } private void initData(final String ident, final boolean isRefresh) { headButtonSwitch(DATA_LOAD_ING); new Thread() { public void run() { Message msg = new Message(); try { softwareDetail = ((AppContext) getApplication()).getSoftware(ident, isRefresh); if (softwareDetail != null && !StringUtils.isEmpty(softwareDetail.getLogo())) { /* * 软件logo格式为gif,保存后再读取图片透明效果消失 //先加载SD卡中的图片缓存 String * filename = * FileUtils.getFileName(softwareDetail.getLogo()); * String filepath = getFilesDir() + File.separator + * filename; File file = new File(filepath); * if(file.exists()){ logo = * ImageUtils.getBitmap(SoftwareDetail.this, filename); * }else{ //加载网络图片 logo = * ApiClient.getNetBitmap(softwareDetail.getLogo()); * if(logo != null){ //向SD卡中写入图片缓存 try{ * ImageUtils.saveImage(SoftwareDetail.this, filename, * logo); } catch (IOException e) { e.printStackTrace(); * } } } */ // 加载网络图片 logo = ApiClient.getNetBitmap(softwareDetail.getLogo()); } msg.what = (softwareDetail != null && softwareDetail.getId() > 0) ? 1 : 0; msg.obj = (softwareDetail != null) ? softwareDetail.getNotice() : null; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } mHandler.sendMessage(msg); } }.start(); } /** * 头部按钮展示 * * @param type */ private void headButtonSwitch(int type) { switch (type) { case DATA_LOAD_ING: mScrollView.setVisibility(View.GONE); mProgressbar.setVisibility(View.VISIBLE); mFavorite.setVisibility(View.GONE); mRefresh.setVisibility(View.GONE); break; case DATA_LOAD_COMPLETE: mScrollView.setVisibility(View.VISIBLE); mProgressbar.setVisibility(View.GONE); mFavorite.setVisibility(View.VISIBLE); mRefresh.setVisibility(View.GONE); break; case DATA_LOAD_FAIL: mScrollView.setVisibility(View.GONE); mProgressbar.setVisibility(View.GONE); mFavorite.setVisibility(View.GONE); mRefresh.setVisibility(View.VISIBLE); break; } } private View.OnClickListener favoriteClickListener = new View.OnClickListener() { public void onClick(View v) { if (ident == "" || softwareDetail == null) { return; } final AppContext ac = (AppContext) getApplication(); if (!ac.isLogin()) { UIHelper.showLoginDialog(SoftwareDetail.this); return; } final int uid = ac.getLoginUid(); final Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { Result res = (Result) msg.obj; if (res.OK()) { if (softwareDetail.getFavorite() == 1) { softwareDetail.setFavorite(0); mFavorite.setImageResource(R.drawable.head_favorite_n); } else { softwareDetail.setFavorite(1); mFavorite.setImageResource(R.drawable.head_favorite_y); } // 重新保存缓存 ac.saveObject(softwareDetail, softwareDetail.getCacheKey()); } UIHelper.ToastMessage(SoftwareDetail.this, res.getErrorMessage()); } else { ((AppException) msg.obj).makeToast(SoftwareDetail.this); } } }; new Thread() { public void run() { Message msg = new Message(); Result res = null; try { if (softwareDetail.getFavorite() == 1) { res = ac.delFavorite(uid, softwareDetail.getId(), FavoriteList.TYPE_SOFTWARE); } else { res = ac.addFavorite(uid, softwareDetail.getId(), FavoriteList.TYPE_SOFTWARE); } msg.what = 1; msg.obj = res; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); } }.start(); } }; private View.OnClickListener homepageClickListener = new View.OnClickListener() { public void onClick(View v) { UIHelper.openBrowser(v.getContext(), softwareDetail.getHomepage()); } }; private View.OnClickListener refreshClickListener = new View.OnClickListener() { public void onClick(View v) { initData(ident, true); } }; private View.OnClickListener docmentClickListener = new View.OnClickListener() { public void onClick(View v) { UIHelper.openBrowser(v.getContext(), softwareDetail.getDocument()); } }; private View.OnClickListener downloadClickListener = new View.OnClickListener() { public void onClick(View v) { UIHelper.openBrowser(v.getContext(), softwareDetail.getDownload()); } }; /** * 注册双击全屏事件 */ private void regOnDoubleEvent() { gd = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { isFullScreen = !isFullScreen; if (!isFullScreen) { WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(params); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); mHeader.setVisibility(View.VISIBLE); } else { WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(params); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); mHeader.setVisibility(View.GONE); } return true; } }); } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (isAllowFullScreen()) { gd.onTouchEvent(event); } return super.dispatchTouchEvent(event); } }