mirror of
https://github.com/etesync/android
synced 2025-02-23 04:52:02 +00:00
Merge: Open EteSync links in WebView instead of the default browser
It's nicer to have the EteSync links opened inside the app for a more native feel until we implement the respective pages natively inside the app.
This commit is contained in:
commit
64be5a278d
@ -183,6 +183,13 @@
|
||||
android:exported="true"
|
||||
android:label="@string/debug_info_title">
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ui.WebViewActivity"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
android:parentActivityName=".ui.AccountsActivity"/>
|
||||
|
||||
<provider
|
||||
android:name="android.support.v4.content.FileProvider"
|
||||
android:authorities="@string/authority_log_provider"
|
||||
|
@ -13,6 +13,7 @@ import android.support.v7.app.NotificationCompat;
|
||||
import com.etesync.syncadapter.journalmanager.Exceptions;
|
||||
import com.etesync.syncadapter.ui.AccountSettingsActivity;
|
||||
import com.etesync.syncadapter.ui.DebugInfoActivity;
|
||||
import com.etesync.syncadapter.ui.WebViewActivity;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
@ -95,7 +96,7 @@ public class NotificationHelper {
|
||||
if (e instanceof Exceptions.UnauthorizedException) {
|
||||
detailsIntent = new Intent(this, AccountSettingsActivity.class);
|
||||
} else if (e instanceof Exceptions.UserInactiveException) {
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.dashboard));
|
||||
WebViewActivity.openUrl(this, Constants.dashboard);
|
||||
return;
|
||||
} else {
|
||||
detailsIntent = new Intent(this, DebugInfoActivity.class);
|
||||
|
@ -93,10 +93,10 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri));
|
||||
break;
|
||||
case R.id.nav_guide:
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.helpUri));
|
||||
WebViewActivity.openUrl(this, Constants.helpUri);
|
||||
break;
|
||||
case R.id.nav_faq:
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.faqUri));
|
||||
WebViewActivity.openUrl(this, Constants.faqUri);
|
||||
break;
|
||||
case R.id.nav_report_issue:
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.reportIssueUri));
|
||||
@ -110,5 +110,4 @@ public class AccountsActivity extends AppCompatActivity implements NavigationVie
|
||||
drawer.closeDrawer(GravityCompat.START);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,15 +22,16 @@ import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.etesync.syncadapter.BuildConfig;
|
||||
import com.etesync.syncadapter.Constants;
|
||||
import com.etesync.syncadapter.R;
|
||||
import com.etesync.syncadapter.model.ServiceDB;
|
||||
import com.etesync.syncadapter.model.Settings;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.Cleanup;
|
||||
|
||||
public class StartupDialogFragment extends DialogFragment {
|
||||
|
@ -0,0 +1,169 @@
|
||||
package com.etesync.syncadapter.ui;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.webkit.WebChromeClient;
|
||||
import android.webkit.WebResourceError;
|
||||
import android.webkit.WebResourceRequest;
|
||||
import android.webkit.WebView;
|
||||
import android.webkit.WebViewClient;
|
||||
import android.widget.ProgressBar;
|
||||
|
||||
import com.etesync.syncadapter.Constants;
|
||||
import com.etesync.syncadapter.R;
|
||||
|
||||
public class WebViewActivity extends AppCompatActivity {
|
||||
|
||||
private static final String KEY_URL = "url";
|
||||
private static final String QUERY_KEY_EMBEDDED = "embedded";
|
||||
|
||||
private WebView mWebView;
|
||||
private ProgressBar mProgressBar;
|
||||
private Toolbar mToolbar;
|
||||
|
||||
public static void openUrl(Context context, Uri uri) {
|
||||
Intent intent = new Intent(context, WebViewActivity.class);
|
||||
intent.putExtra(WebViewActivity.KEY_URL, uri);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_webview);
|
||||
mToolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
setSupportActionBar(mToolbar);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
Uri uri = getIntent().getParcelableExtra(KEY_URL);
|
||||
uri = addQueryParams(uri);
|
||||
mWebView = (WebView) findViewById(R.id.webView);
|
||||
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
|
||||
|
||||
mWebView.getSettings().setJavaScriptEnabled(true);
|
||||
mWebView.loadUrl(uri.toString());
|
||||
mWebView.setWebViewClient(new WebViewClient() {
|
||||
@Override
|
||||
public void onPageFinished(WebView view, String url) {
|
||||
setTitle(view.getTitle());
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
||||
return shouldOverrideUrl(Uri.parse(url));
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
return shouldOverrideUrl(request.getUrl());
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
|
||||
loadErrorPage(failingUrl);
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
|
||||
loadErrorPage(request.getUrl().toString());
|
||||
}
|
||||
});
|
||||
|
||||
mWebView.setWebChromeClient(new WebChromeClient() {
|
||||
|
||||
public void onProgressChanged(WebView view, int progress) {
|
||||
mToolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
if (progress == 100) {
|
||||
mToolbar.setTitle(view.getTitle());
|
||||
mProgressBar.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
mToolbar.setTitle(R.string.loading);
|
||||
mProgressBar.setVisibility(View.VISIBLE);
|
||||
mProgressBar.setProgress(progress);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private Uri addQueryParams(Uri uri) {
|
||||
return uri.buildUpon().appendQueryParameter(QUERY_KEY_EMBEDDED, "1").build();
|
||||
}
|
||||
|
||||
private void loadErrorPage(String failingUrl) {
|
||||
String htmlData = "<html><title>" +
|
||||
getString(R.string.loading_error_title) +
|
||||
"</title>" +
|
||||
"<style>" +
|
||||
".btn {" +
|
||||
" display: inline-block;" +
|
||||
" padding: 6px 12px;" +
|
||||
" font-size: 20px;" +
|
||||
" font-weight: 400;" +
|
||||
" line-height: 1.42857143;" +
|
||||
" text-align: center;" +
|
||||
" white-space: nowrap;" +
|
||||
" vertical-align: middle;" +
|
||||
" touch-action: manipulation;" +
|
||||
" cursor: pointer;" +
|
||||
" user-select: none;" +
|
||||
" border: 1px solid #ccc;" +
|
||||
" border-radius: 4px;" +
|
||||
" color: #333;" +
|
||||
" text-decoration: none;" +
|
||||
" margin-top: 50px;" +
|
||||
"}" +
|
||||
"</style>" +
|
||||
"<body>" +
|
||||
"<div align=\"center\">" +
|
||||
"<a class=\"btn\" href=\"" + failingUrl + "\">" + getString(R.string.loading_error_content) +
|
||||
"</a>" +
|
||||
"</form></body></html>";
|
||||
|
||||
mWebView.loadDataWithBaseURL("about:blank", htmlData, "text/html", "UTF-8", null);
|
||||
mWebView.invalidate();
|
||||
}
|
||||
|
||||
private boolean shouldOverrideUrl(Uri uri) {
|
||||
if (Constants.webUri.getHost().equals(uri.getHost())) {
|
||||
if (uri.getQueryParameter(QUERY_KEY_EMBEDDED) != null) {
|
||||
return false;
|
||||
} else {
|
||||
uri = addQueryParams(uri);
|
||||
mWebView.loadUrl(uri.toString());
|
||||
return true;
|
||||
}
|
||||
|
||||
} else {
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, uri));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
mWebView.saveState(outState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
if (mWebView.canGoBack()) {
|
||||
mWebView.goBack();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return super.onKeyDown(keyCode, event);
|
||||
}
|
||||
}
|
@ -17,6 +17,7 @@ import android.view.MenuItem;
|
||||
import com.etesync.syncadapter.App;
|
||||
import com.etesync.syncadapter.Constants;
|
||||
import com.etesync.syncadapter.R;
|
||||
import com.etesync.syncadapter.ui.WebViewActivity;
|
||||
|
||||
/**
|
||||
* Activity to initially connect to a server and create an account.
|
||||
@ -71,6 +72,6 @@ public class LoginActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
public void showHelp(MenuItem item) {
|
||||
startActivity(new Intent(Intent.ACTION_VIEW, Constants.helpUri));
|
||||
WebViewActivity.openUrl(this, Constants.helpUri);
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ import android.widget.EditText;
|
||||
|
||||
import com.etesync.syncadapter.Constants;
|
||||
import com.etesync.syncadapter.R;
|
||||
import com.etesync.syncadapter.ui.WebViewActivity;
|
||||
import com.etesync.syncadapter.ui.widget.EditPassword;
|
||||
|
||||
public class LoginCredentialsFragment extends Fragment {
|
||||
@ -53,8 +54,7 @@ public class LoginCredentialsFragment extends Fragment {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Uri createUri = Constants.registrationUrl.buildUpon().appendQueryParameter("email", editUserName.getText().toString()).build();
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, createUri);
|
||||
startActivity(intent);
|
||||
WebViewActivity.openUrl(getContext(), createUri);
|
||||
}
|
||||
});
|
||||
|
||||
|
34
app/src/main/res/layout/activity_webview.xml
Normal file
34
app/src/main/res/layout/activity_webview.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:theme="@style/ThemeOverlay.AppCompat.ActionBar">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"/>
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBar"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="-8dp"
|
||||
android:layout_marginTop="-8dp"
|
||||
android:max="100"
|
||||
android:maxHeight="1dp"/>
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
<WebView
|
||||
android:id="@+id/webView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
@ -225,4 +225,8 @@
|
||||
<string name="certificate_notification_connection_security">EteSync: Connection security</string>
|
||||
<string name="trust_certificate_unknown_certificate_found">EteSync has encountered an unknown certificate. Do you want to trust it?</string>
|
||||
|
||||
<!-- WebView activity-->
|
||||
<string name="loading">Loading...</string>
|
||||
<string name="loading_error_title">Loading Error</string>
|
||||
<string name="loading_error_content">Refresh</string>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user