diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt b/app/src/main/java/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt index 0aff1f556cd..548383c867e 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt @@ -47,6 +47,7 @@ class SettingsPresenterImpl @Inject constructor( return@runBlocking when (key) { "fullscreen" -> integrationUseCase.isFullScreenEnabled() "keep_screen_on" -> integrationUseCase.isKeepScreenOnEnabled() + "pinch_to_zoom" -> integrationUseCase.isPinchToZoomEnabled() "app_lock" -> authenticationUseCase.isLockEnabled() "crash_reporting" -> prefsRepository.isCrashReporting() "prioritize_internal" -> urlUseCase.isPrioritizeInternal() @@ -61,6 +62,7 @@ class SettingsPresenterImpl @Inject constructor( when (key) { "fullscreen" -> integrationUseCase.setFullScreenEnabled(value) "keep_screen_on" -> integrationUseCase.setKeepScreenOnEnabled(value) + "pinch_to_zoom" -> integrationUseCase.setPinchToZoomEnabled(value) "app_lock" -> authenticationUseCase.setLockEnabled(value) "crash_reporting" -> prefsRepository.setCrashReporting(value) "prioritize_internal" -> urlUseCase.setPrioritizeInternal(value) diff --git a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewActivity.kt b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewActivity.kt index cc2d807aaa3..536131eceb4 100644 --- a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewActivity.kt +++ b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewActivity.kt @@ -249,6 +249,7 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi settings.javaScriptEnabled = true settings.domStorageEnabled = true + settings.displayZoomControls = false settings.mediaPlaybackRequiresUserGesture = !presenter.isAutoPlayVideoEnabled() settings.userAgentString = USER_AGENT_STRING + " ${Build.MODEL} ${BuildConfig.VERSION_NAME}" webViewClient = object : WebViewClient() { @@ -265,6 +266,7 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi } override fun onPageFinished(view: WebView?, url: String?) { + enablePinchToZoom() if (moreInfoEntity != "" && view?.progress == 100 && isConnected) { ioScope.launch { val owner = "onPageFinished:$moreInfoEntity" @@ -657,6 +659,8 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi binding.blurView.setBlurEnabled(false) } + enablePinchToZoom() + if (presenter.isKeepScreenOnEnabled()) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) else @@ -1311,4 +1315,33 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi return super.dispatchKeyEvent(event) } + + private fun enablePinchToZoom() { + // Enable pinch to zoom + webView.getSettings().setBuiltInZoomControls(presenter.isPinchToZoomEnabled()) + // Use idea from https://github.com/home-assistant/iOS/pull/1472 to filter viewport + val pinchToZoom = if (presenter.isPinchToZoomEnabled()) "true" else "false" + webView.evaluateJavascript( + """ + if (typeof viewport === 'undefined') { + var viewport = document.querySelector('meta[name="viewport"]'); + if (viewport != null && typeof original_elements === 'undefined') { + var original_elements = viewport['content']; + } + } + if (viewport != null) { + if ($pinchToZoom) { + const ignoredBits = ['user-scalable', 'minimum-scale', 'maximum-scale']; + let elements = viewport['content'].split(',').filter(contentItem => { + return ignoredBits.every(ignoredBit => !contentItem.includes(ignoredBit)); + }); + elements.push('user-scalable=yes'); + viewport['content'] = elements.join(','); + } else { + viewport['content'] = original_elements; + } + } + """ + ) {} + } } diff --git a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenter.kt b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenter.kt index 8371cbbb57e..71d7c2f67ac 100644 --- a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenter.kt +++ b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenter.kt @@ -16,6 +16,8 @@ interface WebViewPresenter { fun isKeepScreenOnEnabled(): Boolean + fun isPinchToZoomEnabled(): Boolean + fun isLockEnabled(): Boolean fun isAutoPlayVideoEnabled(): Boolean diff --git a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenterImpl.kt b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenterImpl.kt index 986ddec3b1a..ce85c44af95 100644 --- a/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenterImpl.kt +++ b/app/src/main/java/io/homeassistant/companion/android/webview/WebViewPresenterImpl.kt @@ -138,6 +138,12 @@ class WebViewPresenterImpl @Inject constructor( } } + override fun isPinchToZoomEnabled(): Boolean { + return runBlocking { + integrationUseCase.isPinchToZoomEnabled() + } + } + override fun isLockEnabled(): Boolean { return runBlocking { authenticationUseCase.isLockEnabled() diff --git a/app/src/main/res/drawable/ic_gesture_pinch.xml b/app/src/main/res/drawable/ic_gesture_pinch.xml new file mode 100644 index 00000000000..7d5df722389 --- /dev/null +++ b/app/src/main/res/drawable/ic_gesture_pinch.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 6822f05ec5a..0a144cdb399 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -80,6 +80,11 @@ android:icon="@drawable/ic_phone_check" android:title="@string/keep_screen_on" android:summary="@string/keep_screen_on_def"/> + This action is irreversible Do not lock screen when Lovelace dashboard is active Keep screen On + Allow Pinch-to-zoom gesture to zoom app window + Pinch To Zoom Attribute: Data: Entity ID: