mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
Merge pull request #1965 from nextcloud/bugfix/noid/catch-npe-on-view-bindings
Catch NPEs on view bindings
This commit is contained in:
commit
cd2e9492f8
@ -701,10 +701,16 @@ class ChatController(args: Bundle) :
|
|||||||
showMicrophoneButton(true)
|
showMicrophoneButton(true)
|
||||||
|
|
||||||
binding.messageInputView.messageInput.doAfterTextChanged {
|
binding.messageInputView.messageInput.doAfterTextChanged {
|
||||||
if (binding.messageInputView.messageInput.text.isEmpty()) {
|
try {
|
||||||
showMicrophoneButton(true)
|
if (binding.messageInputView.messageInput.text.isEmpty()) {
|
||||||
} else {
|
showMicrophoneButton(true)
|
||||||
showMicrophoneButton(false)
|
} else {
|
||||||
|
showMicrophoneButton(false)
|
||||||
|
}
|
||||||
|
} catch (npe: NullPointerException) {
|
||||||
|
// view binding can be null
|
||||||
|
// since this is called asynchronously and UI might have been destroyed in the meantime
|
||||||
|
Log.i(TAG, "UI destroyed - view binding already gone")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,6 @@ import retrofit2.Response
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.ArrayList
|
|
||||||
import java.util.LinkedList
|
import java.util.LinkedList
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -341,13 +340,20 @@ class ProfileController : NewBaseController(R.layout.controller_profile) {
|
|||||||
if (activity == null) {
|
if (activity == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
binding.emptyList.emptyListViewHeadline.text = headline
|
|
||||||
binding.emptyList.emptyListViewText.text = message
|
try {
|
||||||
binding.emptyList.emptyListIcon.setImageResource(errorResource)
|
binding.emptyList.emptyListViewHeadline.text = headline
|
||||||
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
|
binding.emptyList.emptyListViewText.text = message
|
||||||
binding.emptyList.emptyListViewText.visibility = View.VISIBLE
|
binding.emptyList.emptyListIcon.setImageResource(errorResource)
|
||||||
binding.userinfoList.visibility = View.GONE
|
binding.emptyList.emptyListIcon.visibility = View.VISIBLE
|
||||||
binding.loadingContent.visibility = View.GONE
|
binding.emptyList.emptyListViewText.visibility = View.VISIBLE
|
||||||
|
binding.userinfoList.visibility = View.GONE
|
||||||
|
binding.loadingContent.visibility = View.GONE
|
||||||
|
} catch (npe: NullPointerException) {
|
||||||
|
// view binding can be null
|
||||||
|
// since this is called asynchronously and UI might have been destroyed in the meantime
|
||||||
|
Log.i(TAG, "UI destroyed - view binding already gone")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createUserInfoDetails(userInfo: UserProfileData?): List<UserInfoDetailsItem> {
|
private fun createUserInfoDetails(userInfo: UserProfileData?): List<UserInfoDetailsItem> {
|
||||||
|
@ -21,12 +21,14 @@
|
|||||||
*/
|
*/
|
||||||
package com.nextcloud.talk.controllers
|
package com.nextcloud.talk.controllers
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.security.KeyChain
|
import android.security.KeyChain
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.util.Log
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
@ -188,23 +190,30 @@ class ServerSelectionController :
|
|||||||
binding.certTextView.setOnClickListener { onCertClick() }
|
binding.certTextView.setOnClickListener { onCertClick() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("LongLogTag")
|
||||||
private fun checkServerAndProceed() {
|
private fun checkServerAndProceed() {
|
||||||
dispose()
|
dispose()
|
||||||
var url: String = binding.serverEntryTextInputEditText.text.toString().trim { it <= ' ' }
|
try {
|
||||||
binding.serverEntryTextInputEditText.isEnabled = false
|
var url: String = binding.serverEntryTextInputEditText.text.toString().trim { it <= ' ' }
|
||||||
showserverEntryProgressBar()
|
binding.serverEntryTextInputEditText.isEnabled = false
|
||||||
if (binding.helperTextView.visibility != View.INVISIBLE) {
|
showserverEntryProgressBar()
|
||||||
binding.helperTextView.visibility = View.INVISIBLE
|
if (binding.helperTextView.visibility != View.INVISIBLE) {
|
||||||
binding.certTextView.visibility = View.INVISIBLE
|
binding.helperTextView.visibility = View.INVISIBLE
|
||||||
}
|
binding.certTextView.visibility = View.INVISIBLE
|
||||||
if (url.endsWith("/")) {
|
}
|
||||||
url = url.substring(0, url.length - 1)
|
if (url.endsWith("/")) {
|
||||||
}
|
url = url.substring(0, url.length - 1)
|
||||||
val queryUrl = url + ApiUtils.getUrlPostfixForStatus()
|
}
|
||||||
if (UriUtils.hasHttpProtocollPrefixed(url)) {
|
val queryUrl = url + ApiUtils.getUrlPostfixForStatus()
|
||||||
checkServer(queryUrl, false)
|
if (UriUtils.hasHttpProtocollPrefixed(url)) {
|
||||||
} else {
|
checkServer(queryUrl, false)
|
||||||
checkServer("https://$queryUrl", true)
|
} else {
|
||||||
|
checkServer("https://$queryUrl", true)
|
||||||
|
}
|
||||||
|
} catch (npe: NullPointerException) {
|
||||||
|
// view binding can be null
|
||||||
|
// since this is called asynchronously and UI might have been destroyed in the meantime
|
||||||
|
Log.i(TAG, "UI destroyed - view binding already gone")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ import android.os.Bundle
|
|||||||
import android.security.KeyChain
|
import android.security.KeyChain
|
||||||
import android.security.KeyChainException
|
import android.security.KeyChainException
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.webkit.ClientCertRequest
|
import android.webkit.ClientCertRequest
|
||||||
import android.webkit.CookieSyncManager
|
import android.webkit.CookieSyncManager
|
||||||
@ -77,7 +78,6 @@ import java.net.URLDecoder
|
|||||||
import java.security.PrivateKey
|
import java.security.PrivateKey
|
||||||
import java.security.cert.CertificateException
|
import java.security.cert.CertificateException
|
||||||
import java.security.cert.X509Certificate
|
import java.security.cert.X509Certificate
|
||||||
import java.util.HashMap
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -183,32 +183,41 @@ class WebViewLoginController(args: Bundle? = null) : NewBaseController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onPageFinished(view: WebView, url: String) {
|
override fun onPageFinished(view: WebView, url: String) {
|
||||||
loginStep++
|
try {
|
||||||
if (!basePageLoaded) {
|
loginStep++
|
||||||
binding.progressBar.visibility = View.GONE
|
if (!basePageLoaded) {
|
||||||
binding.webview.visibility = View.VISIBLE
|
binding.progressBar.visibility = View.GONE
|
||||||
|
binding.webview.visibility = View.VISIBLE
|
||||||
|
|
||||||
basePageLoaded = true
|
basePageLoaded = true
|
||||||
}
|
}
|
||||||
if (!TextUtils.isEmpty(username)) {
|
if (!TextUtils.isEmpty(username)) {
|
||||||
if (loginStep == 1) {
|
if (loginStep == 1) {
|
||||||
binding.webview.loadUrl("javascript: {document.getElementsByClassName('login')[0].click(); };")
|
|
||||||
} else if (!automatedLoginAttempted) {
|
|
||||||
automatedLoginAttempted = true
|
|
||||||
if (TextUtils.isEmpty(password)) {
|
|
||||||
binding.webview.loadUrl(
|
binding.webview.loadUrl(
|
||||||
"javascript:var justStore = document.getElementById('user').value = '$username';"
|
"javascript: {document.getElementsByClassName('login')[0].click(); };"
|
||||||
)
|
|
||||||
} else {
|
|
||||||
binding.webview.loadUrl(
|
|
||||||
"javascript: {" +
|
|
||||||
"document.getElementById('user').value = '" + username + "';" +
|
|
||||||
"document.getElementById('password').value = '" + password + "';" +
|
|
||||||
"document.getElementById('submit').click(); };"
|
|
||||||
)
|
)
|
||||||
|
} else if (!automatedLoginAttempted) {
|
||||||
|
automatedLoginAttempted = true
|
||||||
|
if (TextUtils.isEmpty(password)) {
|
||||||
|
binding.webview.loadUrl(
|
||||||
|
"javascript:var justStore = document.getElementById('user').value = '$username';"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
binding.webview.loadUrl(
|
||||||
|
"javascript: {" +
|
||||||
|
"document.getElementById('user').value = '" + username + "';" +
|
||||||
|
"document.getElementById('password').value = '" + password + "';" +
|
||||||
|
"document.getElementById('submit').click(); };"
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (npe: NullPointerException) {
|
||||||
|
// view binding can be null
|
||||||
|
// since this is called asynchronously and UI might have been destroyed in the meantime
|
||||||
|
Log.i(TAG, "UI destroyed - view binding already gone")
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onPageFinished(view, url)
|
super.onPageFinished(view, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user