diff --git a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java index 7f12948467c5..e9e177aa54bd 100644 --- a/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -24,25 +24,17 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.Color; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.preference.PreferenceManager; import android.text.TextUtils; -import android.util.AndroidRuntimeException; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.webkit.CookieManager; -import android.webkit.CookieSyncManager; import android.webkit.URLUtil; -import android.webkit.WebResourceRequest; -import android.webkit.WebResourceResponse; -import android.webkit.WebView; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; @@ -77,8 +69,6 @@ import com.owncloud.android.databinding.AccountSetupWebviewBinding; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.lib.common.OwnCloudAccount; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudClientFactory; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.OwnCloudCredentials; import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; @@ -92,9 +82,6 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation; -import com.owncloud.android.lib.resources.status.NextcloudVersion; -import com.owncloud.android.lib.resources.status.OCCapability; import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.users.GetUserInfoRemoteOperation; import com.owncloud.android.operations.DetectAuthenticationMethodOperation.AuthenticationMethod; @@ -103,7 +90,6 @@ import com.owncloud.android.providers.DocumentsStorageProvider; import com.owncloud.android.services.OperationsService; import com.owncloud.android.services.OperationsService.OperationsServiceBinder; -import com.owncloud.android.ui.NextcloudWebViewClient; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.SettingsActivity; import com.owncloud.android.ui.dialog.IndeterminateProgressDialog; @@ -112,18 +98,14 @@ import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.PermissionUtil; -import com.owncloud.android.utils.WebViewUtil; import com.owncloud.android.utils.theme.CapabilityUtils; import com.owncloud.android.utils.theme.ViewThemeUtils; import org.json.JSONObject; -import java.io.InputStream; import java.net.URLDecoder; import java.util.ArrayList; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.Executors; @@ -134,12 +116,10 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.ActionBar; -import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -188,14 +168,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity private static final String KEY_PASSWORD = "PASSWORD"; private static final String KEY_ASYNC_TASK_IN_PROGRESS = "AUTH_IN_PROGRESS"; - /** - * Login Flow v1 - */ - // public static final String WEB_LOGIN = "/index.php/login/flow"; - - /** - * Login Flow v2 - */ public static final String WEB_LOGIN = "/index.php/login/v2"; public static final String PROTOCOL_SUFFIX = "://"; @@ -253,9 +225,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity private String token; private boolean onlyAdd = false; - @SuppressLint("ResourceAsColor") @ColorInt - private int primaryColor = R.color.primary; - private boolean strictMode = false; private ViewThemeUtils viewThemeUtils; @@ -275,8 +244,6 @@ protected void onCreate(Bundle savedInstanceState) { viewThemeUtils = viewThemeUtilsFactory.withPrimaryAsBackground(); viewThemeUtils.platform.colorStatusBar(this, getResources().getColor(R.color.primary)); - // WebViewUtil webViewUtil = new WebViewUtil(this); - Uri data = getIntent().getData(); boolean directLogin = data != null && data.toString().startsWith(getString(R.string.login_data_own_scheme)); if (savedInstanceState == null && !directLogin) { @@ -343,7 +310,6 @@ protected void onCreate(Bundle savedInstanceState) { accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater()); setContentView(accountSetupWebviewBinding.getRoot()); anonymouslyPostLoginRequest(webloginUrl); - // initWebViewLogin(webloginUrl, false); } else { accountSetupBinding = AccountSetupBinding.inflate(getLayoutInflater()); setContentView(accountSetupBinding.getRoot()); @@ -362,13 +328,10 @@ protected void onCreate(Bundle savedInstanceState) { initServerPreFragment(savedInstanceState); ProcessLifecycleOwner.get().getLifecycle().addObserver(lifecycleEventObserver); - - // webViewUtil.checkWebViewVersion(); } } private void showEnforcedServers() { - showAuthStatus(); accountSetupBinding.hostUrlFrame.setVisibility(View.GONE); accountSetupBinding.hostUrlInputHelperText.setVisibility(View.GONE); @@ -421,9 +384,8 @@ public void onNothingSelected(AdapterView parent) { private void deleteCookies() { try { - CookieSyncManager.createInstance(this); CookieManager.getInstance().removeAllCookies(null); - } catch (AndroidRuntimeException e) { + } catch (Exception e) { Log_OC.e(TAG, e.getMessage()); } } @@ -485,124 +447,15 @@ private void launchDefaultWebBrowser(String url) { startActivity(intent); } - private static String getWebLoginUserAgent() { - return Build.MANUFACTURER.substring(0, 1).toUpperCase(Locale.getDefault()) + - Build.MANUFACTURER.substring(1).toLowerCase(Locale.getDefault()) + " " + Build.MODEL + " (Android)"; - } - - /** - * @Deprecated This function is deprecated. Please use the {@link #anonymouslyPostLoginRequest(String)} method instead, which utilizes the improved login flow v2. - */ - @Deprecated - @SuppressFBWarnings("ANDROID_WEB_VIEW_JAVASCRIPT") - @SuppressLint("SetJavaScriptEnabled") - private void initWebViewLogin(String baseURL, boolean useGenericUserAgent) { - viewThemeUtils.platform.colorCircularProgressBar(accountSetupWebviewBinding.loginWebviewProgressBar, ColorRole.ON_PRIMARY_CONTAINER); - accountSetupWebviewBinding.loginWebview.setVisibility(View.GONE); - new WebViewUtil(this).setProxyKKPlus(accountSetupWebviewBinding.loginWebview); - - accountSetupWebviewBinding.loginWebview.getSettings().setAllowFileAccess(false); - accountSetupWebviewBinding.loginWebview.getSettings().setJavaScriptEnabled(true); - accountSetupWebviewBinding.loginWebview.getSettings().setDomStorageEnabled(true); - - if (useGenericUserAgent) { - accountSetupWebviewBinding.loginWebview.getSettings().setUserAgentString(MainApp.getUserAgent()); - } else { - accountSetupWebviewBinding.loginWebview.getSettings().setUserAgentString(getWebLoginUserAgent()); - } - accountSetupWebviewBinding.loginWebview.getSettings().setSaveFormData(false); - accountSetupWebviewBinding.loginWebview.getSettings().setSavePassword(false); - - Map headers = new HashMap<>(); - headers.put(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE); - - String url; - if (baseURL != null && !baseURL.isEmpty()) { - url = baseURL; - } else { - url = getResources().getString(R.string.webview_login_url); - } - - new WebViewUtil(this).setProxyKKPlus(accountSetupWebviewBinding.loginWebview); - if (url.startsWith(HTTPS_PROTOCOL)) { - strictMode = true; - } - - accountSetupWebviewBinding.loginWebview.loadUrl(url, headers); - - setClient(); - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (accountSetupWebviewBinding != null && event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK) { - if (accountSetupWebviewBinding.loginWebview.canGoBack()) { - accountSetupWebviewBinding.loginWebview.goBack(); - } else { - finish(); - } return true; } return super.onKeyDown(keyCode, event); } - private void setClient() { - accountSetupWebviewBinding.loginWebview.setWebViewClient(new NextcloudWebViewClient(getSupportFragmentManager()) { - @Override - public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - return super.shouldInterceptRequest(view, request); - } - - @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - super.onPageStarted(view, url, favicon); - } - - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - if (url.startsWith(getString(R.string.login_data_own_scheme) + PROTOCOL_SUFFIX + "login/")) { - parseAndLoginFromWebView(url); - return true; - } - if (strictMode && url.startsWith(HTTP_PROTOCOL)) { - Snackbar.make(view, R.string.strict_mode, Snackbar.LENGTH_LONG).show(); - return true; - } - return false; - } - - @Override - public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); - - accountSetupWebviewBinding.loginWebviewProgressBar.setVisibility(View.GONE); - accountSetupWebviewBinding.loginWebview.setVisibility(View.VISIBLE); - - if (mServerInfo.mVersion != null && mServerInfo.mVersion.isOlderThan(NextcloudVersion.nextcloud_25)) { - viewThemeUtils.platform.colorStatusBar(AuthenticatorActivity.this, primaryColor); - getWindow().setNavigationBarColor(primaryColor); - } else { - viewThemeUtils.platform.resetStatusBar(AuthenticatorActivity.this); - getWindow().setNavigationBarColor(ContextCompat.getColor(AuthenticatorActivity.this, R.color.bg_default)); - } - } - - @Override - public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - accountSetupWebviewBinding.loginWebviewProgressBar.setVisibility(View.GONE); - accountSetupWebviewBinding.loginWebview.setVisibility(View.VISIBLE); - - InputStream resources = getResources().openRawResource(R.raw.custom_error); - String customError = DisplayUtils.getData(resources); - - if (!customError.isEmpty()) { - accountSetupWebviewBinding.loginWebview.loadData(customError, "text/html; charset=UTF-8", null); - } - } - }); - } - private void parseAndLoginFromWebView(String dataString) { try { String prefix = getString(R.string.login_data_own_scheme) + PROTOCOL_SUFFIX + "login/"; @@ -826,7 +679,6 @@ protected void onNewIntent(Intent intent) { accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater()); setContentView(accountSetupWebviewBinding.getRoot()); anonymouslyPostLoginRequest(getString(R.string.provider_registration_server)); - // initWebViewLogin(getString(R.string.provider_registration_server), true); } } @@ -900,7 +752,7 @@ private void checkOcServer() { mServerInfo = new GetServerInfoOperation.ServerInfo(); - if (uri.length() != 0) { + if (!uri.isEmpty()) { if (accountSetupBinding != null) { uri = AuthenticatorUrlUtils.INSTANCE.stripIndexPhpOrAppsFiles(uri); accountSetupBinding.hostUrlInput.setText(uri); @@ -1043,24 +895,6 @@ private void onGetServerInfoFinish(RemoteOperationResult result) { webViewPassword != null && !webViewPassword.isEmpty()) { checkBasicAuthorization(webViewUser, webViewPassword); } else { - new Thread(() -> { - OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mServerInfo.mBaseUrl), - this, - true); - RemoteOperationResult remoteOperationResult = new GetCapabilitiesRemoteOperation().execute(client); - - if (remoteOperationResult.isSuccess() && - remoteOperationResult.getData() != null && - remoteOperationResult.getData().size() > 0) { - OCCapability capability = (OCCapability) remoteOperationResult.getData().get(0); - try { - primaryColor = Color.parseColor(capability.getServerColor()); - } catch (Exception e) { - // falls back to primary color - } - } - }).start(); - accountSetupWebviewBinding = AccountSetupWebviewBinding.inflate(getLayoutInflater()); setContentView(accountSetupWebviewBinding.getRoot()); @@ -1071,7 +905,6 @@ private void onGetServerInfoFinish(RemoteOperationResult result) { } else { initLoginInfoView(); } - // initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false); } } } else { @@ -1310,10 +1143,6 @@ public void onAuthenticatorTaskCallback(RemoteOperationResult result) accountManager.setCurrentOwnCloudAccount(mAccount.name); getUserCapabilitiesAndFinish(); } else { - // init webView again - if (accountSetupWebviewBinding != null) { - accountSetupWebviewBinding.loginWebview.setVisibility(View.GONE); - } accountSetupBinding = AccountSetupBinding.inflate(getLayoutInflater()); setContentView(accountSetupBinding.getRoot()); initOverallUi(); @@ -1341,10 +1170,6 @@ public void onAuthenticatorTaskCallback(RemoteOperationResult result) } else { // authorization fail due to client side - probably wrong credentials if (accountSetupWebviewBinding != null) { anonymouslyPostLoginRequest(mServerInfo.mBaseUrl + WEB_LOGIN); - // initWebViewLogin(mServerInfo.mBaseUrl + WEB_LOGIN, false); - DisplayUtils.showSnackMessage(this, - accountSetupWebviewBinding.loginWebview, R.string.auth_access_failed, - result.getLogMessage()); } else { DisplayUtils.showSnackMessage(this, R.string.auth_access_failed, result.getLogMessage()); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index c21c2596bbb9..30ecb54b40c8 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -72,7 +72,7 @@ public void onUrlLoaded(String loadedUrl) { this.url = loadedUrl; if (!url.isEmpty()) { - new WebViewUtil(getApplicationContext()).setProxyKKPlus(this.getWebView()); + new WebViewUtil().setProxyKKPlus(this.getWebView()); try { Thread.sleep(1000); } catch (InterruptedException e) { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index d7c529334c3c..dad57adc3398 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -147,7 +147,7 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request } }); - new WebViewUtil(getApplicationContext()).setProxyKKPlus(getWebView()); + new WebViewUtil().setProxyKKPlus(getWebView()); getWebView().loadUrl(url); } diff --git a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt index b01224217948..2983ab54657c 100644 --- a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt +++ b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt @@ -10,98 +10,16 @@ package com.owncloud.android.utils import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.net.Proxy -import android.net.Uri import android.text.TextUtils import android.util.ArrayMap import android.util.Log import android.webkit.WebView -import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.owncloud.android.R import com.owncloud.android.lib.common.OwnCloudClientManagerFactory import java.io.PrintWriter import java.io.StringWriter -class WebViewUtil(private val context: Context) { - - private val packageName = "com.google.android.webview" - - fun checkWebViewVersion() { - if (!isWebViewVersionValid()) { - showUpdateDialog() - } - } - - private fun isWebViewVersionValid(): Boolean { - val currentWebViewVersion = getCurrentWebViewMajorVersion() ?: return true - val minSupportedWebViewVersion: String = getMinimumSupportedMajorWebViewVersion() - return currentWebViewVersion.toInt() >= minSupportedWebViewVersion.toInt() - } - - private fun showUpdateDialog() { - val builder = MaterialAlertDialogBuilder(context) - .setTitle(context.getString(R.string.webview_version_check_alert_dialog_title)) - .setMessage(context.getString(R.string.webview_version_check_alert_dialog_message)) - .setCancelable(false) - .setPositiveButton( - context.getString(R.string.webview_version_check_alert_dialog_positive_button_title) - ) { _, _ -> - redirectToAndroidSystemWebViewStorePage() - } - - val dialog = builder.create() - dialog.show() - } - - private fun redirectToAndroidSystemWebViewStorePage() { - val uri = Uri.parse("market://details?id=$packageName") - val intent = Intent(Intent.ACTION_VIEW, uri) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - - try { - context.startActivity(intent) - } catch (e: android.content.ActivityNotFoundException) { - redirectToPlayStoreWebsiteForAndroidSystemWebView() - } - } - - private fun redirectToPlayStoreWebsiteForAndroidSystemWebView() { - val playStoreWebUri = Uri.parse("https://play.google.com/store/apps/details?id=$packageName") - val webIntent = Intent(Intent.ACTION_VIEW, playStoreWebUri) - context.startActivity(webIntent) - } - - private fun getCurrentWebViewMajorVersion(): String? { - val pm: PackageManager = context.packageManager - - return try { - val pi = pm.getPackageInfo("com.google.android.webview", 0) - val fullVersion = pi.versionName ?: return null - - // Split the version string by "." and get the first part - val versionParts = fullVersion.split("\\.".toRegex()).dropLastWhile { it.isEmpty() } - .toTypedArray() - - if (versionParts.isNotEmpty()) { - versionParts[0] - } else { - null - } - } catch (e: PackageManager.NameNotFoundException) { - null - } - } - - /** - * Ideally we should fetch from database, reading actual value - * from PlayStore not feasible due to frequently api changes made by - * Google - * - */ - private fun getMinimumSupportedMajorWebViewVersion(): String { - return "118" - } +class WebViewUtil { /** * From https://stackoverflow.com/a/18453384 diff --git a/app/src/main/res/layout/account_setup_webview.xml b/app/src/main/res/layout/account_setup_webview.xml index 583aa20126ea..91c6cd8d4efc 100644 --- a/app/src/main/res/layout/account_setup_webview.xml +++ b/app/src/main/res/layout/account_setup_webview.xml @@ -12,15 +12,6 @@ xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"> - - - - - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 257ef2ac637f..2ecb1a0c682e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1123,9 +1123,6 @@ Close Login with %1$s to %2$s Login via direct link failed! - Update Android System WebView - Please update the Android System WebView app for a login - Update Counter is too old Hash not found @@ -1152,7 +1149,6 @@ Delete Link Settings Confirm - Strict mode: no HTTP connection allowed! Destination filename Suggest Enter destination filename