package com.dozuki.ifixit.ui.guide.view; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; import android.text.method.MovementMethod; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.TextView; import com.dozuki.ifixit.R; import com.dozuki.ifixit.model.guide.Guide; import com.dozuki.ifixit.ui.BaseFragment; import com.dozuki.ifixit.util.Utils; import com.dozuki.ifixit.util.WikiHtmlTagHandler; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GuideIntroViewFragment extends BaseFragment { private static final String SAVED_GUIDE = "SAVED_GUIDE"; private TextView mTitle; private TextView mIntro; private TextView mDifficulty; private TextView mAuthor; private Guide mGuide; public GuideIntroViewFragment() { } public GuideIntroViewFragment(Guide guide) { mGuide = guide; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null && mGuide == null) { mGuide = (Guide) savedInstanceState.getSerializable(SAVED_GUIDE); } } @Override public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putSerializable(SAVED_GUIDE, mGuide); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.guide_intro, container, false); mTitle = (TextView) view.findViewById(R.id.guide_title); mIntro = (TextView) view.findViewById(R.id.guide_intro_text); mDifficulty = (TextView) view.findViewById(R.id.guide_difficulty); mAuthor = (TextView) view.findViewById(R.id.guide_author); MovementMethod method = LinkMovementMethod.getInstance(); mIntro.setMovementMethod(method); if (mGuide != null) { mTitle.setText(mGuide.getTitle()); String introductionText = mGuide.getIntroductionRendered(); Pattern p = Pattern.compile("<iframe.*?src=\"([^\"]*)\""); Matcher m = p.matcher(introductionText); if (m.find()) { int count = m.groupCount(); if (count > 0) { for (int i = 1; i <= count; i++) { final String iframeSrc = m.group(i); // Group 0 denotes the full pattern, // so 1 is the actual capture group. Log.d("GuideIntroViewFragment", iframeSrc); final Activity activity = getActivity(); final WebView webView = new WebView(activity); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); webView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(iframeSrc)); startActivity(intent); } return true; } }); webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% activity.setProgress(progress * 1000); } }); webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { return true; } }); webView.loadUrl(iframeSrc); webView.setClickable(false); final LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.guide_intro_container); linearLayout.addView(webView); // Setting LayoutParams must happen after the webview is added to the parent view otherwise it'll // NPE. LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) webView.getLayoutParams(); params.width = LinearLayout.LayoutParams.MATCH_PARENT; params.height = LinearLayout.LayoutParams.WRAP_CONTENT; webView.setLayoutParams(params); ViewTreeObserver vto = webView.getViewTreeObserver(); if (vto != null) { vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) webView.getLayoutParams(); params.height = (int) (webView.getWidth() * (0.5625f)); webView.setLayoutParams(params); ViewTreeObserver obs = webView.getViewTreeObserver(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { obs.removeGlobalOnLayoutListener(this); } else { obs.removeOnGlobalLayoutListener(this); } } }); } } } } if (introductionText.length() > 0) { mIntro.setText(Utils.correctLinkPaths(Html.fromHtml(introductionText, null, new WikiHtmlTagHandler()))); } else { mIntro.setText(introductionText); } // Authors and Difficulty are not relevant on teardowns. if (mGuide.getType().equalsIgnoreCase("teardown")) { mDifficulty.setVisibility(View.GONE); mAuthor.setVisibility(View.GONE); } else { if (!mGuide.getDifficulty().equals("false")) { mDifficulty.setText(getActivity().getString(R.string.difficulty) + ": " + Utils.correctLinkPaths(Html.fromHtml(mGuide.getDifficulty()))); } mAuthor.setText(getActivity().getString(R.string.author) + ": " + Utils.correctLinkPaths(Html.fromHtml(mGuide.getAuthor()))); } } return view; } }