package edu.mit.mitmobile2.news.view;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Handler;
import android.webkit.WebChromeClient;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.JsResult;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.VideoView;
import edu.mit.mitmobile2.CommonActions;
import edu.mit.mitmobile2.Global;
import edu.mit.mitmobile2.IdEncoder;
import edu.mit.mitmobile2.NewModuleActivity;
import edu.mit.mitmobile2.NewModuleActivity.OnBackPressedListener;
import edu.mit.mitmobile2.NewModuleActivity.OnPausedListener;
import edu.mit.mitmobile2.R;
import edu.mit.mitmobile2.SliderActivity;
import edu.mit.mitmobile2.news.beans.NewsStory;
public class NewsDetailsView extends WebView {
private Handler mHandler = new Handler();
NewModuleActivity mModuleActivity;
NewsStory mNewsItem;
static final String TAG = "NewsDetailsView";
static final SimpleDateFormat sDateFormat = new SimpleDateFormat("EEE d, MMM yyyy",Locale.US);
static final SimpleDateFormat fromDate = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZZZZZ", Locale.US);
SliderActivity mSliderActivity;
int size_width;
/****************************************************/
public NewsDetailsView(Context context){
this(context,new NewsStory());
}
public NewsDetailsView(Context context, NewsStory newsItem) {
super(context);
mModuleActivity = (NewModuleActivity) context;
mNewsItem = newsItem;
DisplayMetrics metrics = getResources().getDisplayMetrics();
size_width = (int)metrics.widthPixels;
//Log.d("NEWS", "Width is: "+size_width + " density: "+metrics.density);
populateView();
}
@SuppressLint("SetJavaScriptEnabled")
private void populateView() {
// standard view
//NewsModel newsModel = new NewsModel(mModuleActivity);
//newsModel.populateImages(mNewsItem);
// Web template
setFocusable(false);
String templateHtml = readTextFromResource(R.raw.news_detail);
// Set Title
if(mNewsItem.getTitle()!=null)
templateHtml = templateHtml.replace("__TITLE__", mNewsItem.getTitle());
else
templateHtml = templateHtml.replace("__TITLE__", "");
// Set Author
if(mNewsItem.getAuthor()!=null)
templateHtml = templateHtml.replace("__AUTHOR__", mNewsItem.getAuthor());
else
templateHtml = templateHtml.replace("__AUTHOR__", "");
// Set Date
if(mNewsItem.getPublishedAt()!=null){
try {
templateHtml = templateHtml.replace("__DATE__", sDateFormat.format(fromDate.parse(mNewsItem.getPublishedAt())));
} catch (ParseException e) {
Log.d("NEWS",e.getLocalizedMessage());
templateHtml = templateHtml.replace("__DATE__","");
}
}else{
templateHtml = templateHtml.replace("__DATE__","");
}
// Set Description
if(mNewsItem.getDek()!=null)
templateHtml = templateHtml.replace("__DEK__", mNewsItem.getDek());
else
templateHtml = templateHtml.replace("__DEK__", "");
if(mNewsItem.getCoverImage() != null) {
templateHtml = templateHtml.replace("__THUMBNAIL_URL__",
mNewsItem.getCoverImage().getSmallestRepresentationWithMinimumWidth(size_width).getUrl());
}
// Set Image Count
int galleryCount = 0;
if(mNewsItem.getGalleryImages()!=null)
galleryCount = mNewsItem.getGalleryImages().size();
templateHtml = templateHtml.replace("__GALLERY_COUNT__", galleryCount + "");
// Set Body
if(mNewsItem.getBodyHtml()!=null)
templateHtml = templateHtml.replace("__BODY__", mNewsItem.getBodyHtml());
else
templateHtml = templateHtml.replace("__BODY__", "");
String bookmarkClass = "off"; //newsModel.isBookmarked(mNewsItem) ? "on" : "off";
templateHtml = templateHtml.replace("__BOOKMARK__", bookmarkClass);
//Log.d(TAG,"html = " + templateHtml);
getSettings().setJavaScriptEnabled(true);
getSettings().setSupportZoom(false);
setWebChromeClient(new MyWebChromeClient());
addJavascriptInterface(new JavaScriptInterface(), "newsDetail");
getSettings().setPluginsEnabled(true);
//getSettings().setPluginState(PluginState.ON);
loadDataWithBaseURL( "file:///android_asset/", templateHtml, "text/html", "UTF-8", null);
}
private String readTextFromResource(int newsDetail) {
InputStream raw = getResources().openRawResource(newsDetail);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
int i;
try {
i = raw.read();
while (i != -1) {
stream.write(i);
i = raw.read();
}
raw.close();
}
catch (IOException e) {
e.printStackTrace();
}
return stream.toString();
}
/*
@SuppressWarnings("unused")
private static class PictureFailedToLoadHandler extends WebViewClient {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
view.setVisibility(View.GONE);
}
}
*/
/**
* Provides a hook for calling "alert" from javascript. Useful for
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient implements OnCompletionListener, OnErrorListener {
VideoView mVideoView;
CustomViewCallback mCustomViewCallback;
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(TAG, message);
result.confirm();
return true;
}
private void stopVideo() {
if (mVideoView != null) {
mVideoView.stopPlayback();
}
mVideoView = null;
mModuleActivity.setOnBackPressedListener(null);
mModuleActivity.setOnPausedListener(null);
mModuleActivity.hideFullScreen();
mCustomViewCallback.onCustomViewHidden();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
stopVideo();
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
stopVideo();
}
// http://stackoverflow.com/questions/3815090/webview-and-html5-video
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
super.onShowCustomView(view, callback);
mCustomViewCallback = callback;
if (view instanceof FrameLayout){
FrameLayout frame = (FrameLayout) view;
// finding the VideoView is only required before honeycomb
if (frame.getFocusedChild() instanceof VideoView){
mVideoView = (VideoView) frame.getFocusedChild();
mVideoView.setOnCompletionListener(this);
mVideoView.setOnErrorListener(this);
mVideoView.start();
}
}
mModuleActivity.showFullScreen(view);
mModuleActivity.setOnBackPressedListener(new OnBackPressedListener() {
@Override
public boolean onBackPressed() {
stopVideo();
return true;
}
});
mModuleActivity.setOnPausedListener(new OnPausedListener() {
@Override
public void onPaused() {
if (mVideoView == null) {
stopVideo();
}
}
});
}
@Override
public View getVideoLoadingProgressView() {
ProgressBar bar = new ProgressBar(mModuleActivity);
return bar;
}
}
@Override
public void onSizeChanged(final int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (w > 0) {
loadUrl("javascript:resizeVideos(" + w + ")");
}
}
}, 200);
}
final class JavaScriptInterface {
JavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickBookmarkButton(String status) {
/*NewsModel newsModel = new NewsModel(mModuleActivity);
boolean bookmarkStatus = status.equals("on");
newsModel.setStoryBookmarkStatus(mNewsItem, bookmarkStatus);*/
}
public void clickShareButton() {
mHandler.post(new Runnable() {
@Override
public void run() {
String url = "http://" + Global.getMobileWebDomain() + "/n/" + IdEncoder.shortenId(Integer.parseInt(mNewsItem.getId()));
CommonActions.shareCustomContent(mModuleActivity, mNewsItem.getTitle(), mNewsItem.getDek(), url);
}
});
}
public void clickViewImage() {
mHandler.post(new Runnable() {
@Override
public void run() {
NewsImageActivity.launchActivity(mModuleActivity, mNewsItem);
}
});
}
}
}