From ba2b335b99b9fd43aeceb037d7ed61d94053baa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rulong=20Chen=EF=BC=88=E9=99=88=E6=B1=9D=E9=BE=99=EF=BC=89?= <26625149+0xZOne@users.noreply.github.com> Date: Wed, 3 Jan 2024 00:54:39 +0800 Subject: [PATCH] Fix NPE when platform plugin delegate is null (flutter/engine#49391) Fixes: https://github.com/flutter/flutter/issues/140600 https://github.com/flutter/flutter/issues/140031 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I added new tests to check the change I am making or feature I am adding, or the PR is [test-exempt]. See [testing the engine] for instructions on writing and running engine tests. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I signed the [CLA]. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style [testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat --- .../flutter/plugin/platform/PlatformPlugin.java | 8 +++++--- .../plugin/platform/PlatformPluginTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 6dbfedd9bb..9100476b74 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -38,7 +38,7 @@ public class PlatformPlugin { private final Activity activity; private final PlatformChannel platformChannel; - private final PlatformPluginDelegate platformPluginDelegate; + @Nullable private final PlatformPluginDelegate platformPluginDelegate; private PlatformChannel.SystemChromeStyle currentTheme; private int mEnabledOverlays; private static final String TAG = "PlatformPlugin"; @@ -161,7 +161,7 @@ public class PlatformPlugin { public PlatformPlugin( @NonNull Activity activity, @NonNull PlatformChannel platformChannel, - @NonNull PlatformPluginDelegate delegate) { + @Nullable PlatformPluginDelegate delegate) { this.activity = activity; this.platformChannel = platformChannel; this.platformChannel.setPlatformMessageHandler(mPlatformMessageHandler); @@ -499,7 +499,9 @@ public class PlatformPlugin { } private void setFrameworkHandlesBack(boolean frameworkHandlesBack) { - platformPluginDelegate.setFrameworkHandlesBack(frameworkHandlesBack); + if (platformPluginDelegate != null) { + platformPluginDelegate.setFrameworkHandlesBack(frameworkHandlesBack); + } } private void popSystemNavigator() { diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 3d5fdbce74..1d312057d4 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.doThrow; @@ -613,6 +614,20 @@ public class PlatformPluginTest { verify(mockPlatformPluginDelegate, times(1)).setFrameworkHandlesBack(true); } + @Test + public void testPlatformPluginDelegateNull() throws Exception { + Activity mockActivity = mock(Activity.class); + PlatformPlugin platformPlugin = + new PlatformPlugin(mockActivity, mockPlatformChannel, null /*platformPluginDelegate*/); + + try { + platformPlugin.mPlatformMessageHandler.setFrameworkHandlesBack(true); + } catch (NullPointerException e) { + // Not expected + fail("NullPointerException was thrown"); + } + } + @Test public void popSystemNavigatorFlutterActivity() { Activity mockActivity = mock(Activity.class);