diff --git a/lib/flavored/models/humhub.f.dart b/lib/flavored/models/humhub.f.dart index 1250a32..e79a0d2 100644 --- a/lib/flavored/models/humhub.f.dart +++ b/lib/flavored/models/humhub.f.dart @@ -27,7 +27,9 @@ class HumHubF extends HumHub { 'x-humhub-app-token': randomHash!, 'x-humhub-app': appVersion ?? '1.0.0', 'x-humhub-app-bundle-id': bundleId, - 'x-humhub-app-ostate': isHideOpener ? '1' : '0' + 'x-humhub-app-ostate': isHideOpener ? '1' : '0', + 'x-humhub-app-is-ios': isIos ? '1' : '0', + 'x-humhub-app-is-android': isAndroid ? '1' : '0' }; static Future initialize() async { diff --git a/lib/flavored/web_view.f.dart b/lib/flavored/web_view.f.dart index cdea1b3..8a1ed3c 100644 --- a/lib/flavored/web_view.f.dart +++ b/lib/flavored/web_view.f.dart @@ -113,6 +113,7 @@ class FlavoredWebViewState extends ConsumerState { // 1st check if url is not def. app url and open it in a browser or inApp. WebViewGlobalController.ajaxSetHeaders(headers: instance.customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); final url = action.request.url!.rawValue; /// First BLOCK everything that rules out as blocked. @@ -188,12 +189,14 @@ class FlavoredWebViewState extends ConsumerState { } WebViewGlobalController.ajaxSetHeaders(headers: instance.customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); LoadingProvider.of(ref).dismissAll(); } void _onLoadStart(InAppWebViewController controller, Uri? url) async { WebViewGlobalController.ajaxSetHeaders(headers: instance.customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); } void _onLoadError(InAppWebViewController controller, WebResourceRequest request, WebResourceError error) async { diff --git a/lib/models/hum_hub.dart b/lib/models/hum_hub.dart index cafb177..154789c 100644 --- a/lib/models/hum_hub.dart +++ b/lib/models/hum_hub.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; @@ -15,6 +16,8 @@ class HumHub { String? randomHash; String? appVersion; String? pushToken; + final bool isIos = Platform.isIOS || Platform.isMacOS; + final bool isAndroid = Platform.isAndroid; HumHub( {this.manifest, this.manifestUrl, this.isHideOpener = false, this.randomHash, this.appVersion, this.pushToken}); @@ -65,7 +68,9 @@ class HumHub { Map get customHeaders => { 'x-humhub-app-token': randomHash!, 'x-humhub-app': appVersion ?? '1.0.0', - 'x-humhub-app-ostate': isHideOpener ? '1' : '0' + 'x-humhub-app-ostate': isHideOpener ? '1' : '0', + 'x-humhub-app-is-ios': isIos ? '1' : '0', + 'x-humhub-app-is-android': isAndroid ? '1' : '0' }; static Future app(String bundleId) async { diff --git a/lib/pages/web_view.dart b/lib/pages/web_view.dart index a1271c2..445e2b2 100644 --- a/lib/pages/web_view.dart +++ b/lib/pages/web_view.dart @@ -139,6 +139,7 @@ class WebViewAppState extends ConsumerState { WebViewGlobalController.ajaxSetHeaders( headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); final url = action.request.url!.rawValue; @@ -232,6 +233,7 @@ class WebViewAppState extends ConsumerState { WebViewGlobalController.ajaxSetHeaders( headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); LoadingProvider.of(ref).dismissAll(); } @@ -239,6 +241,7 @@ class WebViewAppState extends ConsumerState { WebViewGlobalController.ajaxSetHeaders( headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); + WebViewGlobalController.appendViewportFitCover(); } _onProgressChanged(InAppWebViewController controller, int progress) { diff --git a/lib/util/web_view_global_controller.dart b/lib/util/web_view_global_controller.dart index 7db2446..6865d64 100644 --- a/lib/util/web_view_global_controller.dart +++ b/lib/util/web_view_global_controller.dart @@ -20,8 +20,7 @@ class WebViewGlobalController { /// [ref] is reference to the app state. /// [url] is the URL to evaluate. /// @return `true` if the URL should open in a new window, `false` otherwise. - static bool openCreateWindowInWebView( - {required String url, required Manifest manifest}) { + static bool openCreateWindowInWebView({required String url, required Manifest manifest}) { String? baseUrl = manifest.baseUrl; if (url.startsWith('$baseUrl/file/file/download')) return true; if (url.startsWith('$baseUrl/u')) return true; @@ -33,10 +32,7 @@ class WebViewGlobalController { _value = newValue; } - static void ajaxPost( - {required String url, - required String data, - Map? headers}) { + static void ajaxPost({required String url, required String data, Map? headers}) { String jsonHeaders = jsonEncode(headers); String jsCode4 = """ \$.ajax({ @@ -51,18 +47,14 @@ class WebViewGlobalController { } static void ajaxSetHeaders({Map? headers}) { - String jsCode = - "\$.ajaxSetup({headers: ${jsonEncode(headers).toString()}});"; + String jsCode = "\$.ajaxSetup({headers: ${jsonEncode(headers).toString()}});"; value?.evaluateJavascript(source: jsCode); } - static void onLongPressHitTestResult(InAppWebViewController controller, - InAppWebViewHitTestResult hitResult) async { + static void onLongPressHitTestResult(InAppWebViewController controller, InAppWebViewHitTestResult hitResult) async { if (hitResult.extra != null && - ([ - InAppWebViewHitTestResultType.SRC_ANCHOR_TYPE, - InAppWebViewHitTestResultType.EMAIL_TYPE - ].contains(hitResult.type))) { + ([InAppWebViewHitTestResultType.SRC_ANCHOR_TYPE, InAppWebViewHitTestResultType.EMAIL_TYPE] + .contains(hitResult.type))) { Clipboard.setData( ClipboardData(text: hitResult.extra!), ); @@ -119,6 +111,22 @@ class WebViewGlobalController { ); } + static void appendViewportFitCover() { + value?.evaluateJavascript(source: """ + (function() { + var metaTags = document.getElementsByTagName('meta'); + for (var i = 0; i < metaTags.length; i++) { + if (metaTags[i].name.toLowerCase() === 'viewport') { + var content = metaTags[i].content; + if (!content.includes('viewport-fit=cover')) { + metaTags[i].content = content + ', viewport-fit=cover'; + } + } + } + })(); + """); + } + static InAppWebViewSettings settings({bool zoom = false}) { return InAppWebViewSettings( useShouldOverrideUrlLoading: true,