Skip to content

Commit c2a5648

Browse files
[webview_flutter_android][webview_flutter_wkwebview] Adds support to set whether to draw the scrollbar (#9249)
Platform implementations of #9024 Part of flutter/flutter#62464 ## Pre-Review Checklist [^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.
1 parent 1468581 commit c2a5648

25 files changed

+567
-6
lines changed

packages/webview_flutter/webview_flutter_android/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 4.5.0
2+
3+
* Adds support to set whether to draw the scrollbar. See
4+
`AndroidWebViewController.setVerticalScrollBarEnabled`,
5+
`AndroidWebViewController.setHorizontalScrollBarEnabled`,
6+
`AndroidWebViewController.supportsSetScrollBarsEnabled`.
7+
18
## 4.4.2
29

310
* Updates pigeon generated code to fix `ImplicitSamInstance` and `SyntheticAccessor` Kotlin lint

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/AndroidWebkitLibrary.g.kt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4840,6 +4840,20 @@ abstract class PigeonApiView(
48404840
/** Return the scrolled position of this view. */
48414841
abstract fun getScrollPosition(pigeon_instance: android.view.View): WebViewPoint
48424842

4843+
/**
4844+
* Define whether the vertical scrollbar should be drawn or not.
4845+
*
4846+
* The scrollbar is not drawn by default.
4847+
*/
4848+
abstract fun setVerticalScrollBarEnabled(pigeon_instance: android.view.View, enabled: Boolean)
4849+
4850+
/**
4851+
* Define whether the horizontal scrollbar should be drawn or not.
4852+
*
4853+
* The scrollbar is not drawn by default.
4854+
*/
4855+
abstract fun setHorizontalScrollBarEnabled(pigeon_instance: android.view.View, enabled: Boolean)
4856+
48434857
/** Set the over-scroll mode for this view. */
48444858
abstract fun setOverScrollMode(pigeon_instance: android.view.View, mode: OverScrollMode)
48454859

@@ -4915,6 +4929,54 @@ abstract class PigeonApiView(
49154929
channel.setMessageHandler(null)
49164930
}
49174931
}
4932+
run {
4933+
val channel =
4934+
BasicMessageChannel<Any?>(
4935+
binaryMessenger,
4936+
"dev.flutter.pigeon.webview_flutter_android.View.setVerticalScrollBarEnabled",
4937+
codec)
4938+
if (api != null) {
4939+
channel.setMessageHandler { message, reply ->
4940+
val args = message as List<Any?>
4941+
val pigeon_instanceArg = args[0] as android.view.View
4942+
val enabledArg = args[1] as Boolean
4943+
val wrapped: List<Any?> =
4944+
try {
4945+
api.setVerticalScrollBarEnabled(pigeon_instanceArg, enabledArg)
4946+
listOf(null)
4947+
} catch (exception: Throwable) {
4948+
AndroidWebkitLibraryPigeonUtils.wrapError(exception)
4949+
}
4950+
reply.reply(wrapped)
4951+
}
4952+
} else {
4953+
channel.setMessageHandler(null)
4954+
}
4955+
}
4956+
run {
4957+
val channel =
4958+
BasicMessageChannel<Any?>(
4959+
binaryMessenger,
4960+
"dev.flutter.pigeon.webview_flutter_android.View.setHorizontalScrollBarEnabled",
4961+
codec)
4962+
if (api != null) {
4963+
channel.setMessageHandler { message, reply ->
4964+
val args = message as List<Any?>
4965+
val pigeon_instanceArg = args[0] as android.view.View
4966+
val enabledArg = args[1] as Boolean
4967+
val wrapped: List<Any?> =
4968+
try {
4969+
api.setHorizontalScrollBarEnabled(pigeon_instanceArg, enabledArg)
4970+
listOf(null)
4971+
} catch (exception: Throwable) {
4972+
AndroidWebkitLibraryPigeonUtils.wrapError(exception)
4973+
}
4974+
reply.reply(wrapped)
4975+
}
4976+
} else {
4977+
channel.setMessageHandler(null)
4978+
}
4979+
}
49184980
run {
49194981
val channel =
49204982
BasicMessageChannel<Any?>(

packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/ViewProxyApi.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ public WebViewPoint getScrollPosition(@NonNull View pigeon_instance) {
4141
return new WebViewPoint(pigeon_instance.getScrollX(), pigeon_instance.getScrollY());
4242
}
4343

44+
@Override
45+
public void setVerticalScrollBarEnabled(@NonNull View pigeon_instance, boolean enabled) {
46+
pigeon_instance.setVerticalScrollBarEnabled(enabled);
47+
}
48+
49+
@Override
50+
public void setHorizontalScrollBarEnabled(@NonNull View pigeon_instance, boolean enabled) {
51+
pigeon_instance.setHorizontalScrollBarEnabled(enabled);
52+
}
53+
4454
@Override
4555
public void setOverScrollMode(@NonNull View pigeon_instance, @NonNull OverScrollMode mode) {
4656
switch (mode) {

packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/ViewTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,28 @@ public void getScrollPosition() {
5050
assertEquals(value.getY(), api.getScrollPosition(instance).getY());
5151
}
5252

53+
@Test
54+
public void setVerticalScrollBarEnabled() {
55+
final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView();
56+
57+
final View instance = mock(View.class);
58+
final boolean enabled = true;
59+
api.setVerticalScrollBarEnabled(instance, enabled);
60+
61+
verify(instance).setVerticalScrollBarEnabled(enabled);
62+
}
63+
64+
@Test
65+
public void setHorizontalScrollBarEnabled() {
66+
final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView();
67+
68+
final View instance = mock(View.class);
69+
final boolean enabled = false;
70+
api.setHorizontalScrollBarEnabled(instance, enabled);
71+
72+
verify(instance).setHorizontalScrollBarEnabled(enabled);
73+
}
74+
5375
@Test
5476
public void setOverScrollMode() {
5577
final PigeonApiView api = new TestProxyApiRegistrar().getPigeonApiView();

packages/webview_flutter/webview_flutter_android/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencies:
1717
# The example app is bundled with the plugin so we use a path dependency on
1818
# the parent directory to use the current plugin's version.
1919
path: ../
20-
webview_flutter_platform_interface: ^2.11.0
20+
webview_flutter_platform_interface: ^2.12.0
2121

2222
dev_dependencies:
2323
espresso: ^0.4.0

packages/webview_flutter/webview_flutter_android/lib/src/android_webkit.g.dart

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6611,6 +6611,70 @@ class View extends PigeonInternalProxyApiBaseClass {
66116611
}
66126612
}
66136613

6614+
/// Define whether the vertical scrollbar should be drawn or not.
6615+
///
6616+
/// The scrollbar is not drawn by default.
6617+
Future<void> setVerticalScrollBarEnabled(bool enabled) async {
6618+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
6619+
_pigeonVar_codecView;
6620+
final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger;
6621+
const String pigeonVar_channelName =
6622+
'dev.flutter.pigeon.webview_flutter_android.View.setVerticalScrollBarEnabled';
6623+
final BasicMessageChannel<Object?> pigeonVar_channel =
6624+
BasicMessageChannel<Object?>(
6625+
pigeonVar_channelName,
6626+
pigeonChannelCodec,
6627+
binaryMessenger: pigeonVar_binaryMessenger,
6628+
);
6629+
final Future<Object?> pigeonVar_sendFuture =
6630+
pigeonVar_channel.send(<Object?>[this, enabled]);
6631+
final List<Object?>? pigeonVar_replyList =
6632+
await pigeonVar_sendFuture as List<Object?>?;
6633+
if (pigeonVar_replyList == null) {
6634+
throw _createConnectionError(pigeonVar_channelName);
6635+
} else if (pigeonVar_replyList.length > 1) {
6636+
throw PlatformException(
6637+
code: pigeonVar_replyList[0]! as String,
6638+
message: pigeonVar_replyList[1] as String?,
6639+
details: pigeonVar_replyList[2],
6640+
);
6641+
} else {
6642+
return;
6643+
}
6644+
}
6645+
6646+
/// Define whether the horizontal scrollbar should be drawn or not.
6647+
///
6648+
/// The scrollbar is not drawn by default.
6649+
Future<void> setHorizontalScrollBarEnabled(bool enabled) async {
6650+
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
6651+
_pigeonVar_codecView;
6652+
final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger;
6653+
const String pigeonVar_channelName =
6654+
'dev.flutter.pigeon.webview_flutter_android.View.setHorizontalScrollBarEnabled';
6655+
final BasicMessageChannel<Object?> pigeonVar_channel =
6656+
BasicMessageChannel<Object?>(
6657+
pigeonVar_channelName,
6658+
pigeonChannelCodec,
6659+
binaryMessenger: pigeonVar_binaryMessenger,
6660+
);
6661+
final Future<Object?> pigeonVar_sendFuture =
6662+
pigeonVar_channel.send(<Object?>[this, enabled]);
6663+
final List<Object?>? pigeonVar_replyList =
6664+
await pigeonVar_sendFuture as List<Object?>?;
6665+
if (pigeonVar_replyList == null) {
6666+
throw _createConnectionError(pigeonVar_channelName);
6667+
} else if (pigeonVar_replyList.length > 1) {
6668+
throw PlatformException(
6669+
code: pigeonVar_replyList[0]! as String,
6670+
message: pigeonVar_replyList[1] as String?,
6671+
details: pigeonVar_replyList[2],
6672+
);
6673+
} else {
6674+
return;
6675+
}
6676+
}
6677+
66146678
/// Set the over-scroll mode for this view.
66156679
Future<void> setOverScrollMode(OverScrollMode mode) async {
66166680
final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =

packages/webview_flutter/webview_flutter_android/lib/src/android_webview_controller.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,17 @@ class AndroidWebViewController extends PlatformWebViewController {
732732
return _webChromeClient.setSynchronousReturnValueForOnJsPrompt(true);
733733
}
734734

735+
@override
736+
Future<void> setVerticalScrollBarEnabled(bool enabled) =>
737+
_webView.setVerticalScrollBarEnabled(enabled);
738+
739+
@override
740+
Future<void> setHorizontalScrollBarEnabled(bool enabled) =>
741+
_webView.setHorizontalScrollBarEnabled(enabled);
742+
743+
@override
744+
bool supportsSetScrollBarsEnabled() => true;
745+
735746
@override
736747
Future<void> setOverScrollMode(WebViewOverScrollMode mode) {
737748
return switch (mode) {

packages/webview_flutter/webview_flutter_android/pigeons/android_webkit.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,16 @@ abstract class View {
852852
/// Return the scrolled position of this view.
853853
WebViewPoint getScrollPosition();
854854

855+
/// Define whether the vertical scrollbar should be drawn or not.
856+
///
857+
/// The scrollbar is not drawn by default.
858+
void setVerticalScrollBarEnabled(bool enabled);
859+
860+
/// Define whether the horizontal scrollbar should be drawn or not.
861+
///
862+
/// The scrollbar is not drawn by default.
863+
void setHorizontalScrollBarEnabled(bool enabled);
864+
855865
/// Set the over-scroll mode for this view.
856866
void setOverScrollMode(OverScrollMode mode);
857867
}

packages/webview_flutter/webview_flutter_android/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_android
22
description: A Flutter plugin that provides a WebView widget on Android.
33
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 4.4.2
5+
version: 4.5.0
66

77
environment:
88
sdk: ^3.6.0
@@ -20,7 +20,7 @@ flutter:
2020
dependencies:
2121
flutter:
2222
sdk: flutter
23-
webview_flutter_platform_interface: ^2.11.0
23+
webview_flutter_platform_interface: ^2.12.0
2424

2525
dev_dependencies:
2626
build_runner: ^2.1.4

packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,28 @@ void main() {
14511451
verify(mockWebView.scrollBy(4, 2)).called(1);
14521452
});
14531453

1454+
test('verticalScrollBarEnabled', () async {
1455+
final MockWebView mockWebView = MockWebView();
1456+
final AndroidWebViewController controller = createControllerWithMocks(
1457+
mockWebView: mockWebView,
1458+
);
1459+
1460+
await controller.setVerticalScrollBarEnabled(false);
1461+
1462+
verify(mockWebView.setVerticalScrollBarEnabled(false)).called(1);
1463+
});
1464+
1465+
test('horizontalScrollBarEnabled', () async {
1466+
final MockWebView mockWebView = MockWebView();
1467+
final AndroidWebViewController controller = createControllerWithMocks(
1468+
mockWebView: mockWebView,
1469+
);
1470+
1471+
await controller.setHorizontalScrollBarEnabled(false);
1472+
1473+
verify(mockWebView.setHorizontalScrollBarEnabled(false)).called(1);
1474+
});
1475+
14541476
test('getScrollPosition', () async {
14551477
final MockWebView mockWebView = MockWebView();
14561478
final AndroidWebViewController controller = createControllerWithMocks(

0 commit comments

Comments
 (0)