diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/SettingsFragment.kt b/app/src/main/java/io/homeassistant/companion/android/settings/SettingsFragment.kt index b63b88c46b3..121f4bdfe79 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/SettingsFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/SettingsFragment.kt @@ -163,6 +163,16 @@ class SettingsFragment( } } + findPreference("page_zoom")?.let { + // The list of percentages for iOS/Android should match + // https://github.com/home-assistant/iOS/blob/ff66bbf2e3f9add0abb0b492499b81e824db36ed/Sources/Shared/Settings/SettingsStore.swift#L108 + val percentages = listOf(50, 75, 85, 100, 115, 125, 150, 175, 200) + it.entries = percentages.map { pct -> + getString(if (pct == 100) commonR.string.page_zoom_default else commonR.string.page_zoom_pct, pct) + }.toTypedArray() + it.entryValues = percentages.map { pct -> pct.toString() }.toTypedArray() + } + findPreference("widgets")?.isVisible = Build.MODEL != "Quest" findPreference("manage_widgets")?.setOnPreferenceClickListener { parentFragmentManager.commit { 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 53adb0b8212..5e8887fe0e6 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 @@ -110,6 +110,7 @@ class SettingsPresenterImpl @Inject constructor( when (key) { "themes" -> themesManager.getCurrentTheme() "languages" -> langsManager.getCurrentLang() + "page_zoom" -> prefsRepository.getPageZoomLevel().toString() "screen_orientation" -> prefsRepository.getScreenOrientation() else -> throw IllegalArgumentException("No string found by this key: $key") } @@ -120,6 +121,7 @@ class SettingsPresenterImpl @Inject constructor( when (key) { "themes" -> themesManager.saveTheme(value) "languages" -> langsManager.saveLang(value) + "page_zoom" -> prefsRepository.setPageZoomLevel(value?.toIntOrNull()) "screen_orientation" -> prefsRepository.saveScreenOrientation(value) else -> throw IllegalArgumentException("No string found by this key: $key") } 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 efecb7d8971..2c481d60dba 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 @@ -346,7 +346,7 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi webView.clearHistory() clearHistory = false } - enablePinchToZoom() + setWebViewZoom() if (moreInfoEntity != "" && view?.progress == 100 && isConnected) { ioScope.launch { val owner = "onPageFinished:$moreInfoEntity" @@ -880,7 +880,7 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi appLocked = presenter.isAppLocked() binding.blurView.setBlurEnabled(appLocked) - enablePinchToZoom() + setWebViewZoom() WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG || presenter.isWebViewDebugEnabled()) @@ -1610,7 +1610,10 @@ class WebViewActivity : BaseActivity(), io.homeassistant.companion.android.webvi return super.dispatchKeyEvent(event) } - private fun enablePinchToZoom() { + private fun setWebViewZoom() { + // Set base zoom level (percentage must be scaled to device density/percentage) + webView.setInitialScale((resources.displayMetrics.density * presenter.getPageZoomLevel()).toInt()) + // Enable pinch to zoom webView.settings.builtInZoomControls = presenter.isPinchToZoomEnabled() // Use idea from https://github.com/home-assistant/iOS/pull/1472 to filter viewport 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 82a9035ae34..8546d3acd7a 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 @@ -30,6 +30,7 @@ interface WebViewPresenter { fun isKeepScreenOnEnabled(): Boolean + fun getPageZoomLevel(): Int fun isPinchToZoomEnabled(): Boolean fun isWebViewDebugEnabled(): 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 f0ae26703c0..c8cef2222d2 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 @@ -252,6 +252,10 @@ class WebViewPresenterImpl @Inject constructor( prefsRepository.isKeepScreenOnEnabled() } + override fun getPageZoomLevel(): Int = runBlocking { + prefsRepository.getPageZoomLevel() + } + override fun isPinchToZoomEnabled(): Boolean = runBlocking { prefsRepository.isPinchToZoomEnabled() } diff --git a/app/src/main/res/drawable/ic_zoom_in.xml b/app/src/main/res/drawable/ic_zoom_in.xml new file mode 100644 index 00000000000..6f953bd040e --- /dev/null +++ b/app/src/main/res/drawable/ic_zoom_in.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1b816edffcb..35d42eb8b36 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -55,6 +55,11 @@ android:icon="@drawable/ic_phone_check" android:title="@string/keep_screen_on" android:summary="@string/keep_screen_on_def"/> + In view Do not lock screen when dashboard is active Keep screen on + %1$d%% (default) + %1$d%% + Page zoom Allow pinch-to-zoom gesture to zoom app window Pinch-to-zoom Attribute: