package org.wordpress.android.ui.posts; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.fluxc.model.PostModel; import org.wordpress.android.fluxc.model.SiteModel; import org.wordpress.android.fluxc.store.AccountStore; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.WPWebViewClient; import javax.inject.Inject; public class PostPreviewFragment extends Fragment { private SiteModel mSite; private PostModel mPost; private WebView mWebView; @Inject AccountStore mAccountStore; public static PostPreviewFragment newInstance(SiteModel site, PostModel post) { Bundle args = new Bundle(); args.putSerializable(WordPress.SITE, site); args.putSerializable(PostPreviewActivity.EXTRA_POST, post); PostPreviewFragment fragment = new PostPreviewFragment(); fragment.setArguments(args); return fragment; } @Override public void setArguments(Bundle args) { super.setArguments(args); mSite = (SiteModel) args.getSerializable(WordPress.SITE); mPost = (PostModel) args.getSerializable(PostPreviewActivity.EXTRA_POST); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getActivity().getApplication()).component().inject(this); if (savedInstanceState != null) { mSite = (SiteModel) savedInstanceState.getSerializable(WordPress.SITE); mPost = (PostModel) savedInstanceState.getSerializable(PostPreviewActivity.EXTRA_POST); } } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable(WordPress.SITE, mSite); outState.putSerializable(PostPreviewActivity.EXTRA_POST, mPost); super.onSaveInstanceState(outState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.post_preview_fragment, container, false); mWebView = (WebView) view.findViewById(R.id.webView); WPWebViewClient client = new WPWebViewClient(mSite, mAccountStore.getAccessToken()); mWebView.setWebViewClient(client); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); refreshPreview(); } public void setPost(PostModel post) { mPost = post; } void refreshPreview() { if (!isAdded()) return; new Thread() { @Override public void run() { final String htmlContent = formatPostContentForWebView(getActivity(), mPost); getActivity().runOnUiThread(new Runnable() { @Override public void run() { if (!isAdded()) return; if (htmlContent != null) { mWebView.loadDataWithBaseURL( "file:///android_asset/", htmlContent, "text/html", "utf-8", null); } else { ToastUtils.showToast(getActivity(), R.string.post_not_found); } } }); } }.start(); } private String formatPostContentForWebView(Context context, PostModel post) { if (context == null || post == null) { return null; } String title = (TextUtils.isEmpty(post.getTitle()) ? "(" + getResources().getText(R.string.untitled) + ")" : StringUtils.unescapeHTML(post.getTitle())); String postContent = PostUtils.collapseShortcodes(post.getContent()); // if this is a local draft, remove src="null" from image tags then replace the "android-uri" // tag added for local image with a valid "src" tag so local images can be viewed if (post.isLocalDraft()) { postContent = postContent.replace("src=\"null\"", "").replace("android-uri=", "src="); } return "<!DOCTYPE html><html><head><meta charset='UTF-8' />" + "<meta name='viewport' content='width=device-width, initial-scale=1'>" + "<link rel='stylesheet' href='editor.css'>" + "<link rel='stylesheet' href='editor-android.css'>" + "</head><body>" + "<h1>" + title + "</h1>" + StringUtils.addPTags(postContent) + "</body></html>"; } }