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: