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().setJavaScriptEnabled(false); mWebView.getSettings().setSupportZoom(true); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.getSettings().setDefaultFontSize(15); 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"); }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) { gd.onTouchEvent(event); return super.dispatchTouchEvent(event); } }