parent
ccb5174fa4
commit
6052640446
@ -0,0 +1,284 @@
|
||||
{
|
||||
"configVersion": 2,
|
||||
"packages": [
|
||||
{
|
||||
"name": "_fe_analyzer_shared",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "analyzer",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "args",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/args-2.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/async-2.8.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "boolean_selector",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "build",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/build-2.3.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "built_collection",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "built_value",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "characters",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "charcode",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "clock",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "code_builder",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "collection",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "convert",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "crypto",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "dart_style",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "fake_async",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "file",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/file-6.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "fixnum",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "flutter",
|
||||
"rootUri": "file:///Users/datang/fvm/versions/3.0.0/packages/flutter",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "flutter_lints",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "flutter_test",
|
||||
"rootUri": "file:///Users/datang/fvm/versions/3.0.0/packages/flutter_test",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "glob",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.15"
|
||||
},
|
||||
{
|
||||
"name": "lints",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "logging",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "matcher",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "material_color_utilities",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.13"
|
||||
},
|
||||
{
|
||||
"name": "meta",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "mockito",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "package_config",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/path-1.8.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "plugin_platform_interface",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "pub_semver",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "sky_engine",
|
||||
"rootUri": "file:///Users/datang/fvm/versions/3.0.0/bin/cache/pkg/sky_engine",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "source_gen",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "source_span",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "stack_trace",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "stream_channel",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "string_scanner",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "term_glyph",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "test_api",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "typed_data",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "vector_math",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "watcher",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "yaml",
|
||||
"rootUri": "file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "permission_handler_platform_interface",
|
||||
"rootUri": "../",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
}
|
||||
],
|
||||
"generated": "2022-08-29T07:21:04.113908Z",
|
||||
"generator": "pub",
|
||||
"generatorVersion": "2.17.0"
|
||||
}
|
@ -0,0 +1,185 @@
|
||||
_fe_analyzer_shared
|
||||
2.17
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0/lib/
|
||||
analyzer
|
||||
2.17
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0/lib/
|
||||
args
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/lib/
|
||||
async
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/
|
||||
boolean_selector
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/
|
||||
build
|
||||
2.14
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/build-2.3.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/build-2.3.0/lib/
|
||||
built_collection
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib/
|
||||
built_value
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/lib/
|
||||
characters
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/
|
||||
charcode
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/
|
||||
clock
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/
|
||||
code_builder
|
||||
2.17
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0/lib/
|
||||
collection
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib/
|
||||
convert
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2/lib/
|
||||
crypto
|
||||
2.14
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib/
|
||||
dart_style
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3/lib/
|
||||
fake_async
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0/lib/
|
||||
file
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib/
|
||||
fixnum
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib/
|
||||
flutter_lints
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/
|
||||
glob
|
||||
2.15
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/lib/
|
||||
lints
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/
|
||||
logging
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2/lib/
|
||||
matcher
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/
|
||||
material_color_utilities
|
||||
2.13
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4/lib/
|
||||
meta
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/
|
||||
mockito
|
||||
2.17
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0/lib/
|
||||
package_config
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib/
|
||||
path
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/path-1.8.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/path-1.8.1/lib/
|
||||
plugin_platform_interface
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2/lib/
|
||||
pub_semver
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1/lib/
|
||||
source_gen
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2/lib/
|
||||
source_span
|
||||
2.14
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2/lib/
|
||||
stack_trace
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/
|
||||
stream_channel
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/
|
||||
string_scanner
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/
|
||||
term_glyph
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/
|
||||
test_api
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9/lib/
|
||||
typed_data
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib/
|
||||
vector_math
|
||||
2.14
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib/
|
||||
watcher
|
||||
2.14
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1/lib/
|
||||
yaml
|
||||
2.12
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/
|
||||
file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib/
|
||||
permission_handler_platform_interface
|
||||
2.14
|
||||
file:///Users/datang/Desktop/permission_handler_platform_interface-3.7.0/
|
||||
file:///Users/datang/Desktop/permission_handler_platform_interface-3.7.0/lib/
|
||||
sky_engine
|
||||
2.12
|
||||
file:///Users/datang/fvm/versions/3.0.0/bin/cache/pkg/sky_engine/
|
||||
file:///Users/datang/fvm/versions/3.0.0/bin/cache/pkg/sky_engine/lib/
|
||||
flutter
|
||||
2.12
|
||||
file:///Users/datang/fvm/versions/3.0.0/packages/flutter/
|
||||
file:///Users/datang/fvm/versions/3.0.0/packages/flutter/lib/
|
||||
flutter_test
|
||||
2.17
|
||||
file:///Users/datang/fvm/versions/3.0.0/packages/flutter_test/
|
||||
file:///Users/datang/fvm/versions/3.0.0/packages/flutter_test/lib/
|
||||
2
|
@ -0,0 +1 @@
|
||||
3.0.0
|
@ -0,0 +1,372 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Dart Packages" type="DartPackagesLibraryType">
|
||||
<properties>
|
||||
<option name="packageNameToDirsMap">
|
||||
<entry key="_fe_analyzer_shared">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="analyzer">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="args">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="async">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="boolean_selector">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="build">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/build-2.3.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="built_collection">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="built_value">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="characters">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="charcode">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="clock">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="code_builder">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="collection">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="convert">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="crypto">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="dart_style">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="fake_async">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="fixnum">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="flutter">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/fvm/versions/3.0.0/packages/flutter/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="flutter_lints">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="flutter_test">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/fvm/versions/3.0.0/packages/flutter_test/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="glob">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="lints">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="logging">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="matcher">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="material_color_utilities">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="meta">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="mockito">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="package_config">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="path">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.8.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="plugin_platform_interface">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="pub_semver">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="sky_engine">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/fvm/versions/3.0.0/bin/cache/pkg/sky_engine/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="source_gen">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="source_span">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="stack_trace">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="stream_channel">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="string_scanner">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="term_glyph">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="test_api">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="typed_data">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="vector_math">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="watcher">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="yaml">
|
||||
<value>
|
||||
<list>
|
||||
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib" />
|
||||
</list>
|
||||
</value>
|
||||
</entry>
|
||||
</option>
|
||||
</properties>
|
||||
<CLASSES>
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/build-2.3.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.8.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1/lib" />
|
||||
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/pkg/sky_engine/lib" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/packages/flutter/lib" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/packages/flutter_test/lib" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
@ -0,0 +1,27 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Dart SDK">
|
||||
<CLASSES>
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/async" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/cli" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/collection" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/convert" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/core" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/developer" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/ffi" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/html" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/indexed_db" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/io" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/isolate" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/js" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/js_util" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/math" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/mirrors" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/svg" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/typed_data" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/web_audio" />
|
||||
<root url="file://$USER_HOME$/fvm/versions/3.0.0/bin/cache/dart-sdk/lib/web_gl" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
@ -0,0 +1,7 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
|
||||
<CLASSES />
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/permission_handler_platform_interface-3.7.0.iml" filepath="$PROJECT_DIR$/.idea/permission_handler_platform_interface-3.7.0.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Dart SDK" level="project" />
|
||||
<orderEntry type="library" name="Dart Packages" level="project" />
|
||||
</component>
|
||||
</module>
|
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,52 @@
|
||||
# This file is deprecated. Tools should instead consume
|
||||
# `.dart_tool/package_config.json`.
|
||||
#
|
||||
# For more info see: https://dart.dev/go/dot-packages-deprecation
|
||||
#
|
||||
# Generated by pub on 2022-08-29 15:21:04.100866.
|
||||
_fe_analyzer_shared:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-46.0.0/lib/
|
||||
analyzer:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/analyzer-4.6.0/lib/
|
||||
args:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/args-2.3.1/lib/
|
||||
async:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/
|
||||
boolean_selector:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/
|
||||
build:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/build-2.3.0/lib/
|
||||
built_collection:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib/
|
||||
built_value:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.1/lib/
|
||||
characters:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/
|
||||
charcode:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/
|
||||
clock:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/
|
||||
code_builder:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/code_builder-4.2.0/lib/
|
||||
collection:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib/
|
||||
convert:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/convert-3.0.2/lib/
|
||||
crypto:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib/
|
||||
dart_style:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.3/lib/
|
||||
fake_async:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.0/lib/
|
||||
file:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib/
|
||||
fixnum:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib/
|
||||
flutter:file:///Users/datang/fvm/versions/3.0.0/packages/flutter/lib/
|
||||
flutter_lints:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/
|
||||
flutter_test:file:///Users/datang/fvm/versions/3.0.0/packages/flutter_test/lib/
|
||||
glob:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/glob-2.1.0/lib/
|
||||
lints:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/
|
||||
logging:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/logging-1.0.2/lib/
|
||||
matcher:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/
|
||||
material_color_utilities:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.4/lib/
|
||||
meta:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/
|
||||
mockito:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/mockito-5.3.0/lib/
|
||||
package_config:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib/
|
||||
path:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/path-1.8.1/lib/
|
||||
plugin_platform_interface:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.2/lib/
|
||||
pub_semver:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.1/lib/
|
||||
sky_engine:file:///Users/datang/fvm/versions/3.0.0/bin/cache/pkg/sky_engine/lib/
|
||||
source_gen:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.2/lib/
|
||||
source_span:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.2/lib/
|
||||
stack_trace:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/
|
||||
stream_channel:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/
|
||||
string_scanner:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/
|
||||
term_glyph:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/
|
||||
test_api:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.9/lib/
|
||||
typed_data:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib/
|
||||
vector_math:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib/
|
||||
watcher:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.1/lib/
|
||||
yaml:file:///Users/datang/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib/
|
||||
permission_handler_platform_interface:lib/
|
@ -0,0 +1,79 @@
|
||||
## 3.7.0
|
||||
|
||||
* Added support for the new Android 12 Bluetooth permissions: BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE and BLUETOOTH_CONNECT.
|
||||
|
||||
## 3.6.2
|
||||
|
||||
* Updated the MethodChannelMock due to breaking changes in the platform channel test interface.
|
||||
|
||||
## 3.6.1
|
||||
|
||||
* Updated `meta` dependency to version `^1.3.0`.
|
||||
* Updated documentation for the `locationAlways` permission
|
||||
|
||||
## 3.6.0
|
||||
|
||||
* Add support for iOS Critical alerts and Android Access Notification Policy.
|
||||
|
||||
## 3.5.1
|
||||
|
||||
* Updated API documentation for the `PermissionStatus.permanentlyDenied` status.
|
||||
|
||||
## 3.5.0
|
||||
|
||||
* Added support for app tracking transparency permission.
|
||||
|
||||
## 3.4.0
|
||||
|
||||
* Added support request install packages permission.
|
||||
|
||||
## 3.3.0
|
||||
|
||||
* Added support for system alert window permission.
|
||||
|
||||
## 3.2.0
|
||||
|
||||
* Added support for manage external storage permission available on Android 10 and up.
|
||||
|
||||
## 3.1.3
|
||||
|
||||
* Implemented equality operator for `Permission` class;
|
||||
* Reverted services status check for notification permission. Turns out implementation does not fit with idea's of permission_handler plugin.
|
||||
|
||||
## 3.1.2
|
||||
|
||||
* Allow checking serviceStatus for notification permission.
|
||||
|
||||
## 3.1.1
|
||||
|
||||
* Fixed conversion issue where `PermissionStatus.denied` was not translated to the correct index.
|
||||
* Added unit-tests to guard API against breaking changes.
|
||||
|
||||
## 3.1.0
|
||||
|
||||
* Added support for bluetooth permissions.
|
||||
|
||||
## 3.0.0+1
|
||||
|
||||
* **BREAKING**: Removed PermissionStatus.undetermined. This is now replaced by PermissionStatus.denied.
|
||||
|
||||
## 3.0.0
|
||||
|
||||
* Migrated to null safety.
|
||||
|
||||
## 2.0.2
|
||||
|
||||
* Added support for the limited photos permission available on iOS 14 and up.
|
||||
|
||||
## 2.0.1
|
||||
|
||||
* Update `platform_interface 1.0.2`
|
||||
* Fix bug which allows requesting is the device has phone capabilities.
|
||||
|
||||
## 2.0.0
|
||||
|
||||
- **BREAKING**: Created a much more intuitive API using Dart's new extension methods ([#230](https://github.com/Baseflow/flutter-permission-handler/issues/230)). Big thank you to [@marcelgarus](https://github.com/marcelgarus) for the idea and doing all the grunt work.
|
||||
|
||||
## 1.0.0
|
||||
|
||||
- Initial open-source release.
|
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Baseflow
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -0,0 +1,11 @@
|
||||
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
# Ignore generated files
|
||||
- '**/*.g.dart'
|
||||
- 'lib/src/generated/*.dart'
|
||||
linter:
|
||||
rules:
|
||||
- public_member_api_docs
|
@ -0,0 +1,11 @@
|
||||
library permission_handler_platform_interface;
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||
import 'src/method_channel/method_channel_permission_handler.dart';
|
||||
|
||||
part 'src/permission_handler_platform_interface.dart';
|
||||
part 'src/permission_status.dart';
|
||||
part 'src/permissions.dart';
|
||||
part 'src/service_status.dart';
|
@ -0,0 +1,88 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import '../../permission_handler_platform_interface.dart';
|
||||
import 'utils/codec.dart';
|
||||
|
||||
const MethodChannel _methodChannel =
|
||||
MethodChannel('flutter.baseflow.com/permissions/methods');
|
||||
|
||||
/// An implementation of [PermissionHandlerPlatform] that uses [MethodChannel]s.
|
||||
class MethodChannelPermissionHandler extends PermissionHandlerPlatform {
|
||||
/// Checks the current status of the given [Permission].
|
||||
@override
|
||||
Future<PermissionStatus> checkPermissionStatus(Permission permission) async {
|
||||
final status = await _methodChannel.invokeMethod(
|
||||
'checkPermissionStatus', permission.value);
|
||||
|
||||
return decodePermissionStatus(status);
|
||||
}
|
||||
|
||||
/// Checks the current status of the service associated with the given
|
||||
/// [Permission].
|
||||
///
|
||||
/// Notes about specific permissions:
|
||||
/// - **[Permission.phone]**
|
||||
/// - Android:
|
||||
/// - The method will return [ServiceStatus.notApplicable] when:
|
||||
/// - the device lacks the TELEPHONY feature
|
||||
/// - TelephonyManager.getPhoneType() returns PHONE_TYPE_NONE
|
||||
/// - when no Intents can be resolved to handle the `tel:` scheme
|
||||
/// - The method will return [ServiceStatus.disabled] when:
|
||||
/// - the SIM card is missing
|
||||
/// - iOS:
|
||||
/// - The method will return [ServiceStatus.notApplicable] when:
|
||||
/// - the native code can not find a handler for the `tel:` scheme
|
||||
/// - The method will return [ServiceStatus.disabled] when:
|
||||
/// - the mobile network code (MNC) is either 0 or 65535. See
|
||||
/// https://stackoverflow.com/a/11595365 for details
|
||||
/// - **PLEASE NOTE that this is still not a perfect indication** of the
|
||||
/// device's capability to place & connect phone calls as it also depends
|
||||
/// on the network condition.
|
||||
@override
|
||||
Future<ServiceStatus> checkServiceStatus(Permission permission) async {
|
||||
final status = await _methodChannel.invokeMethod(
|
||||
'checkServiceStatus', permission.value);
|
||||
|
||||
return decodeServiceStatus(status);
|
||||
}
|
||||
|
||||
/// Opens the app settings page.
|
||||
///
|
||||
/// Returns [true] if the app settings page could be opened, otherwise
|
||||
/// [false].
|
||||
@override
|
||||
Future<bool> openAppSettings() async {
|
||||
final wasOpened = await _methodChannel.invokeMethod('openAppSettings');
|
||||
|
||||
return wasOpened ?? false;
|
||||
}
|
||||
|
||||
/// Requests the user for access to the supplied list of [Permission]s, if
|
||||
/// they have not already been granted before.
|
||||
///
|
||||
/// Returns a [Map] containing the status per requested [Permission].
|
||||
@override
|
||||
Future<Map<Permission, PermissionStatus>> requestPermissions(
|
||||
List<Permission> permissions) async {
|
||||
final data = encodePermissions(permissions);
|
||||
final status =
|
||||
await _methodChannel.invokeMethod('requestPermissions', data);
|
||||
|
||||
return decodePermissionRequestResult(Map<int, int>.from(status));
|
||||
}
|
||||
|
||||
/// Checks if you should show a rationale for requesting permission.
|
||||
///
|
||||
/// This method is only implemented on Android, calling this on iOS always
|
||||
/// returns [false].
|
||||
@override
|
||||
Future<bool> shouldShowRequestPermissionRationale(
|
||||
Permission permission) async {
|
||||
final shouldShowRationale = await _methodChannel.invokeMethod(
|
||||
'shouldShowRequestPermissionRationale', permission.value);
|
||||
|
||||
return shouldShowRationale ?? false;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
import '../../../permission_handler_platform_interface.dart';
|
||||
|
||||
/// Converts the given [value] into a [PermissionStatus] instance.
|
||||
PermissionStatus decodePermissionStatus(int value) {
|
||||
return PermissionStatusValue.statusByValue(value);
|
||||
}
|
||||
|
||||
/// Converts the given [value] into a [ServiceStatus] instance.
|
||||
ServiceStatus decodeServiceStatus(int value) {
|
||||
return ServiceStatusValue.statusByValue(value);
|
||||
}
|
||||
|
||||
/// Converts the given [Map] of [int]s into a [Map] with [Permission]s as
|
||||
/// keys and their respective [PermissionStatus] as value.
|
||||
Map<Permission, PermissionStatus> decodePermissionRequestResult(
|
||||
Map<int, int> value) {
|
||||
return value.map((key, value) => MapEntry<Permission, PermissionStatus>(
|
||||
Permission.byValue(key), PermissionStatusValue.statusByValue(value)));
|
||||
}
|
||||
|
||||
/// Converts the given [List] of [Permission]s into a [List] of [int]s which
|
||||
/// can be sent on the Flutter method channel.
|
||||
List<int> encodePermissions(List<Permission> permissions) {
|
||||
return permissions.map((it) => it.value).toList();
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
part of permission_handler_platform_interface;
|
||||
|
||||
/// The interface that implementations of `permission_handler` must implement.
|
||||
///
|
||||
/// Platform implementations should extend this class rather than implement it
|
||||
/// as `permission_handler` does not consider newly added methods to be
|
||||
/// breaking changes. Extending this class (using `extends`) ensures that the
|
||||
/// subclass will get the default implementation, while platform
|
||||
/// implementations that `implements` this interface will be broken by newly
|
||||
/// added [PermissionHandlerPlatform] methods.
|
||||
abstract class PermissionHandlerPlatform extends PlatformInterface {
|
||||
/// Constructs a PermissionHandlerPlatform.
|
||||
PermissionHandlerPlatform() : super(token: _token);
|
||||
|
||||
static final Object _token = Object();
|
||||
|
||||
static PermissionHandlerPlatform _instance = MethodChannelPermissionHandler();
|
||||
|
||||
/// The default instance of [PermissionHandlerPlatform] to use.
|
||||
///
|
||||
/// Defaults to [MethodChannelPermissionHandler].
|
||||
static PermissionHandlerPlatform get instance => _instance;
|
||||
|
||||
/// Platform-specific plugins should set this with their own
|
||||
/// platform-specific class that extends
|
||||
/// [PermissionHandlerPlatform] when they register themselves.
|
||||
static set instance(PermissionHandlerPlatform instance) {
|
||||
PlatformInterface.verifyToken(instance, _token);
|
||||
_instance = instance;
|
||||
}
|
||||
|
||||
/// Checks the current status of the given [Permission].
|
||||
Future<PermissionStatus> checkPermissionStatus(Permission permission) {
|
||||
throw UnimplementedError(
|
||||
'checkPermissionStatus() has not been implemented.');
|
||||
}
|
||||
|
||||
/// Checks the current status of the service associated with the given
|
||||
/// [Permission].
|
||||
///
|
||||
/// Notes about specific permissions:
|
||||
/// - **[Permission.phone]**
|
||||
/// - Android:
|
||||
/// - The method will return [ServiceStatus.notApplicable] when:
|
||||
/// - the device lacks the TELEPHONY feature
|
||||
/// - TelephonyManager.getPhoneType() returns PHONE_TYPE_NONE
|
||||
/// - when no Intents can be resolved to handle the `tel:` scheme
|
||||
/// - The method will return [ServiceStatus.disabled] when:
|
||||
/// - the SIM card is missing
|
||||
/// - iOS:
|
||||
/// - The method will return [ServiceStatus.notApplicable] when:
|
||||
/// - the native code can not find a handler for the `tel:` scheme
|
||||
/// - The method will return [ServiceStatus.disabled] when:
|
||||
/// - the mobile network code (MNC) is either 0 or 65535. See
|
||||
/// https://stackoverflow.com/a/11595365 for details
|
||||
/// - **PLEASE NOTE that this is still not a perfect indication** of the
|
||||
/// device's capability to place & connect phone calls as it also depends
|
||||
/// on the network condition.
|
||||
Future<ServiceStatus> checkServiceStatus(Permission permission) {
|
||||
throw UnimplementedError('checkServiceStatus() has not been implemented.');
|
||||
}
|
||||
|
||||
/// Opens the app settings page.
|
||||
///
|
||||
/// Returns [true] if the app settings page could be opened, otherwise
|
||||
/// [false].
|
||||
Future<bool> openAppSettings() {
|
||||
throw UnimplementedError('openAppSettings() has not been implemented.');
|
||||
}
|
||||
|
||||
/// Requests the user for access to the supplied list of [Permission]s, if
|
||||
/// they have not already been granted before.
|
||||
///
|
||||
/// Returns a [Map] containing the status per requested [Permission].
|
||||
Future<Map<Permission, PermissionStatus>> requestPermissions(
|
||||
List<Permission> permissions) {
|
||||
throw UnimplementedError('requestPermissions() has not been implemented.');
|
||||
}
|
||||
|
||||
/// Checks if you should show a rationale for requesting permission.
|
||||
///
|
||||
/// This method is only implemented on Android, calling this on iOS always
|
||||
/// returns [false].
|
||||
Future<bool> shouldShowRequestPermissionRationale(Permission permission) {
|
||||
throw UnimplementedError(
|
||||
'shouldShowRequestPermissionRationale() has not been implemented.');
|
||||
}
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
part of permission_handler_platform_interface;
|
||||
|
||||
/// Defines the state of a [Permission].
|
||||
enum PermissionStatus {
|
||||
/// The user denied access to the requested feature.
|
||||
denied,
|
||||
|
||||
/// The user granted access to the requested feature.
|
||||
granted,
|
||||
|
||||
/// The OS denied access to the requested feature. The user cannot change
|
||||
/// this app's status, possibly due to active restrictions such as parental
|
||||
/// controls being in place.
|
||||
/// *Only supported on iOS.*
|
||||
restricted,
|
||||
|
||||
///User has authorized this application for limited access.
|
||||
/// *Only supported on iOS (iOS14+).*
|
||||
limited,
|
||||
|
||||
/// Permission to the requested feature is permanently denied, the permission
|
||||
/// dialog will not be shown when requesting this permission. The user may
|
||||
/// still change the permission status in the settings.
|
||||
/// *Only supported on Android.*
|
||||
permanentlyDenied,
|
||||
}
|
||||
|
||||
/// Conversion extension methods for the [PermissionStatus] type.
|
||||
extension PermissionStatusValue on PermissionStatus {
|
||||
/// Converts the [PermissionStatus] value into an integer.
|
||||
int get value {
|
||||
switch (this) {
|
||||
case PermissionStatus.denied:
|
||||
return 0;
|
||||
case PermissionStatus.granted:
|
||||
return 1;
|
||||
case PermissionStatus.restricted:
|
||||
return 2;
|
||||
case PermissionStatus.limited:
|
||||
return 3;
|
||||
case PermissionStatus.permanentlyDenied:
|
||||
return 4;
|
||||
default:
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts the supplied integer value into a [PermissionStatus] enum.
|
||||
static PermissionStatus statusByValue(int value) {
|
||||
return [
|
||||
PermissionStatus.denied,
|
||||
PermissionStatus.granted,
|
||||
PermissionStatus.restricted,
|
||||
PermissionStatus.limited,
|
||||
PermissionStatus.permanentlyDenied,
|
||||
][value];
|
||||
}
|
||||
}
|
||||
|
||||
/// Utility getter extensions for the [PermissionStatus] type.
|
||||
extension PermissionStatusGetters on PermissionStatus {
|
||||
/// If the user denied access to the requested feature.
|
||||
bool get isDenied => this == PermissionStatus.denied;
|
||||
|
||||
/// If the user granted access to the requested feature.
|
||||
bool get isGranted => this == PermissionStatus.granted;
|
||||
|
||||
/// If the OS denied access to the requested feature. The user cannot change
|
||||
/// this app's status, possibly due to active restrictions such as parental
|
||||
/// controls being in place.
|
||||
/// *Only supported on iOS.*
|
||||
bool get isRestricted => this == PermissionStatus.restricted;
|
||||
|
||||
/// If the user denied access to the requested feature and selected to never
|
||||
/// again show a request for this permission. The user may still change the
|
||||
/// permission status in the settings.
|
||||
/// *Only supported on Android.*
|
||||
///
|
||||
/// WARNING: This can only be determined AFTER requesting this permission.
|
||||
/// Therefore make a `request` call first.
|
||||
bool get isPermanentlyDenied => this == PermissionStatus.permanentlyDenied;
|
||||
|
||||
/// Indicates that permission for limited use of the resource is granted.
|
||||
bool get isLimited => this == PermissionStatus.limited;
|
||||
}
|
||||
|
||||
/// Utility getter extensions for the `Future<PermissionStatus>` type.
|
||||
extension FuturePermissionStatusGetters on Future<PermissionStatus> {
|
||||
/// If the user granted access to the requested feature.
|
||||
Future<bool> get isGranted async => (await this).isGranted;
|
||||
|
||||
/// If the user denied access to the requested feature.
|
||||
Future<bool> get isDenied async => (await this).isDenied;
|
||||
|
||||
/// If the OS denied access to the requested feature. The user cannot change
|
||||
/// this app's status, possibly due to active restrictions such as parental
|
||||
/// controls being in place.
|
||||
/// *Only supported on iOS.*
|
||||
Future<bool> get isRestricted async => (await this).isRestricted;
|
||||
|
||||
/// If the user denied access to the requested feature and selected to never
|
||||
/// again show a request for this permission. The user may still change the
|
||||
/// permission status in the settings.
|
||||
/// *Only supported on Android.*
|
||||
Future<bool> get isPermanentlyDenied async =>
|
||||
(await this).isPermanentlyDenied;
|
||||
|
||||
/// Indicates that permission for limited use of the resource is granted.
|
||||
Future<bool> get isLimited async => (await this).isLimited;
|
||||
}
|
@ -0,0 +1,267 @@
|
||||
part of permission_handler_platform_interface;
|
||||
|
||||
/// A special kind of permission used to access a service. Additionally to the
|
||||
/// actions that normal [Permission]s have, you can also query the status of
|
||||
/// the related service.
|
||||
class PermissionWithService extends Permission {
|
||||
const PermissionWithService._(int value) : super._(value);
|
||||
|
||||
/// Creates a [PermissionWithService] instance.
|
||||
///
|
||||
/// This constructor is marked public for testing purposes only.
|
||||
@visibleForTesting
|
||||
const PermissionWithService.private(int value) : super._(value);
|
||||
}
|
||||
|
||||
/// Defines the permissions which can be checked and requested.
|
||||
@immutable
|
||||
class Permission {
|
||||
const Permission._(this.value);
|
||||
|
||||
/// Creates a [Permission] using the supplied integer value.
|
||||
factory Permission.byValue(int value) => values[value];
|
||||
|
||||
/// Integer representation of the [Permission].
|
||||
final int value;
|
||||
|
||||
/// Android: Calendar
|
||||
/// iOS: Calendar (Events)
|
||||
static const calendar = Permission._(0);
|
||||
|
||||
/// Android: Camera
|
||||
/// iOS: Photos (Camera Roll and Camera)
|
||||
static const camera = Permission._(1);
|
||||
|
||||
/// Android: Contacts
|
||||
/// iOS: AddressBook
|
||||
static const contacts = Permission._(2);
|
||||
|
||||
/// Android: Fine and Coarse Location
|
||||
/// iOS: CoreLocation (Always and WhenInUse)
|
||||
static const location = PermissionWithService._(3);
|
||||
|
||||
/// Android:
|
||||
/// When running on Android < Q: Fine and Coarse Location
|
||||
/// When running on Android Q and above: Background Location Permission
|
||||
/// iOS: CoreLocation - Always
|
||||
/// When requesting this permission the user needs to grant permission
|
||||
/// for the `locationWhenInUse` permission first, clicking on
|
||||
/// the `Àllow While Using App` option on the popup.
|
||||
/// After allowing the permission the user can request the `locationAlways`
|
||||
/// permission and can click on the `Change To Always Allow` option.
|
||||
static const locationAlways = PermissionWithService._(4);
|
||||
|
||||
/// Android: Fine and Coarse Location
|
||||
/// iOS: CoreLocation - WhenInUse
|
||||
static const locationWhenInUse = PermissionWithService._(5);
|
||||
|
||||
/// Android: None
|
||||
/// iOS: MPMediaLibrary
|
||||
static const mediaLibrary = Permission._(6);
|
||||
|
||||
/// Android: Microphone
|
||||
/// iOS: Microphone
|
||||
static const microphone = Permission._(7);
|
||||
|
||||
/// Android: Phone
|
||||
/// iOS: Nothing
|
||||
static const phone = PermissionWithService._(8);
|
||||
|
||||
/// Android: Nothing
|
||||
/// iOS: Photos
|
||||
/// iOS 14+ read & write access level
|
||||
static const photos = Permission._(9);
|
||||
|
||||
/// Android: Nothing
|
||||
/// iOS: Photos
|
||||
/// iOS 14+ read & write access level
|
||||
static const photosAddOnly = Permission._(10);
|
||||
|
||||
/// Android: Nothing
|
||||
/// iOS: Reminders
|
||||
static const reminders = Permission._(11);
|
||||
|
||||
/// Android: Body Sensors
|
||||
/// iOS: CoreMotion
|
||||
static const sensors = Permission._(12);
|
||||
|
||||
/// Android: Sms
|
||||
/// iOS: Nothing
|
||||
static const sms = Permission._(13);
|
||||
|
||||
/// Android: Microphone
|
||||
/// iOS: Speech
|
||||
static const speech = Permission._(14);
|
||||
|
||||
/// Android: External Storage
|
||||
/// iOS: Access to folders like `Documents` or `Downloads`. Implicitly
|
||||
/// granted.
|
||||
static const storage = Permission._(15);
|
||||
|
||||
/// Android: Ignore Battery Optimizations
|
||||
static const ignoreBatteryOptimizations = Permission._(16);
|
||||
|
||||
/// Android: Notification
|
||||
/// iOS: Notification
|
||||
static const notification = Permission._(17);
|
||||
|
||||
/// Android: Allows an application to access any geographic locations
|
||||
/// persisted in the user's shared collection.
|
||||
static const accessMediaLocation = Permission._(18);
|
||||
|
||||
/// When running on Android Q and above: Activity Recognition
|
||||
/// When running on Android < Q: Nothing
|
||||
/// iOS: Nothing
|
||||
static const activityRecognition = Permission._(19);
|
||||
|
||||
/// The unknown only used for return type, never requested
|
||||
static const unknown = Permission._(20);
|
||||
|
||||
/// iOS 13 and above: The authorization state of Core Bluetooth manager.
|
||||
/// When running < iOS 13 or Android this is always allowed.
|
||||
static const bluetooth = Permission._(21);
|
||||
|
||||
/// Android: Allows an application a broad access to external storage in
|
||||
/// scoped storage.
|
||||
/// iOS: Nothing
|
||||
///
|
||||
/// You should request the Manage External Storage permission only when
|
||||
/// your app cannot effectively make use of the more privacy-friendly APIs.
|
||||
/// For more information: https://developer.android.com/training/data-storage/manage-all-files
|
||||
///
|
||||
/// When the privacy-friendly APIs (i.e. [Storage Access Framework](https://developer.android.com/guide/topics/providers/document-provider)
|
||||
/// or the [MediaStore](https://developer.android.com/training/data-storage/shared/media) APIs) is all your app needs the
|
||||
/// [PermissionGroup.storage] are the only permissions you need to request.
|
||||
///
|
||||
/// If the usage of the Manage External Storage permission is needed,
|
||||
/// you have to fill out the Permission Declaration Form upon submitting
|
||||
/// your app to the Google Play Store. More details can be found here:
|
||||
/// https://support.google.com/googleplay/android-developer/answer/9214102#zippy=
|
||||
static const manageExternalStorage = Permission._(22);
|
||||
|
||||
///Android: Allows an app to create windows shown on top of all other apps
|
||||
///iOS: Nothing
|
||||
static const systemAlertWindow = Permission._(23);
|
||||
|
||||
///Android: Allows an app to request installing packages.
|
||||
///iOS: Nothing
|
||||
static const requestInstallPackages = Permission._(24);
|
||||
|
||||
///Android: Nothing
|
||||
///iOS: Allows user to accept that your app collects data about end users and
|
||||
///shares it with other companies for purposes of tracking across apps and
|
||||
///websites.
|
||||
static const appTrackingTransparency = Permission._(25);
|
||||
|
||||
///Android: Nothing
|
||||
///iOS: Notifications that override your ringer
|
||||
static const criticalAlerts = Permission._(26);
|
||||
|
||||
///Android: Allows the user to access the notification policy of the phone.
|
||||
/// EX: Allows app to turn on and off do-not-disturb.
|
||||
///iOS: Nothing
|
||||
static const accessNotificationPolicy = Permission._(27);
|
||||
|
||||
///Android: Allows the user to look for Bluetooth devices
|
||||
///(e.g. BLE peripherals).
|
||||
///iOS: Nothing
|
||||
static const bluetoothScan = Permission._(28);
|
||||
|
||||
///Android: Allows the user to make this device discoverable to other
|
||||
///Bluetooth devices.
|
||||
///iOS: Nothing
|
||||
static const bluetoothAdvertise = Permission._(29);
|
||||
|
||||
///Android: Allows the user to connect with already paired Bluetooth devices.
|
||||
///iOS: Nothing
|
||||
static const bluetoothConnect = Permission._(30);
|
||||
static const callLog = Permission._(31);
|
||||
|
||||
/// Returns a list of all possible [PermissionGroup] values.
|
||||
static const List<Permission> values = <Permission>[
|
||||
calendar,
|
||||
camera,
|
||||
contacts,
|
||||
location,
|
||||
locationAlways,
|
||||
locationWhenInUse,
|
||||
mediaLibrary,
|
||||
microphone,
|
||||
phone,
|
||||
photos,
|
||||
photosAddOnly,
|
||||
reminders,
|
||||
sensors,
|
||||
sms,
|
||||
speech,
|
||||
storage,
|
||||
ignoreBatteryOptimizations,
|
||||
notification,
|
||||
accessMediaLocation,
|
||||
activityRecognition,
|
||||
unknown,
|
||||
bluetooth,
|
||||
manageExternalStorage,
|
||||
systemAlertWindow,
|
||||
requestInstallPackages,
|
||||
appTrackingTransparency,
|
||||
criticalAlerts,
|
||||
accessNotificationPolicy,
|
||||
bluetoothScan,
|
||||
bluetoothAdvertise,
|
||||
bluetoothConnect,
|
||||
callLog,
|
||||
];
|
||||
|
||||
static const List<String> _names = <String>[
|
||||
'calendar',
|
||||
'camera',
|
||||
'contacts',
|
||||
'location',
|
||||
'locationAlways',
|
||||
'locationWhenInUse',
|
||||
'mediaLibrary',
|
||||
'microphone',
|
||||
'phone',
|
||||
'photos',
|
||||
'photosAddOnly',
|
||||
'reminders',
|
||||
'sensors',
|
||||
'sms',
|
||||
'speech',
|
||||
'storage',
|
||||
'ignoreBatteryOptimizations',
|
||||
'notification',
|
||||
'access_media_location',
|
||||
'activity_recognition',
|
||||
'unknown',
|
||||
'bluetooth',
|
||||
'manageExternalStorage',
|
||||
'systemAlertWindow',
|
||||
'requestInstallPackages',
|
||||
'appTrackingTransparency',
|
||||
'criticalAlerts',
|
||||
'accessNotificationPolicy',
|
||||
'bluetoothScan',
|
||||
'bluetoothAdvertise',
|
||||
'bluetoothConnect',
|
||||
'callLog',
|
||||
];
|
||||
|
||||
@override
|
||||
String toString() => 'Permission.${_names[value]}';
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (identical(this, other)) {
|
||||
return true;
|
||||
}
|
||||
if (other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
return other is Permission && other.value == value;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => value.hashCode;
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
part of permission_handler_platform_interface;
|
||||
|
||||
/// Defines the different states a service can be in.
|
||||
enum ServiceStatus {
|
||||
/// The service for the permission is disabled.
|
||||
disabled,
|
||||
|
||||
/// The service for the permission is enabled.
|
||||
enabled,
|
||||
|
||||
/// The permission does not have an associated service on the current
|
||||
/// platform.
|
||||
notApplicable,
|
||||
}
|
||||
|
||||
/// Conversion extension methods for the [ServiceStatus] type.
|
||||
extension ServiceStatusValue on ServiceStatus {
|
||||
/// Converts the [ServiceStatus] value into an integer.
|
||||
int get value {
|
||||
switch (this) {
|
||||
case ServiceStatus.disabled:
|
||||
return 0;
|
||||
case ServiceStatus.enabled:
|
||||
return 1;
|
||||
case ServiceStatus.notApplicable:
|
||||
return 2;
|
||||
default:
|
||||
throw UnimplementedError();
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts the supplied integer value into a [ServiceStatus] enum.
|
||||
static ServiceStatus statusByValue(int value) {
|
||||
return [
|
||||
ServiceStatus.disabled,
|
||||
ServiceStatus.enabled,
|
||||
ServiceStatus.notApplicable,
|
||||
][value];
|
||||
}
|
||||
}
|
||||
|
||||
/// Utility getter extensions for the [ServiceStatus] type.
|
||||
extension ServiceStatusGetters on ServiceStatus {
|
||||
/// If the service for the permission is disabled.
|
||||
bool get isDisabled => this == ServiceStatus.disabled;
|
||||
|
||||
/// If the service for the permission is enabled.
|
||||
bool get isEnabled => this == ServiceStatus.enabled;
|
||||
|
||||
/// If the permission does not have an associated service on the current
|
||||
/// platform.
|
||||
bool get isNotApplicable => this == ServiceStatus.notApplicable;
|
||||
}
|
||||
|
||||
/// Utility getter extensions for the `Future<ServiceStatus>` type.
|
||||
extension FutureServiceStatusGetters on Future<ServiceStatus> {
|
||||
/// If the service for the permission is disabled.
|
||||
Future<bool> get isDisabled async => (await this).isDisabled;
|
||||
|
||||
/// If the service for the permission is enabled.
|
||||
Future<bool> get isEnabled async => (await this).isEnabled;
|
||||
|
||||
/// If the permission does not have an associated service on the current
|
||||
/// platform.
|
||||
Future<bool> get isNotApplicable async => (await this).isNotApplicable;
|
||||
}
|
@ -0,0 +1,315 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "46.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.6.0"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.8.2"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_collection
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
built_value:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "8.4.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.2.0"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.16.0"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.4"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.12.11"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.4"
|
||||
meta:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.7.0"
|
||||
mockito:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: mockito
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.3.0"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.1"
|
||||
plugin_platform_interface:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.2"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.9"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
sdks:
|
||||
dart: ">=2.17.0 <3.0.0"
|
||||
flutter: ">=2.5.0"
|
@ -0,0 +1,22 @@
|
||||
name: permission_handler_platform_interface
|
||||
description: A common platform interface for the permission_handler plugin.
|
||||
homepage: https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface
|
||||
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
|
||||
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
|
||||
version: 3.7.0
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
meta: ^1.3.0
|
||||
plugin_platform_interface: ^2.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
mockito: ^5.0.0
|
||||
flutter_lints: ^1.0.4
|
||||
|
||||
environment:
|
||||
sdk: ">=2.14.0 <3.0.0"
|
||||
flutter: ">=2.5.0"
|
@ -0,0 +1,34 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
class MethodChannelMock {
|
||||
final MethodChannel methodChannel;
|
||||
final String method;
|
||||
final dynamic result;
|
||||
final Duration delay;
|
||||
|
||||
MethodChannelMock({
|
||||
required String channelName,
|
||||
required this.method,
|
||||
this.result,
|
||||
this.delay = Duration.zero,
|
||||
}) : methodChannel = MethodChannel(channelName) {
|
||||
TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(methodChannel, _handler);
|
||||
}
|
||||
|
||||
Future _handler(MethodCall methodCall) async {
|
||||
if (methodCall.method != method) {
|
||||
throw MissingPluginException('No implementation found for method '
|
||||
'$method on channel ${methodChannel.name}');
|
||||
}
|
||||
|
||||
return Future.delayed(delay, () {
|
||||
if (result is Exception) {
|
||||
throw result;
|
||||
}
|
||||
|
||||
return Future.value(result);
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,202 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
import 'package:permission_handler_platform_interface/src/method_channel/method_channel_permission_handler.dart';
|
||||
import 'method_channel_mock.dart';
|
||||
|
||||
List<Permission> get mockPermissions => List.of(
|
||||
<Permission>{Permission.calendar, Permission.camera, Permission.contacts});
|
||||
|
||||
Map<Permission, PermissionStatus> get mockPermissionMap => {};
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('checkPermissionStatus: When checking for permission', () {
|
||||
test('Should receive granted if user wants access to the requested feature',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkPermissionStatus',
|
||||
result: PermissionStatus.denied.value,
|
||||
);
|
||||
|
||||
final permissionStatus = await MethodChannelPermissionHandler()
|
||||
.checkPermissionStatus(Permission.calendar);
|
||||
|
||||
expect(permissionStatus, PermissionStatus.denied);
|
||||
});
|
||||
|
||||
test('Should receive denied if user denied access to the requested feature',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkPermissionStatus',
|
||||
result: PermissionStatus.denied.value,
|
||||
);
|
||||
|
||||
final permissionStatus = await MethodChannelPermissionHandler()
|
||||
.checkPermissionStatus(Permission.calendar);
|
||||
|
||||
expect(permissionStatus, PermissionStatus.denied);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Should receive restricted if OS denied rights for to the requested feature',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkPermissionStatus',
|
||||
result: PermissionStatus.restricted.value,
|
||||
);
|
||||
|
||||
final permissionStatus = await MethodChannelPermissionHandler()
|
||||
.checkPermissionStatus(Permission.calendar);
|
||||
|
||||
expect(permissionStatus, PermissionStatus.restricted);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Should receive limited if user has authorized this application for limited access',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkPermissionStatus',
|
||||
result: PermissionStatus.limited.value,
|
||||
);
|
||||
|
||||
final permissionStatus = await MethodChannelPermissionHandler()
|
||||
.checkPermissionStatus(Permission.calendar);
|
||||
|
||||
expect(permissionStatus, PermissionStatus.limited);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Should receive permanentlyDenied if user denied access and selected to never show a request for this permission again',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkPermissionStatus',
|
||||
result: PermissionStatus.permanentlyDenied.value,
|
||||
);
|
||||
|
||||
final permissionStatus = await MethodChannelPermissionHandler()
|
||||
.checkPermissionStatus(Permission.calendar);
|
||||
|
||||
expect(permissionStatus, PermissionStatus.permanentlyDenied);
|
||||
});
|
||||
});
|
||||
|
||||
group('checkServiceStatus: When checking for service', () {
|
||||
// ignore: lines_longer_than_80_chars
|
||||
test(
|
||||
'Should receive disabled if the service for the permission is disabled',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkServiceStatus',
|
||||
result: ServiceStatus.disabled.value,
|
||||
);
|
||||
|
||||
final serviceStatus = await MethodChannelPermissionHandler()
|
||||
.checkServiceStatus(Permission.calendar);
|
||||
|
||||
expect(serviceStatus, ServiceStatus.disabled);
|
||||
});
|
||||
|
||||
test('Should receive enabled if the service for the permission is enabled',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkServiceStatus',
|
||||
result: ServiceStatus.enabled.value,
|
||||
);
|
||||
|
||||
final serviceStatus = await MethodChannelPermissionHandler()
|
||||
.checkServiceStatus(Permission.calendar);
|
||||
|
||||
expect(serviceStatus, ServiceStatus.enabled);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Should receive notApplicable if the permission does not have an associated service on the current platform',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'checkServiceStatus',
|
||||
result: ServiceStatus.notApplicable.value,
|
||||
);
|
||||
|
||||
final serviceStatus = await MethodChannelPermissionHandler()
|
||||
.checkServiceStatus(Permission.calendar);
|
||||
|
||||
expect(serviceStatus, ServiceStatus.notApplicable);
|
||||
});
|
||||
});
|
||||
|
||||
group('openAppSettings: When opening the App settings', () {
|
||||
test('Should receive true if the page can be opened', () async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'openAppSettings',
|
||||
result: true,
|
||||
);
|
||||
|
||||
final hasOpenedAppSettings =
|
||||
await MethodChannelPermissionHandler().openAppSettings();
|
||||
|
||||
expect(hasOpenedAppSettings, true);
|
||||
});
|
||||
|
||||
test('Should receive false if an error occurred', () async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'openAppSettings',
|
||||
result: false,
|
||||
);
|
||||
|
||||
final hasOpenedAppSettings =
|
||||
await MethodChannelPermissionHandler().openAppSettings();
|
||||
|
||||
expect(hasOpenedAppSettings, false);
|
||||
});
|
||||
});
|
||||
|
||||
group('requestPermissions: When requesting for permission', () {
|
||||
// ignore: lines_longer_than_80_chars
|
||||
test('returns a Map with all the PermissionStatus of the given permissions',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'requestPermissions',
|
||||
result: mockPermissionMap,
|
||||
);
|
||||
|
||||
final result = await MethodChannelPermissionHandler()
|
||||
.requestPermissions(mockPermissions);
|
||||
|
||||
expect(result, isA<Map<Permission, PermissionStatus>>());
|
||||
});
|
||||
});
|
||||
|
||||
group('shouldShowRequestPermissionRationale:', () {
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'should return true when you should show a rationale for requesting permission.',
|
||||
() async {
|
||||
MethodChannelMock(
|
||||
channelName: 'flutter.baseflow.com/permissions/methods',
|
||||
method: 'shouldShowRequestPermissionRationale',
|
||||
result: true,
|
||||
);
|
||||
|
||||
final shouldShowRationale = await MethodChannelPermissionHandler()
|
||||
.shouldShowRequestPermissionRationale(mockPermissions.first);
|
||||
|
||||
expect(shouldShowRationale, true);
|
||||
});
|
||||
});
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
import 'package:permission_handler_platform_interface/src/method_channel/utils/codec.dart';
|
||||
|
||||
void main() {
|
||||
group('Codec', () {
|
||||
test('decodePermissionStatus should return a PermissionStatus', () {
|
||||
expect(decodePermissionStatus(0), PermissionStatus.denied);
|
||||
});
|
||||
|
||||
test('decodeServiceStatus should a corresponding ServiceStatus', () {
|
||||
expect(decodeServiceStatus(0), ServiceStatus.disabled);
|
||||
});
|
||||
|
||||
test(
|
||||
'decodePermissionRequestResult should convert a map<int, int>'
|
||||
'to map<Permission, PermissionStatus>', () {
|
||||
var value = <int, int>{
|
||||
1: 1,
|
||||
};
|
||||
|
||||
var permissionMap = decodePermissionRequestResult(value);
|
||||
|
||||
expect(permissionMap.keys.first, isA<Permission>());
|
||||
expect(permissionMap.values.first, isA<PermissionStatus>());
|
||||
});
|
||||
|
||||
test('encodePermissions should return a list of integers', () {
|
||||
var permissions = [Permission.accessMediaLocation];
|
||||
|
||||
var integers = encodePermissions(permissions);
|
||||
|
||||
expect(integers.first, isA<int>());
|
||||
});
|
||||
});
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
import 'package:permission_handler_platform_interface/src/method_channel/method_channel_permission_handler.dart';
|
||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('$PermissionHandlerPlatform', () {
|
||||
test('$MethodChannelPermissionHandler is the default instance', () {
|
||||
expect(PermissionHandlerPlatform.instance,
|
||||
isA<MethodChannelPermissionHandler>());
|
||||
});
|
||||
|
||||
test('Cannot be implemented with `implements`', () {
|
||||
expect(() {
|
||||
PermissionHandlerPlatform.instance =
|
||||
ImplementsPermissionHandlerPlatform();
|
||||
}, throwsNoSuchMethodError);
|
||||
});
|
||||
|
||||
test('Can be extended with `extend`', () {
|
||||
PermissionHandlerPlatform.instance = ExtendsPermissionHandlerPlatform();
|
||||
});
|
||||
|
||||
test('Can be mocked with `implements`', () {
|
||||
final mock = MockPermissionHandlerPlatform();
|
||||
PermissionHandlerPlatform.instance = mock;
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Default implementation of checkPermissionStatus should throw unimplemented error',
|
||||
() {
|
||||
final permissionHandlerPlatform = ExtendsPermissionHandlerPlatform();
|
||||
|
||||
expect(() {
|
||||
permissionHandlerPlatform
|
||||
.checkPermissionStatus(Permission.accessMediaLocation);
|
||||
}, throwsUnimplementedError);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Default implementation of checkServiceStatus should throw unimplemented error',
|
||||
() {
|
||||
final permissionHandlerPlatform = ExtendsPermissionHandlerPlatform();
|
||||
|
||||
expect(() {
|
||||
permissionHandlerPlatform
|
||||
.checkServiceStatus(Permission.accessMediaLocation);
|
||||
}, throwsUnimplementedError);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Default implementation of openAppSettings should throw unimplemented error',
|
||||
() {
|
||||
final permissionHandlerPlatform = ExtendsPermissionHandlerPlatform();
|
||||
|
||||
expect(
|
||||
permissionHandlerPlatform.openAppSettings, throwsUnimplementedError);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Default implementation of requestPermissions should throw unimplemented error',
|
||||
() {
|
||||
final permissionHandlerPlatform = ExtendsPermissionHandlerPlatform();
|
||||
var permission = <Permission>[Permission.accessMediaLocation];
|
||||
|
||||
expect(() {
|
||||
permissionHandlerPlatform.requestPermissions(permission);
|
||||
}, throwsUnimplementedError);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'Default implementation of shouldShowRequestPermissionRationale should throw unimplemented error',
|
||||
() {
|
||||
final permissionHandlerPlatform = ExtendsPermissionHandlerPlatform();
|
||||
expect(() {
|
||||
permissionHandlerPlatform.shouldShowRequestPermissionRationale(
|
||||
Permission.accessMediaLocation);
|
||||
}, throwsUnimplementedError);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
class ImplementsPermissionHandlerPlatform implements PermissionHandlerPlatform {
|
||||
@override
|
||||
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
||||
}
|
||||
|
||||
class ExtendsPermissionHandlerPlatform extends PermissionHandlerPlatform {}
|
||||
|
||||
class MockPermissionHandlerPlatform extends Mock
|
||||
with
|
||||
// ignore: prefer_mixin
|
||||
MockPlatformInterfaceMixin
|
||||
implements
|
||||
PermissionHandlerPlatform {}
|
@ -0,0 +1,65 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
|
||||
void main() {
|
||||
group('PermissionSatus', () {
|
||||
test('PermissionStatus should contain 5 options', () {
|
||||
const values = PermissionStatus.values;
|
||||
|
||||
expect(values.length, 5);
|
||||
});
|
||||
|
||||
test('PermissionStatus enum should have items in correct index', () {
|
||||
const values = PermissionStatus.values;
|
||||
|
||||
expect(values[0], PermissionStatus.denied);
|
||||
expect(values[1], PermissionStatus.granted);
|
||||
expect(values[2], PermissionStatus.restricted);
|
||||
expect(values[3], PermissionStatus.limited);
|
||||
expect(values[4], PermissionStatus.permanentlyDenied);
|
||||
});
|
||||
});
|
||||
|
||||
group('PermissionStatusValue', () {
|
||||
test('PermissonStatusValue returns right integer', () {
|
||||
expect(PermissionStatus.denied.value, 0);
|
||||
expect(PermissionStatus.granted.value, 1);
|
||||
expect(PermissionStatus.restricted.value, 2);
|
||||
expect(PermissionStatus.limited.value, 3);
|
||||
expect(PermissionStatus.permanentlyDenied.value, 4);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'statusByValue should return right index int that corresponds with the right PermissionStatus',
|
||||
() {
|
||||
expect(PermissionStatusValue.statusByValue(0), PermissionStatus.denied);
|
||||
expect(PermissionStatusValue.statusByValue(1), PermissionStatus.granted);
|
||||
expect(
|
||||
PermissionStatusValue.statusByValue(2), PermissionStatus.restricted);
|
||||
expect(PermissionStatusValue.statusByValue(3), PermissionStatus.limited);
|
||||
expect(PermissionStatusValue.statusByValue(4),
|
||||
PermissionStatus.permanentlyDenied);
|
||||
});
|
||||
});
|
||||
|
||||
group('PermissionStatusGetters', () {
|
||||
test('Getters should return true if statement is met', () {
|
||||
expect(PermissionStatus.denied.isDenied, true);
|
||||
expect(PermissionStatus.granted.isGranted, true);
|
||||
expect(PermissionStatus.restricted.isRestricted, true);
|
||||
expect(PermissionStatus.limited.isLimited, true);
|
||||
expect(PermissionStatus.permanentlyDenied.isPermanentlyDenied, true);
|
||||
});
|
||||
|
||||
test('Getters should return false if statement is not met', () {
|
||||
expect(PermissionStatus.denied.isGranted, false);
|
||||
expect(PermissionStatus.granted.isDenied, false);
|
||||
expect(PermissionStatus.restricted.isDenied, false);
|
||||
expect(PermissionStatus.limited.isDenied, false);
|
||||
expect(PermissionStatus.permanentlyDenied.isDenied, false);
|
||||
});
|
||||
});
|
||||
|
||||
test('test', () {});
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
|
||||
void main() {
|
||||
test('Permission has the right amount of possible PermissionGroup values',
|
||||
() {
|
||||
const values = Permission.values;
|
||||
|
||||
expect(values.length, 31);
|
||||
});
|
||||
|
||||
test('check if byValue returns corresponding PermissionGroup value', () {
|
||||
const values = Permission.values;
|
||||
|
||||
for (var i = 0; i < values.length; i++) {
|
||||
expect(values[i], Permission.byValue(i));
|
||||
}
|
||||
});
|
||||
|
||||
test('check if toString method returns the corresponding name', () {
|
||||
const PermissionWithService permissionWithService =
|
||||
PermissionWithService.private(0);
|
||||
var permissionName = permissionWithService.toString();
|
||||
expect(permissionName, 'Permission.calendar');
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'equality operator should return true for two instances with the same values',
|
||||
() {
|
||||
// Arrange
|
||||
final firstPermission = Permission.byValue(1);
|
||||
final secondPermission = Permission.byValue(1);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
firstPermission == secondPermission,
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'equality operator should return false for two instances with different values',
|
||||
() {
|
||||
// Arrange
|
||||
final firstPermission = Permission.byValue(1);
|
||||
final secondPermission = Permission.byValue(2);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
firstPermission == secondPermission,
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
test('hashCode should be the same for two instances with the same values',
|
||||
() {
|
||||
// Arrange
|
||||
final firstPermission = Permission.byValue(1);
|
||||
final secondPermission = Permission.byValue(1);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
firstPermission.hashCode,
|
||||
secondPermission.hashCode,
|
||||
);
|
||||
});
|
||||
|
||||
test('hashCode should not match for two instances with different values', () {
|
||||
// Arrange
|
||||
final firstPermission = Permission.byValue(1);
|
||||
final secondPermission = Permission.byValue(2);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
firstPermission.hashCode == secondPermission.hashCode,
|
||||
false,
|
||||
);
|
||||
});
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:permission_handler_platform_interface/permission_handler_platform_interface.dart';
|
||||
|
||||
void main() {
|
||||
group('ServiceStatus', () {
|
||||
test('ServiceStatus should contain 3 options', () {
|
||||
const values = ServiceStatus.values;
|
||||
|
||||
expect(values.length, 3);
|
||||
});
|
||||
|
||||
test('ServiceStatus enum should have items in correct index', () {
|
||||
const values = ServiceStatus.values;
|
||||
|
||||
expect(values[0], ServiceStatus.disabled);
|
||||
expect(values[1], ServiceStatus.enabled);
|
||||
expect(values[2], ServiceStatus.notApplicable);
|
||||
});
|
||||
});
|
||||
|
||||
group('ServiceStatusValue', () {
|
||||
test('ServiceStatusValue returns right integer', () {
|
||||
expect(ServiceStatus.disabled.value, 0);
|
||||
expect(ServiceStatus.enabled.value, 1);
|
||||
expect(ServiceStatus.notApplicable.value, 2);
|
||||
});
|
||||
|
||||
test(
|
||||
// ignore: lines_longer_than_80_chars
|
||||
'statusByValue should return right index int that corresponds with the right PermissionStatus',
|
||||
() {
|
||||
expect(ServiceStatusValue.statusByValue(0), ServiceStatus.disabled);
|
||||
expect(ServiceStatusValue.statusByValue(1), ServiceStatus.enabled);
|
||||
expect(ServiceStatusValue.statusByValue(2), ServiceStatus.notApplicable);
|
||||
});
|
||||
});
|
||||
|
||||
group('ServiceStatusGetters', () {
|
||||
test('Getters should return true if statement is met', () {
|
||||
expect(ServiceStatus.disabled.isDisabled, true);
|
||||
expect(ServiceStatus.enabled.isEnabled, true);
|
||||
expect(ServiceStatus.notApplicable.isNotApplicable, true);
|
||||
});
|
||||
|
||||
test('Getters should return false if statement is not met', () {
|
||||
expect(ServiceStatus.disabled.isEnabled, false);
|
||||
expect(ServiceStatus.enabled.isDisabled, false);
|
||||
expect(ServiceStatus.notApplicable.isDisabled, false);
|
||||
});
|
||||
});
|
||||
}
|
Loading…
Reference in new issue