-
Notifications
You must be signed in to change notification settings - Fork 324
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add logic to conditionally show available extensions (#6048)
- Loading branch information
1 parent
61a4b54
commit d6b74b5
Showing
9 changed files
with
205 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
83 changes: 83 additions & 0 deletions
83
packages/devtools_app/lib/src/extensions/extension_model.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
// Copyright 2023 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'package:flutter/material.dart'; | ||
|
||
// TODO(kenz): share this with devtools_server so that we do not duplicate. | ||
|
||
/// Describes an extension that can be dynamically loaded into a custom screen | ||
/// in DevTools. | ||
class DevToolsExtensionConfig { | ||
DevToolsExtensionConfig._({ | ||
required this.name, | ||
required this.path, | ||
required this.issueTrackerLink, | ||
required this.version, | ||
required this.materialIconCodePoint, | ||
}); | ||
|
||
factory DevToolsExtensionConfig.parse(Map<String, Object?> json) { | ||
// Defaults to the code point for [Icons.extensions_outlined] if null. | ||
final codePoint = json[materialIconCodePointKey] as int? ?? 0xf03f; | ||
return DevToolsExtensionConfig._( | ||
name: json[nameKey]! as String, | ||
path: json[pathKey]! as String, | ||
issueTrackerLink: json[issueTrackerKey]! as String, | ||
version: json[versionKey]! as String, | ||
materialIconCodePoint: codePoint, | ||
); | ||
} | ||
|
||
static const nameKey = 'name'; | ||
static const pathKey = 'path'; | ||
static const issueTrackerKey = 'issueTracker'; | ||
static const versionKey = 'version'; | ||
static const materialIconCodePointKey = 'materialIconCodePoint'; | ||
|
||
final String name; | ||
final String path; | ||
final String issueTrackerLink; | ||
final String version; | ||
final int materialIconCodePoint; | ||
|
||
Map<String, Object?> toJson() => { | ||
nameKey: name, | ||
pathKey: path, | ||
issueTrackerKey: issueTrackerLink, | ||
versionKey: version, | ||
materialIconCodePointKey: materialIconCodePoint, | ||
}; | ||
} | ||
|
||
extension ExtensionConfigExtension on DevToolsExtensionConfig { | ||
IconData get icon => IconData( | ||
materialIconCodePoint, | ||
fontFamily: 'MaterialIcons', | ||
); | ||
} | ||
|
||
// TODO(kenz): remove these once the DevTools extensions feature has shipped. | ||
final List<DevToolsExtensionConfig> debugPlugins = [ | ||
DevToolsExtensionConfig.parse({ | ||
DevToolsExtensionConfig.nameKey: 'foo', | ||
DevToolsExtensionConfig.issueTrackerKey: 'www.google.com', | ||
DevToolsExtensionConfig.versionKey: '1.0.0', | ||
DevToolsExtensionConfig.pathKey: '/path/to/foo', | ||
}), | ||
DevToolsExtensionConfig.parse({ | ||
DevToolsExtensionConfig.nameKey: 'bar', | ||
DevToolsExtensionConfig.issueTrackerKey: 'www.google.com', | ||
DevToolsExtensionConfig.versionKey: '2.0.0', | ||
DevToolsExtensionConfig.materialIconCodePointKey: 0xe638, | ||
DevToolsExtensionConfig.pathKey: '/path/to/bar', | ||
}), | ||
DevToolsExtensionConfig.parse({ | ||
DevToolsExtensionConfig.nameKey: 'provider', | ||
DevToolsExtensionConfig.issueTrackerKey: | ||
'https://github.com/rrousselGit/provider/issues', | ||
DevToolsExtensionConfig.versionKey: '3.0.0', | ||
DevToolsExtensionConfig.materialIconCodePointKey: 0xe50a, | ||
DevToolsExtensionConfig.pathKey: '/path/to/provider', | ||
}), | ||
]; |
30 changes: 30 additions & 0 deletions
30
packages/devtools_app/lib/src/extensions/extension_service.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// Copyright 2023 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'package:flutter/foundation.dart'; | ||
|
||
import '../shared/globals.dart'; | ||
import '../shared/primitives/auto_dispose.dart'; | ||
import 'extension_model.dart'; | ||
|
||
class ExtensionService extends DisposableController | ||
with AutoDisposeControllerMixin { | ||
ValueListenable<List<DevToolsExtensionConfig>> get availableExtensions => | ||
_availableExtensions; | ||
final _availableExtensions = ValueNotifier<List<DevToolsExtensionConfig>>([]); | ||
|
||
void initialize() { | ||
addAutoDisposeListener(serviceManager.connectedState, () { | ||
_refreshAvailablePlugins(); | ||
}); | ||
} | ||
|
||
// TODO(kenz): actually look up the available plugins from the server, based | ||
// on the root path(s) from the available isolate(s). | ||
int _count = 0; | ||
void _refreshAvailablePlugins() { | ||
_availableExtensions.value = | ||
debugPlugins.sublist(0, _count++ % (debugPlugins.length + 1)); | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
packages/devtools_app/lib/src/extensions/ui/extension_screen.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright 2023 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'package:flutter/foundation.dart'; | ||
import 'package:flutter/material.dart'; | ||
|
||
import '../../shared/primitives/listenable.dart'; | ||
import '../../shared/screen.dart'; | ||
import '../extension_model.dart'; | ||
|
||
class ExtensionScreen extends Screen { | ||
ExtensionScreen(this.extensionConfig) | ||
: super.conditional( | ||
// TODO(kenz): we may need to ensure this is a unique id. | ||
id: extensionConfig.name, | ||
title: extensionConfig.name, | ||
icon: extensionConfig.icon, | ||
// TODO(kenz): support static DevTools extensions. | ||
requiresConnection: true, | ||
); | ||
|
||
final DevToolsExtensionConfig extensionConfig; | ||
|
||
@override | ||
ValueListenable<bool> get showIsolateSelector => | ||
const FixedValueListenable<bool>(true); | ||
|
||
@override | ||
Widget build(BuildContext context) => | ||
Text('TODO: iFrame for ${extensionConfig.name}'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters