[PointerEventsListener] Add missing _getPacket result checks.

This fixes handling of cases where _getPacket returns null. Test that
crashed before but is now passing was added as part of this change.

Test: fx run-host-tests dart_widget_tests
Change-Id: I44765cc29bc92442079ceb9913835a0a5ec14e73
Reviewed-on: https://fuchsia-review.googlesource.com/c/experiences/+/402377
Reviewed-by: Sanjay Chouksey <sanjayc@google.com>
Testability-Review: Sanjay Chouksey <sanjayc@google.com>
Commit-Queue: David Reveman <reveman@google.com>
diff --git a/settings/lib/widgets/lib/src/utils/pointer_events_listener.dart b/settings/lib/widgets/lib/src/utils/pointer_events_listener.dart
index 2bda39f..39280b3 100644
--- a/settings/lib/widgets/lib/src/utils/pointer_events_listener.dart
+++ b/settings/lib/widgets/lib/src/utils/pointer_events_listener.dart
@@ -178,7 +178,10 @@
     };
     Timeline.timeSync('PointerEventsListener.onPointerEvent', () {
       if (_kindFromPointerEvent(event) != ui.PointerDeviceKind.touch) {
-        _callback(ui.PointerDataPacket(data: [_getPacket(event)]));
+        final packet = _getPacket(event);
+        if (packet != null) {
+          _callback(ui.PointerDataPacket(data: [packet]));
+        }
         return;
       }
       final frameTime =
@@ -186,12 +189,14 @@
       // Sanity check event time by clamping to frameTime.
       final eventTime =
           event.eventTime < frameTime ? event.eventTime : frameTime;
-      var data =
+      final packet =
           _getPacket(_clone(event, event.phase, event.x, event.y, eventTime));
-      var resampler =
-          _resamplers.putIfAbsent(data.device, () => PointerDataResampler());
-      resampler.addData(data);
-      _dispatchEvents();
+      if (packet != null) {
+        var resampler = _resamplers.putIfAbsent(
+            packet.device, () => PointerDataResampler());
+        resampler.addData(packet);
+        _dispatchEvents();
+      }
     }, arguments: eventArguments);
   }
 
diff --git a/settings/lib/widgets/test/pointer_events_listener_test.dart b/settings/lib/widgets/test/pointer_events_listener_test.dart
index 7fdd846..62c3330 100644
--- a/settings/lib/widgets/test/pointer_events_listener_test.dart
+++ b/settings/lib/widgets/test/pointer_events_listener_test.dart
@@ -288,4 +288,19 @@
     expect(result[1].physicalDeltaX, 25.0 * ui.window.devicePixelRatio);
     expect(result[1].physicalDeltaY, 0.0);
   });
+
+  test('outside window', () {
+    final event0 = _createSimulatedPointerEvent(
+        PointerEventPhase.down, 1000, ui.window.physicalSize.width, 0.0);
+    final event1 = _createSimulatedPointerEvent(
+        PointerEventPhase.up, 2000, 0.0, ui.window.physicalSize.height);
+
+    var frameTime = Duration(milliseconds: 16);
+    when(scheduler.currentSystemFrameTimeStamp).thenReturn(frameTime);
+
+    pointerEventsListener..onPointerEvent(event0)..onPointerEvent(event1);
+
+    // No pointer events should have been dispatched as events are outside the window.
+    expect(result.isEmpty, true);
+  });
 }