Понял вас. Вы столкнулись с двумя классическими ограничениями Android, которые невозможно решить стандартными средствами CustomTabsIntent. Вы не один такой, эти проблемы всплывают постоянно.
Давайте разберемся, почему это происходит, и как обойти эти ограничения.
Проблема 1: Почему приложение не переворачивается, если включена блокировка ориентации
Вы используете requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, но система это игнорирует.
Причина: Начиная с Android 12, Google изменил политику безопасности. Если пользователь в настройках системы включил «Автоповорот» в положение «Заблокировано» (или зафиксировал портретный режим), система принудительно заставляет приложение следовать этому выбору пользователя, игнорируя программный код приложения. Это сделано для того, чтобы уважать предпочтения пользователя.
Решение: Использовать специальный флаг, который «обманывает» систему и заставляет её игнорировать настройки пользователя.
В Android есть флаг SCREEN_ORIENTATION_NOSENSOR или SCREEN_ORIENTATION_LOCKED в сочетании с некоторыми трюками. Но самый надежный способ — это Trusted Web Activity (TWA).
Если вы используете TWA (а не просто Custom Tabs), то вы можете управлять ориентацией более жестко.
Код для TWA (если решите перейти на него):
kotlin
// Вместо CustomTabsIntent используем TWA Launcher
val launcher = TrustedWebActivityIntentBuilder(Uri.parse(url))
.setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
.build()
launcher.launch(this)
Этот подход дает приложению больше контроля, так как TWA — это не просто «вкладка», а полноценный режим отображения веб-контента.
Проблема 2: Почему не получается скрыть адресную строку
Вы пытались использовать builder.setUrlBarHidingEnabled(true) и enableUrlBarHiding(), но безуспешно.
Причина: Эти методы не скрывают адресную строку навсегда. Они лишь разрешают ей исчезать при прокрутке страницы вниз. Как только пользователь прокрутит страницу вверх, адресная строка снова появится. Это сделано для безопасности, чтобы пользователь всегда знал, на каком сайте он находится (защита от фишинга).
Фундаментальное ограничение: В стандартном CustomTabsIntent не существует способа полностью убрать адресную строку. Это невозможно.
Решение: Единственный официальный способ скрыть адресную строку полностью — это Trusted Web Activity (TWA).
TWA — это технология, которая позволяет открывать веб-сайт в полноэкранном режиме, как нативное приложение, без элементов интерфейса браузера (адресной строки, кнопок). Для этого нужно, чтобы ваш сайт поддерживал Digital Asset Links (то есть вы должны владеть доменом, который открываете, и разместить там специальный файл assetlinks.json).
Как это выглядит в коде (TWA):
kotlin
// Требуется библиотека androidx.browser:browser
val intent = TrustedWebActivityIntentBuilder(Uri.parse(url))
.build()
intent.launch(this)
После настройки ассоциации сайта, TWA откроется на весь экран без адресной строки.
Альтернативный путь: WebView
Если TWA вам не подходит (например, сайт чужой, и вы не можете разместить assetlinks.json), то единственный способ получить полный контроль — это использовать WebView вместо CustomTabsIntent.
WebView — это полноценный браузер внутри вашего приложения, и вы можете убрать все его элементы управления.
Пример кода:
kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Устанавливаем ориентацию
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
// Создаем WebView программно
val webView = WebView(this)
webView.settings.javaScriptEnabled = true
webView.webViewClient = WebViewClient() // Чтобы ссылки открывались внутри
webView.loadUrl("https://www.google.com")
// Устанавливаем WebView как контент
setContentView(webView)
}
}
Этот способ дает вам полный контроль над интерфейсом (адресной строки вообще не будет), но он менее безопасен (пользователь не видит URL) и может не иметь всех функций современного браузера.
Итог
В вашем текущем подходе (Custom Tabs) эти две проблемы неразрешимы из-за политик безопасности Android и ограничений самой библиотеки.
Что делать:
Для скрытия адресной строки: Переходите на Trusted Web Activity (если сайт ваш) или на WebView (если сайт чужой).
Для принудительного ландшафта: В TWA это решается через setScreenOrientation. В WebView вы можете просто игнорировать системные настройки, так как WebView — это часть вашего приложения.
Понял вашу задачу: вы хотите объединить две **локальные сети через WireGuard** (site-to-site), но у вас сейчас **только пингуется интерфейс wg0**, а доступ к локальным подсетям не работает. Судя по вашему конфигу, проблема связана с **маршрутизацией и NAT**. Давайте разберём по шагам.
1. `AllowedIPs = 0.0.0.0/0` — это **маршрут всего трафика через WireGuard**, что используется для VPN “к Интернету через сервер”, а не для подключения локальных сетей.
2. `PostUp` делает **маскарадинг для eth0** (т.е. NAT на интернет), что тоже не нужно, если цель — соединение двух локальных сетей напрямую.
3. **Нет маршрутов к локальным сетям** на стороне VDS или клиентской стороны.
---
### 2️⃣ Пример правильной настройки site-to-site
Допустим:
* **Сеть A (на сервере VDS)**: 192.168.1.0/24
* **Сеть B (на клиенте)**: 192.168.2.0/24
* **WireGuard туннель**: 10.10.10.0/24
2. **Маршруты на локальных машинах**:
Например, на машине в сети 192.168.1.0/24 нужно добавить маршрут к 192.168.2.0/24 через туннель 10.10.10.2:
```bash
sudo ip route add 192.168.2.0/24 via 10.10.10.2 dev wg0
```
И на другой стороне зеркально.
3. **NAT (MASQUERADE)** нужен только если вы хотите выход в интернет через туннель, а для site-to-site **лучше без NAT**, чтобы пакеты видели реальные локальные IP.
---
Если хотите, я могу прямо написать **готовый рабочий конфиг для вашего случая с VDS + локальная сеть**, где будет всё: маршруты, iptables, IP forwarding — чтобы после запуска можно было пинговать локальные сети напрямую.
Давайте разберемся, почему это происходит, и как обойти эти ограничения.
Проблема 1: Почему приложение не переворачивается, если включена блокировка ориентации
Вы используете requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, но система это игнорирует.
Причина: Начиная с Android 12, Google изменил политику безопасности. Если пользователь в настройках системы включил «Автоповорот» в положение «Заблокировано» (или зафиксировал портретный режим), система принудительно заставляет приложение следовать этому выбору пользователя, игнорируя программный код приложения. Это сделано для того, чтобы уважать предпочтения пользователя.
Решение: Использовать специальный флаг, который «обманывает» систему и заставляет её игнорировать настройки пользователя.
В Android есть флаг SCREEN_ORIENTATION_NOSENSOR или SCREEN_ORIENTATION_LOCKED в сочетании с некоторыми трюками. Но самый надежный способ — это Trusted Web Activity (TWA).
Если вы используете TWA (а не просто Custom Tabs), то вы можете управлять ориентацией более жестко.
Код для TWA (если решите перейти на него):
kotlin
// Вместо CustomTabsIntent используем TWA Launcher
val launcher = TrustedWebActivityIntentBuilder(Uri.parse(url))
.setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
.build()
launcher.launch(this)
Этот подход дает приложению больше контроля, так как TWA — это не просто «вкладка», а полноценный режим отображения веб-контента.
Проблема 2: Почему не получается скрыть адресную строку
Вы пытались использовать builder.setUrlBarHidingEnabled(true) и enableUrlBarHiding(), но безуспешно.
Причина: Эти методы не скрывают адресную строку навсегда. Они лишь разрешают ей исчезать при прокрутке страницы вниз. Как только пользователь прокрутит страницу вверх, адресная строка снова появится. Это сделано для безопасности, чтобы пользователь всегда знал, на каком сайте он находится (защита от фишинга).
Фундаментальное ограничение: В стандартном CustomTabsIntent не существует способа полностью убрать адресную строку. Это невозможно.
Решение: Единственный официальный способ скрыть адресную строку полностью — это Trusted Web Activity (TWA).
TWA — это технология, которая позволяет открывать веб-сайт в полноэкранном режиме, как нативное приложение, без элементов интерфейса браузера (адресной строки, кнопок). Для этого нужно, чтобы ваш сайт поддерживал Digital Asset Links (то есть вы должны владеть доменом, который открываете, и разместить там специальный файл assetlinks.json).
Как это выглядит в коде (TWA):
kotlin
// Требуется библиотека androidx.browser:browser
val intent = TrustedWebActivityIntentBuilder(Uri.parse(url))
.build()
intent.launch(this)
После настройки ассоциации сайта, TWA откроется на весь экран без адресной строки.
Альтернативный путь: WebView
Если TWA вам не подходит (например, сайт чужой, и вы не можете разместить assetlinks.json), то единственный способ получить полный контроль — это использовать WebView вместо CustomTabsIntent.
WebView — это полноценный браузер внутри вашего приложения, и вы можете убрать все его элементы управления.
Пример кода:
kotlin
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Устанавливаем ориентацию
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
// Создаем WebView программно
val webView = WebView(this)
webView.settings.javaScriptEnabled = true
webView.webViewClient = WebViewClient() // Чтобы ссылки открывались внутри
webView.loadUrl("https://www.google.com")
// Устанавливаем WebView как контент
setContentView(webView)
}
}
Этот способ дает вам полный контроль над интерфейсом (адресной строки вообще не будет), но он менее безопасен (пользователь не видит URL) и может не иметь всех функций современного браузера.
Итог
В вашем текущем подходе (Custom Tabs) эти две проблемы неразрешимы из-за политик безопасности Android и ограничений самой библиотеки.
Что делать:
Для скрытия адресной строки: Переходите на Trusted Web Activity (если сайт ваш) или на WebView (если сайт чужой).
Для принудительного ландшафта: В TWA это решается через setScreenOrientation. В WebView вы можете просто игнорировать системные настройки, так как WebView — это часть вашего приложения.