package com.digitallizard.bbcnewsreader.fragments; import android.os.Bundle; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.digitallizard.bbcnewsreader.R; import com.digitallizard.bbcnewsreader.ResourceService; import com.digitallizard.bbcnewsreader.ServiceManager; import com.digitallizard.bbcnewsreader.ServiceManager.MessageReceiver; import com.digitallizard.bbcnewsreader.data.DatabaseHandler; import com.digitallizard.bbcnewsreader.resource.web.HtmlParser; public class ArticleFragment extends SherlockFragment implements MessageReceiver { /* constants */ private static final int ID_NO_ARTICLE_LOADED = -10; /* variables */ private DatabaseHandler database; private ServiceManager service; private WebView webView; private TextView loadingText; private int itemId; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); database = new DatabaseHandler(getActivity()); service = new ServiceManager(getActivity(), this); itemId = ID_NO_ARTICLE_LOADED; service.doBindService(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.article, container, false); // create references to views loadingText = (TextView) view.findViewById(R.id.articleLoadingText); webView = (WebView) view.findViewById(R.id.articleWebView); webView.loadDataWithBaseURL(null, "Please select an article.", "text/html", "utf-8", null); return view; } @Override public void onDestroy() { super.onDestroy(); service.doUnbindService(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); // inflate the menu XML file inflater.inflate(R.menu.article_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.articleMenuItemReload) { // reload the current article loadArticle(itemId); return true; } else { return super.onOptionsItemSelected(item); } } public void displayArticle(int id) { itemId = id; if (itemId == ID_NO_ARTICLE_LOADED) { return; } // display the article if it is loaded, else load it byte[] html = database.getHtml(id); if (html != null) { showArticle(html); } else { loadArticle(id); } } private void showArticle(byte[] html) { // parse the html, load it in the webview String parsedHtml = modifyHtml(HtmlParser.parsePage(html)); webView.loadDataWithBaseURL(null, parsedHtml, "text/html", "utf-8", null); // swap the loading text and webview loadingText.setVisibility(View.GONE); webView.setVisibility(View.VISIBLE); // scroll the webview up to the top webView.scrollTo(0, 0); } private String modifyHtml(String html) { // add css to prevent images being too wide String css = " <style type='text/css'> img { width:100%;} </style>"; return html + css; } public void loadArticle(int id) { itemId = id; if (itemId == ID_NO_ARTICLE_LOADED) { return; } // make the loading text visible loadingText.setVisibility(View.VISIBLE); webView.setVisibility(View.GONE); // load the article, it will be displayed when it is returned by the service Bundle bundle = new Bundle(); bundle.putInt(ResourceService.KEY_ITEM_ID, itemId); service.sendMessageToService(ResourceService.MSG_LOAD_ARTICLE, bundle); } public void handleMessage(Message msg) { switch (msg.what) { case ResourceService.MSG_ARTICLE_LOADED: // display the reloaded article displayArticle(itemId); break; } } }