diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index e69fc39fec0..7fbf426a9d6 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -137,7 +137,10 @@ class _NetworkScreenBodyState extends State Widget build(BuildContext context) { return Column( children: [ - _NetworkProfilerControls(controller: controller), + _NetworkProfilerControls( + controller: controller, + offline: offlineDataController.showingOfflineData.value, + ), const SizedBox(height: intermediateSpacing), Expanded( child: _NetworkProfilerBody(controller: controller), @@ -152,12 +155,15 @@ class _NetworkScreenBodyState extends State class _NetworkProfilerControls extends StatefulWidget { const _NetworkProfilerControls({ required this.controller, + required this.offline, }); static const _includeTextWidth = 810.0; final NetworkController controller; + final bool offline; + @override State<_NetworkProfilerControls> createState() => _NetworkProfilerControlsState(); @@ -201,48 +207,55 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls> final hasRequests = _filteredRequests.isNotEmpty; return Row( children: [ - StartStopRecordingButton( - recording: _recording, - onPressed: () async => - await widget.controller.togglePolling(!_recording), - tooltipOverride: _recording - ? 'Stop recording network traffic' - : 'Resume recording network traffic', - minScreenWidthForTextBeforeScaling: double.infinity, - gaScreen: gac.network, - gaSelection: _recording ? gac.pause : gac.resume, - ), - const SizedBox(width: denseSpacing), - ClearButton( - minScreenWidthForTextBeforeScaling: - _NetworkProfilerControls._includeTextWidth, - gaScreen: gac.network, - gaSelection: gac.clear, - onPressed: widget.controller.clear, - ), - const SizedBox(width: defaultSpacing), - DownloadButton( - minScreenWidthForTextBeforeScaling: - _NetworkProfilerControls._includeTextWidth, - onPressed: widget.controller.exportAsHarFile, - gaScreen: gac.network, - gaSelection: gac.NetworkEvent.downloadAsHar.name, - ), - const SizedBox(width: defaultSpacing), - const Expanded(child: SizedBox()), - // TODO(kenz): fix focus issue when state is refreshed - SearchField( - searchController: widget.controller, - searchFieldEnabled: hasRequests, - searchFieldWidth: screenWidth <= MediaSize.xs - ? defaultSearchFieldWidth - : wideSearchFieldWidth, - ), - const SizedBox(width: denseSpacing), - DevToolsFilterButton( - onPressed: _showFilterDialog, - isFilterActive: _filteredRequests.length != _requests.length, - ), + if (widget.offline) + Padding( + padding: const EdgeInsets.only(right: defaultSpacing), + child: ExitOfflineButton(gaScreen: gac.cpuProfiler), + ) + else ...[ + StartStopRecordingButton( + recording: _recording, + onPressed: () async => + await widget.controller.togglePolling(!_recording), + tooltipOverride: _recording + ? 'Stop recording network traffic' + : 'Resume recording network traffic', + minScreenWidthForTextBeforeScaling: double.infinity, + gaScreen: gac.network, + gaSelection: _recording ? gac.pause : gac.resume, + ), + const SizedBox(width: denseSpacing), + ClearButton( + minScreenWidthForTextBeforeScaling: + _NetworkProfilerControls._includeTextWidth, + gaScreen: gac.network, + gaSelection: gac.clear, + onPressed: widget.controller.clear, + ), + const SizedBox(width: defaultSpacing), + DownloadButton( + minScreenWidthForTextBeforeScaling: + _NetworkProfilerControls._includeTextWidth, + onPressed: widget.controller.exportAsHarFile, + gaScreen: gac.network, + gaSelection: gac.NetworkEvent.downloadAsHar.name, + ), + const SizedBox(width: defaultSpacing), + const Expanded(child: SizedBox()), + // TODO(kenz): fix focus issue when state is refreshed + SearchField( + searchController: widget.controller, + searchFieldEnabled: hasRequests, + searchFieldWidth: screenWidth <= MediaSize.xs + ? defaultSearchFieldWidth + : wideSearchFieldWidth, + ), + const SizedBox(width: denseSpacing), + DevToolsFilterButton( + onPressed: _showFilterDialog, + isFilterActive: _filteredRequests.length != _requests.length, + ), + ], ], ); } diff --git a/packages/devtools_app/lib/src/screens/network/offline_network_data.dart b/packages/devtools_app/lib/src/screens/network/offline_network_data.dart index cc2288eca1e..ee030659dce 100644 --- a/packages/devtools_app/lib/src/screens/network/offline_network_data.dart +++ b/packages/devtools_app/lib/src/screens/network/offline_network_data.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert'; - import 'package:devtools_shared/devtools_shared.dart'; import '../../shared/http/http_request_data.dart'; @@ -57,15 +55,4 @@ class OfflineNetworkData with Serializable { 'recording': recording, }; } - - /// Serialize the instance to a JSON-encoded string. - String toJsonString() { - return jsonEncode(toJson()); - } - - /// Deserialize a JSON-encoded string to an [OfflineNetworkData] instance. - static OfflineNetworkData fromJsonString(String jsonString) { - final Map json = jsonDecode(jsonString); - return OfflineNetworkData.fromJson(json); - } }