/*
- * Copyright © 2019-2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2019-2022 Soren Stoutner <soren@stoutner.com>.
*
- * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
- * Privacy Browser is free software: you can redistribute it and/or modify
+ * Privacy Browser Android 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.
*
- * Privacy Browser is distributed in the hope that it will be useful,
+ * Privacy Browser Android 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 Privacy Browser. If not, see <http://www.gnu.org/licenses/>.
+ * along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>.
*/
package com.stoutner.privacybrowser.views
+import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Bitmap
import android.os.Bundle
import android.util.AttributeSet
import android.view.MotionEvent
-import android.webkit.WebView
-import android.webkit.SslErrorHandler
import android.webkit.HttpAuthHandler
+import android.webkit.SslErrorHandler
+import android.webkit.WebView
import androidx.core.content.ContextCompat
import androidx.core.view.NestedScrollingChild2
import androidx.core.view.ViewCompat
import com.stoutner.privacybrowser.R
+import com.stoutner.privacybrowser.activities.MainWebViewActivity
import java.util.Collections
import java.util.Date
// NestedScrollWebView extends WebView to handle nested scrolls (scrolling the app bar off the screen). It also stores extra information about the state of the WebView used by Privacy Browser.
class NestedScrollWebView @JvmOverloads constructor(context: Context, attributeSet: AttributeSet? = null, defaultStyle: Int = android.R.attr.webViewStyle) : WebView(context, attributeSet, defaultStyle),
NestedScrollingChild2 {
-
companion object {
- // Define the companion object blocklists constants. These can be moved to class constants once all of the code has transitioned to Kotlin.
+ // Define the public companion object constants. These can be moved to public class constants once the entire project has migrated to Kotlin.
const val BLOCKED_REQUESTS = 0
const val EASYLIST = 1
const val EASYPRIVACY = 2
private var ultraListBlockedRequests = 0
private var ultraPrivacyBlockedRequests = 0
private var thirdPartyBlockedRequests = 0
+ private var xRequestedWithHeader = mutableMapOf<String, String>()
init {
// Enable nested scrolling by default.
hasPinnedSslCertificate = true
}
- fun getPinnedSslCertificate(): ArrayList<Any> {
- // Initialize an array list.
- val arrayList = ArrayList<Any>()
-
+ fun getPinnedSslCertificate(): Pair<Array<String>, Array<Date>> {
// Create the SSL certificate string array.
val sslCertificateStringArray = arrayOf(pinnedSslIssuedToCName, pinnedSslIssuedToOName, pinnedSslIssuedToUName, pinnedSslIssuedByCName, pinnedSslIssuedByOName, pinnedSslIssuedByUName)
// Create the SSL certificate date array.
val sslCertificateDateArray = arrayOf(pinnedSslStartDate, pinnedSslEndDate)
- // Add the arrays to the array list.
- arrayList.add(sslCertificateStringArray)
- arrayList.add(sslCertificateDateArray)
-
- // Return the pinned SSL certificate array list.
- return arrayList
+ // Return the pinned SSL certificate pair.
+ return Pair(sslCertificateStringArray, sslCertificateDateArray)
}
fun clearPinnedSslCertificate() {
}
+ // X-Requested-With header.
+ fun getXRequestedWithHeader() : MutableMap<String, String> {
+ // Return the X-Requested-With header.
+ return xRequestedWithHeader
+ }
+
+ fun setXRequestedWithHeader() {
+ // Set the X-Requested-With header to use a null value.
+ if (xRequestedWithHeader.isEmpty())
+ xRequestedWithHeader["X-Requested-With"] = ""
+ }
+
+ fun resetXRequestedWithHeader() {
+ // Clear the map, which resets the X-Requested-With header to use the default value of the application ID (com.stoutner.privacybrowser.standard).
+ xRequestedWithHeader.clear()
+ }
+
+
// Publicly expose the scroll ranges.
fun getHorizontalScrollRange(): Int {
// Return the horizontal scroll range.
return computeVerticalScrollRange()
}
+ override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {
+ // Run the default commands.
+ super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)
+
+ // Display the bottom app bar if it has been hidden and the WebView was over-scrolled at the top of the screen.
+ if ((MainWebViewActivity.appBarLayout.translationY != 0f) && (scrollY == 0) && clampedY) {
+ // Animate the bottom app bar onto the screen.
+ val objectAnimator = ObjectAnimator.ofFloat(MainWebViewActivity.appBarLayout, "translationY", 0f)
+
+ // Make it so.
+ objectAnimator.start()
+ }
+ }
// Handle touches.
@SuppressLint("ClickableViewAccessibility")