package org.wordpress.android.ui.posts; import android.app.Fragment; import android.os.AsyncTask; import android.os.Bundle; import android.text.SpannableString; import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.webkit.WebView; import android.widget.TextView; 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.util.StringUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.WPHtml; public class EditPostPreviewFragment extends Fragment { private WebView mWebView; private TextView mTextView; private LoadPostPreviewTask mLoadTask; private SiteModel mSite; private PostModel mPost; public static EditPostPreviewFragment newInstance(SiteModel site, PostModel post) { EditPostPreviewFragment fragment = new EditPostPreviewFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(WordPress.SITE, site); bundle.putSerializable(EditPostActivity.EXTRA_POST, post); fragment.setArguments(bundle); return fragment; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable(WordPress.SITE, mSite); outState.putSerializable(EditPostActivity.EXTRA_POST, mPost); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); updateSiteOrFinishActivity(savedInstanceState); } private void updateSiteOrFinishActivity(Bundle savedInstanceState) { if (savedInstanceState == null) { if (getArguments() != null) { mSite = (SiteModel) getArguments().getSerializable(WordPress.SITE); mPost = (PostModel) getArguments().getSerializable(EditPostActivity.EXTRA_POST); } else { mSite = (SiteModel) getActivity().getIntent().getSerializableExtra(WordPress.SITE); mPost = (PostModel) getActivity().getIntent().getSerializableExtra(EditPostActivity.EXTRA_POST); } } else { mSite = (SiteModel) savedInstanceState.getSerializable(WordPress.SITE); mPost = (PostModel) savedInstanceState.getSerializable(EditPostActivity.EXTRA_POST); } if (mSite == null) { ToastUtils.showToast(getActivity(), R.string.blog_not_found, ToastUtils.Duration.SHORT); getActivity().finish(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater .inflate(R.layout.edit_post_preview_fragment, container, false); mWebView = (WebView) rootView.findViewById(R.id.post_preview_webview); mTextView = (TextView) rootView.findViewById(R.id.post_preview_textview); mTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (getActivity() != null) { loadPost(); } mTextView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); return rootView; } @Override public void onResume() { super.onResume(); if (getActivity() != null && !mTextView.isLayoutRequested()) { loadPost(); } } @Override public void onPause() { super.onPause(); if (mLoadTask != null) { mLoadTask.cancel(true); mLoadTask = null; } } public void loadPost() { if (mLoadTask == null) { mLoadTask = new LoadPostPreviewTask(); mLoadTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } // Load post content in the background private class LoadPostPreviewTask extends AsyncTask<Void, Void, Spanned> { @Override protected Spanned doInBackground(Void... params) { Spanned contentSpannable; if (getActivity() == null) { return null; } if (mPost == null) { return null; } String postTitle = "<h1>" + mPost.getTitle() + "</h1>"; String postContent = postTitle + mPost.getContent(); if (mPost.isLocalDraft()) { contentSpannable = WPHtml.fromHtml( postContent.replaceAll("\uFFFC", ""), getActivity(), mPost, Math.min(mTextView.getWidth(), mTextView.getHeight()) ); } else { String htmlText = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><html><head><link rel=\"stylesheet\" " + "type=\"text/css\" href=\"webview.css\" /></head><body><div " + "id=\"container\">%s</div></body></html>"; htmlText = String.format(htmlText, StringUtils.addPTags(postContent)); contentSpannable = new SpannableString(htmlText); } return contentSpannable; } @Override protected void onPostExecute(Spanned spanned) { if (mPost != null && spanned != null) { if (mPost.isLocalDraft()) { mTextView.setVisibility(View.VISIBLE); mWebView.setVisibility(View.GONE); mTextView.setText(spanned); } else { mTextView.setVisibility(View.GONE); mWebView.setVisibility(View.VISIBLE); mWebView.loadDataWithBaseURL("file:///android_asset/", spanned.toString(), "text/html", "utf-8", null); } } mLoadTask = null; } } }