X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FViewSourceActivity.kt;h=759b79c0fb00ebbbe91fc20bb21e002392c4bfb7;hp=173313f65da654b540f2d88af163bc59ba176aa3;hb=322b36f275782a06ed66b950083f28cc37f5690a;hpb=d941ca283544e1c3231f59796a3f64270e747a99 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/ViewSourceActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/ViewSourceActivity.kt index 173313f6..759b79c0 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/ViewSourceActivity.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/ViewSourceActivity.kt @@ -50,6 +50,8 @@ import com.google.android.material.snackbar.Snackbar import com.stoutner.privacybrowser.R import com.stoutner.privacybrowser.dialogs.AboutViewSourceDialog +import com.stoutner.privacybrowser.dialogs.UntrustedSslCertificateDialog +import com.stoutner.privacybrowser.dialogs.UntrustedSslCertificateDialog.UntrustedSslCertificateListener import com.stoutner.privacybrowser.helpers.ProxyHelper import com.stoutner.privacybrowser.viewmodelfactories.WebViewSourceFactory import com.stoutner.privacybrowser.viewmodels.WebViewSource @@ -60,18 +62,29 @@ import java.util.Locale const val CURRENT_URL = "current_url" const val USER_AGENT = "user_agent" -class ViewSourceActivity: AppCompatActivity() { +class ViewSourceActivity: AppCompatActivity(), UntrustedSslCertificateListener { // Declare the class variables. private lateinit var initialGrayColorSpan: ForegroundColorSpan private lateinit var finalGrayColorSpan: ForegroundColorSpan private lateinit var redColorSpan: ForegroundColorSpan + private lateinit var webViewSource: WebViewSource + + // Declare the class views. + private lateinit var urlEditText: EditText + private lateinit var requestHeadersTitleTextView: TextView + private lateinit var requestHeadersTextView: TextView + private lateinit var responseMessageTitleTextView: TextView + private lateinit var responseMessageTextView: TextView + private lateinit var responseHeadersTitleTextView: TextView + private lateinit var responseBodyTitleTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { // Get a handle for the shared preferences. val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext) - // Get the screenshot preference. + // Get the preferences. val allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false) + val bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false) // Disable screenshots if not allowed. if (!allowScreenshots) { @@ -88,11 +101,15 @@ class ViewSourceActivity: AppCompatActivity() { val intent = intent // Get the information from the intent. - val currentUrl = intent.getStringExtra(CURRENT_URL) - val userAgent = intent.getStringExtra(USER_AGENT) + val currentUrl = intent.getStringExtra(CURRENT_URL)!! + val userAgent = intent.getStringExtra(USER_AGENT)!! // Set the content view. - setContentView(R.layout.view_source_coordinatorlayout) + if (bottomAppBar) { + setContentView(R.layout.view_source_bottom_appbar) + } else { + setContentView(R.layout.view_source_top_appbar) + } // Get a handle for the toolbar. val toolbar = findViewById(R.id.view_source_toolbar) @@ -110,13 +127,17 @@ class ViewSourceActivity: AppCompatActivity() { actionBar.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM // Get handles for the views. - val urlEditText = findViewById(R.id.url_edittext) - val requestHeadersTextView = findViewById(R.id.request_headers) - val responseMessageTextView = findViewById(R.id.response_message) - val responseHeadersTextView = findViewById(R.id.response_headers) - val responseBodyTextView = findViewById(R.id.response_body) + urlEditText = findViewById(R.id.url_edittext) val progressBar = findViewById(R.id.progress_bar) val swipeRefreshLayout = findViewById(R.id.view_source_swiperefreshlayout) + requestHeadersTitleTextView = findViewById(R.id.request_headers_title_textview) + requestHeadersTextView = findViewById(R.id.request_headers_textview) + responseMessageTitleTextView = findViewById(R.id.response_message_title_textview) + responseMessageTextView = findViewById(R.id.response_message_textview) + responseHeadersTitleTextView = findViewById(R.id.response_headers_title_textivew) + val responseHeadersTextView = findViewById(R.id.response_headers_textview) + responseBodyTitleTextView = findViewById(R.id.response_body_title_textview) + val responseBodyTextView = findViewById(R.id.response_body_textview) // Populate the URL text box. urlEditText.setText(currentUrl) @@ -165,11 +186,7 @@ class ViewSourceActivity: AppCompatActivity() { } // Set the refresh color scheme according to the theme. - if (currentThemeStatus == Configuration.UI_MODE_NIGHT_NO) { - swipeRefreshLayout.setColorSchemeResources(R.color.blue_700) - } else { - swipeRefreshLayout.setColorSchemeResources(R.color.violet_500) - } + swipeRefreshLayout.setColorSchemeResources(R.color.blue_text) // Initialize a color background typed value. val colorBackgroundTypedValue = TypedValue() @@ -253,11 +270,14 @@ class ViewSourceActivity: AppCompatActivity() { // Set the progress bar to be indeterminate. progressBar.isIndeterminate = true + // Update the layout. + updateLayout(currentUrl) + // Instantiate the WebView source factory. - val webViewSourceFactory: ViewModelProvider.Factory = WebViewSourceFactory(currentUrl!!, userAgent!!, localeString, proxy, MainWebViewActivity.executorService) + val webViewSourceFactory: ViewModelProvider.Factory = WebViewSourceFactory(currentUrl, userAgent, localeString, proxy, contentResolver, MainWebViewActivity.executorService) // Instantiate the WebView source view model class. - val webViewSource = ViewModelProvider(this, webViewSourceFactory).get(WebViewSource::class.java) + webViewSource = ViewModelProvider(this, webViewSourceFactory).get(WebViewSource::class.java) // Create a source observer. webViewSource.observeSource().observe(this, { sourceStringArray: Array -> @@ -279,7 +299,16 @@ class ViewSourceActivity: AppCompatActivity() { webViewSource.observeErrors().observe(this, { errorString: String -> // Display an error snackbar if the string is not `""`. if (errorString != "") { - Snackbar.make(swipeRefreshLayout, errorString, Snackbar.LENGTH_LONG).show() + if (errorString.startsWith("javax.net.ssl.SSLHandshakeException")) { + // Instantiate the untrusted SSL certificate dialog. + val untrustedSslCertificateDialog = UntrustedSslCertificateDialog() + + // Show the untrusted SSL certificate dialog. + untrustedSslCertificateDialog.show(supportFragmentManager, getString(R.string.invalid_certificate)) + } else { + // Display a snackbar with the error message. + Snackbar.make(swipeRefreshLayout, errorString, Snackbar.LENGTH_LONG).show() + } } }) @@ -294,8 +323,11 @@ class ViewSourceActivity: AppCompatActivity() { // Get the URL. val urlString = urlEditText.text.toString() + // Update the layout. + updateLayout(urlString) + // Get the updated source. - webViewSource.updateSource(urlString) + webViewSource.updateSource(urlString, false) } // Set the go button on the keyboard to request new source data. @@ -317,8 +349,11 @@ class ViewSourceActivity: AppCompatActivity() { // Get the URL. val urlString = urlEditText.text.toString() + // Update the layout. + updateLayout(urlString) + // Get the updated source. - webViewSource.updateSource(urlString) + webViewSource.updateSource(urlString, false) // Consume the key press. return@setOnKeyListener true @@ -330,7 +365,7 @@ class ViewSourceActivity: AppCompatActivity() { } override fun onCreateOptionsMenu(menu: Menu): Boolean { - // Inflate the menu. This adds items to the action bar if it is present. + // Inflate the menu. menuInflater.inflate(R.menu.view_source_options_menu, menu) // Display the menu. @@ -338,7 +373,7 @@ class ViewSourceActivity: AppCompatActivity() { } override fun onOptionsItemSelected(menuItem: MenuItem): Boolean { - // Get a handle for the about alert dialog. + // Instantiate the about dialog fragment. val aboutDialogFragment: DialogFragment = AboutViewSourceDialog() // Show the about alert dialog. @@ -354,6 +389,11 @@ class ViewSourceActivity: AppCompatActivity() { NavUtils.navigateUpFromSameTask(this) } + override fun loadAnyway() { + // Load the URL anyway. + webViewSource.updateSource(urlEditText.text.toString(), true) + } + private fun highlightUrlText() { // Get a handle for the URL edit text. val urlEditText = findViewById(R.id.url_edittext) @@ -411,4 +451,28 @@ class ViewSourceActivity: AppCompatActivity() { } } } + + private fun updateLayout(urlString: String) { + if (urlString.startsWith("content://")) { // This is a content URL. + // Hide the unused text views. + requestHeadersTitleTextView.visibility = View.GONE + requestHeadersTextView.visibility = View.GONE + responseMessageTitleTextView.visibility = View.GONE + responseMessageTextView.visibility = View.GONE + + // Change the text of the remaining title text views. + responseHeadersTitleTextView.setText(R.string.content_metadata) + responseBodyTitleTextView.setText(R.string.content_data) + } else { // This is not a content URL. + // Show the views. + requestHeadersTitleTextView.visibility = View.VISIBLE + requestHeadersTextView.visibility = View.VISIBLE + responseMessageTitleTextView.visibility = View.VISIBLE + responseMessageTextView.visibility = View.VISIBLE + + // Restore the text of the other title text views. + responseHeadersTitleTextView.setText(R.string.response_headers) + responseBodyTitleTextView.setText(R.string.response_body) + } + } } \ No newline at end of file