diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 77047117df..91b6b0c5aa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,14 @@ android:supportsRtl="true" android:theme="@style/AppThemeLight"> + + + + diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 38bc913773..fce8ef8222 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -77,6 +77,7 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view); getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessage.java b/app/src/main/java/eu/faircode/email/FragmentMessage.java index 49ce695125..215b89952d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessage.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessage.java @@ -34,12 +34,16 @@ import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.text.Html; +import android.text.Layout; +import android.text.Spannable; import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; @@ -98,7 +102,40 @@ public class FragmentMessage extends Fragment { grpReady = view.findViewById(R.id.grpReady); setHasOptionsMenu(true); - tvBody.setMovementMethod(LinkMovementMethod.getInstance()); + tvBody.setMovementMethod(new LinkMovementMethod() { + + public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { + if (event.getAction() != MotionEvent.ACTION_UP) + return super.onTouchEvent(widget, buffer, event); + + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); + if (link.length != 0) { + Bundle args = new Bundle(); + args.putString("link", link[0].getURL()); + + FragmentWebView fragment = new FragmentWebView(); + fragment.setArguments(args); + + FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("link"); + fragmentTransaction.commit(); + } + return true; + } + }); // Wire controls diff --git a/app/src/main/java/eu/faircode/email/FragmentWebView.java b/app/src/main/java/eu/faircode/email/FragmentWebView.java new file mode 100644 index 0000000000..9d8dc40372 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/FragmentWebView.java @@ -0,0 +1,75 @@ +package eu.faircode.email; + +/* + This file is part of Safe email. + + Safe email is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NetGuard is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NetGuard. If not, see . + + Copyright 2018 by Marcel Bokhorst (M66B) +*/ + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ProgressBar; + +// https://developer.android.com/reference/android/webkit/WebView + +public class FragmentWebView extends Fragment { + + @Override + @Nullable + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_webview, container, false); + + final ProgressBar progressBar = view.findViewById(R.id.progressbar); + WebView webview = view.findViewById(R.id.webview); + + progressBar.setProgress(0); + progressBar.setVisibility(View.VISIBLE); + + WebSettings settings = webview.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setLoadWithOverviewMode(true); + settings.setUseWideViewPort(true); + //settings.setBuiltInZoomControls(true); + + webview.setWebViewClient(new WebViewClient() { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return false; + } + }); + + webview.setWebChromeClient(new WebChromeClient() { + public void onProgressChanged(WebView view, int progress) { + progressBar.setProgress(progress); + if (progress == 100) + progressBar.setVisibility(View.GONE); + } + }); + + webview.loadUrl(getArguments().getString("link")); + + return view; + } +} diff --git a/app/src/main/res/layout/fragment_webview.xml b/app/src/main/res/layout/fragment_webview.xml new file mode 100644 index 0000000000..25a1cc48b1 --- /dev/null +++ b/app/src/main/res/layout/fragment_webview.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file