diff --git a/packages/dart/npt_flutter/assets/advance.svg b/packages/dart/npt_flutter/assets/advance.svg
new file mode 100644
index 000000000..df588c3b0
--- /dev/null
+++ b/packages/dart/npt_flutter/assets/advance.svg
@@ -0,0 +1,232 @@
+
diff --git a/packages/dart/npt_flutter/assets/list_dashes.svg b/packages/dart/npt_flutter/assets/list_dashes.svg
new file mode 100644
index 000000000..c4ddf2fd8
--- /dev/null
+++ b/packages/dart/npt_flutter/assets/list_dashes.svg
@@ -0,0 +1,15 @@
+
diff --git a/packages/dart/npt_flutter/assets/noports_logo.svg b/packages/dart/npt_flutter/assets/noports_logo.svg
new file mode 100644
index 000000000..a966e86c4
--- /dev/null
+++ b/packages/dart/npt_flutter/assets/noports_logo.svg
@@ -0,0 +1,20 @@
+
diff --git a/packages/dart/npt_flutter/assets/radio_button.svg b/packages/dart/npt_flutter/assets/radio_button.svg
new file mode 100644
index 000000000..a1256bdca
--- /dev/null
+++ b/packages/dart/npt_flutter/assets/radio_button.svg
@@ -0,0 +1,11 @@
+
diff --git a/packages/dart/npt_flutter/assets/simple.svg b/packages/dart/npt_flutter/assets/simple.svg
new file mode 100644
index 000000000..47ef0d5a8
--- /dev/null
+++ b/packages/dart/npt_flutter/assets/simple.svg
@@ -0,0 +1,297 @@
+
diff --git a/packages/dart/npt_flutter/devtools_options.yaml b/packages/dart/npt_flutter/devtools_options.yaml
new file mode 100644
index 000000000..fa0b357c4
--- /dev/null
+++ b/packages/dart/npt_flutter/devtools_options.yaml
@@ -0,0 +1,3 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:
diff --git a/packages/dart/npt_flutter/ios/Podfile.lock b/packages/dart/npt_flutter/ios/Podfile.lock
new file mode 100644
index 000000000..d347cfea1
--- /dev/null
+++ b/packages/dart/npt_flutter/ios/Podfile.lock
@@ -0,0 +1,165 @@
+PODS:
+ - at_backupkey_flutter (0.0.1):
+ - Flutter
+ - at_file_saver (0.0.1):
+ - Flutter
+ - at_onboarding_flutter (0.0.1):
+ - Flutter
+ - biometric_storage (0.0.1):
+ - Flutter
+ - device_info_plus (0.0.1):
+ - Flutter
+ - DKImagePickerController/Core (4.3.9):
+ - DKImagePickerController/ImageDataManager
+ - DKImagePickerController/Resource
+ - DKImagePickerController/ImageDataManager (4.3.9)
+ - DKImagePickerController/PhotoGallery (4.3.9):
+ - DKImagePickerController/Core
+ - DKPhotoGallery
+ - DKImagePickerController/Resource (4.3.9)
+ - DKPhotoGallery (0.0.19):
+ - DKPhotoGallery/Core (= 0.0.19)
+ - DKPhotoGallery/Model (= 0.0.19)
+ - DKPhotoGallery/Preview (= 0.0.19)
+ - DKPhotoGallery/Resource (= 0.0.19)
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Core (0.0.19):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Preview
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Model (0.0.19):
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Preview (0.0.19):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Resource
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Resource (0.0.19):
+ - SDWebImage
+ - SwiftyGif
+ - file_picker (0.0.1):
+ - DKImagePickerController/PhotoGallery
+ - Flutter
+ - file_selector_ios (0.0.1):
+ - Flutter
+ - Flutter (1.0.0)
+ - flutter_keychain (0.0.1):
+ - Flutter
+ - MTBBarcodeScanner (5.0.11)
+ - package_info_plus (0.4.5):
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - permission_handler_apple (9.3.0):
+ - Flutter
+ - qr_code_scanner (0.2.0):
+ - Flutter
+ - MTBBarcodeScanner
+ - SDWebImage (5.19.4):
+ - SDWebImage/Core (= 5.19.4)
+ - SDWebImage/Core (5.19.4)
+ - share_plus (0.0.1):
+ - Flutter
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - SwiftyGif (5.4.5)
+ - url_launcher_ios (0.0.1):
+ - Flutter
+ - webview_flutter_wkwebview (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - at_backupkey_flutter (from `.symlinks/plugins/at_backupkey_flutter/ios`)
+ - at_file_saver (from `.symlinks/plugins/at_file_saver/ios`)
+ - at_onboarding_flutter (from `.symlinks/plugins/at_onboarding_flutter/ios`)
+ - biometric_storage (from `.symlinks/plugins/biometric_storage/ios`)
+ - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
+ - file_picker (from `.symlinks/plugins/file_picker/ios`)
+ - file_selector_ios (from `.symlinks/plugins/file_selector_ios/ios`)
+ - Flutter (from `Flutter`)
+ - flutter_keychain (from `.symlinks/plugins/flutter_keychain/ios`)
+ - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
+ - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`)
+ - share_plus (from `.symlinks/plugins/share_plus/ios`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+ - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
+
+SPEC REPOS:
+ trunk:
+ - DKImagePickerController
+ - DKPhotoGallery
+ - MTBBarcodeScanner
+ - SDWebImage
+ - SwiftyGif
+
+EXTERNAL SOURCES:
+ at_backupkey_flutter:
+ :path: ".symlinks/plugins/at_backupkey_flutter/ios"
+ at_file_saver:
+ :path: ".symlinks/plugins/at_file_saver/ios"
+ at_onboarding_flutter:
+ :path: ".symlinks/plugins/at_onboarding_flutter/ios"
+ biometric_storage:
+ :path: ".symlinks/plugins/biometric_storage/ios"
+ device_info_plus:
+ :path: ".symlinks/plugins/device_info_plus/ios"
+ file_picker:
+ :path: ".symlinks/plugins/file_picker/ios"
+ file_selector_ios:
+ :path: ".symlinks/plugins/file_selector_ios/ios"
+ Flutter:
+ :path: Flutter
+ flutter_keychain:
+ :path: ".symlinks/plugins/flutter_keychain/ios"
+ package_info_plus:
+ :path: ".symlinks/plugins/package_info_plus/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ permission_handler_apple:
+ :path: ".symlinks/plugins/permission_handler_apple/ios"
+ qr_code_scanner:
+ :path: ".symlinks/plugins/qr_code_scanner/ios"
+ share_plus:
+ :path: ".symlinks/plugins/share_plus/ios"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+ webview_flutter_wkwebview:
+ :path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
+
+SPEC CHECKSUMS:
+ at_backupkey_flutter: 2fc3d01138175e41bce8b574387a47544c53e01b
+ at_file_saver: c0e052c72d8c0296318bd70f2ae7f510887014ce
+ at_onboarding_flutter: e8219b6d0bfb236d3837ec3528871aebdcc56e8d
+ biometric_storage: 1400f1382af3a4cc2bf05340e13c3d8de873ceb9
+ device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
+ DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
+ DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
+ file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
+ file_selector_ios: f0670c1064a8c8450e38145d8043160105d0b97c
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ flutter_keychain: 01aabf894ffe8b01adfda1d9df21c210c1b4b452
+ MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
+ package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
+ qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
+ SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d
+ share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
+ webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
+
+PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
+
+COCOAPODS: 1.14.3
diff --git a/packages/dart/npt_flutter/ios/Runner.xcodeproj/project.pbxproj b/packages/dart/npt_flutter/ios/Runner.xcodeproj/project.pbxproj
index b530ac725..d91aa6e47 100644
--- a/packages/dart/npt_flutter/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/dart/npt_flutter/ios/Runner.xcodeproj/project.pbxproj
@@ -14,6 +14,8 @@
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ ABE4398EDCB374DB3C744673 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0542A615ED37F8C89E756574 /* Pods_RunnerTests.framework */; };
+ FF90A8197CAEDF056A31D4BC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 533AF0BA188888B33F52F215 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -40,11 +42,16 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 0542A615ED37F8C89E756574 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 1A2A58DCFC85BDDEEC352839 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ 23F105CD2887A1BA835D3BEF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 47A9CCBF73EFA85D3A135C32 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 533AF0BA188888B33F52F215 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
@@ -55,6 +62,9 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ B51C1C3B5EDD481D35B1F82E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ BBF33EB0ED02DACC5C0FCBCC /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ F4E98D1042220D05EB47E718 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -62,6 +72,15 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ FF90A8197CAEDF056A31D4BC /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ BBDA3723460887ED196722D8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ ABE4398EDCB374DB3C744673 /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -76,6 +95,15 @@
path = RunnerTests;
sourceTree = "";
};
+ 452321B41B775E8B94E1C4DC /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 533AF0BA188888B33F52F215 /* Pods_Runner.framework */,
+ 0542A615ED37F8C89E756574 /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -94,6 +122,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
+ B369985015352CE4455B46A3 /* Pods */,
+ 452321B41B775E8B94E1C4DC /* Frameworks */,
);
sourceTree = "";
};
@@ -121,6 +151,20 @@
path = Runner;
sourceTree = "";
};
+ B369985015352CE4455B46A3 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ F4E98D1042220D05EB47E718 /* Pods-Runner.debug.xcconfig */,
+ 23F105CD2887A1BA835D3BEF /* Pods-Runner.release.xcconfig */,
+ B51C1C3B5EDD481D35B1F82E /* Pods-Runner.profile.xcconfig */,
+ 47A9CCBF73EFA85D3A135C32 /* Pods-RunnerTests.debug.xcconfig */,
+ BBF33EB0ED02DACC5C0FCBCC /* Pods-RunnerTests.release.xcconfig */,
+ 1A2A58DCFC85BDDEEC352839 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ name = Pods;
+ path = Pods;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -128,8 +172,10 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
+ B5F9916D88B9E984D2CD7E37 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
+ BBDA3723460887ED196722D8 /* Frameworks */,
);
buildRules = (
);
@@ -145,12 +191,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ 86AE4F50BCFE929F9FB3B5D3 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 5ED76DEB71D5788F7D4C4845 /* [CP] Embed Pods Frameworks */,
+ 8C0F3CD693F51E1153307A85 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -238,6 +287,62 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
+ 5ED76DEB71D5788F7D4C4845 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 86AE4F50BCFE929F9FB3B5D3 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 8C0F3CD693F51E1153307A85 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -253,6 +358,28 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ B5F9916D88B9E984D2CD7E37 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -379,6 +506,7 @@
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 47A9CCBF73EFA85D3A135C32 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -396,6 +524,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = BBF33EB0ED02DACC5C0FCBCC /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -411,6 +540,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 1A2A58DCFC85BDDEEC352839 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
diff --git a/packages/dart/npt_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/dart/npt_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata
index 1d526a16e..21a3cc14c 100644
--- a/packages/dart/npt_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ b/packages/dart/npt_flutter/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -4,4 +4,7 @@
+
+
diff --git a/packages/dart/npt_flutter/l10n.yaml b/packages/dart/npt_flutter/l10n.yaml
new file mode 100644
index 000000000..a5b643abb
--- /dev/null
+++ b/packages/dart/npt_flutter/l10n.yaml
@@ -0,0 +1,3 @@
+arb-dir: lib/localization
+template-arb-file: app_en.arb
+output-localization-file: app_localizations.dart
\ No newline at end of file
diff --git a/packages/dart/npt_flutter/lib/app.dart b/packages/dart/npt_flutter/lib/app.dart
index 3a16b5241..b23881584 100644
--- a/packages/dart/npt_flutter/lib/app.dart
+++ b/packages/dart/npt_flutter/lib/app.dart
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:npt_flutter/features/features.dart';
import 'package:npt_flutter/routes.dart';
+import 'package:npt_flutter/styles/app_theme.dart';
export 'package:npt_flutter/features/logging/logging.dart';
@@ -29,72 +31,86 @@ class App extends StatelessWidget {
),
],
child: MultiBlocProvider(
- providers: [
- BlocProvider(
- create: (_) => EnableLoggingCubit(),
- ),
+ providers: [
+ BlocProvider(
+ create: (_) => EnableLoggingCubit(),
+ ),
- /// Logging provider must come before ALL [LoggingBloc] & [LoggingCubit] providers
- /// There MUST be a [LogsCubit] provider as an ancestor widget
- BlocProvider(
- create: (_) => LogsCubit(),
- ),
+ /// Logging provider must come before ALL [LoggingBloc] & [LoggingCubit] providers
+ /// There MUST be a [LogsCubit] provider as an ancestor widget
+ BlocProvider(
+ create: (_) => LogsCubit(),
+ ),
- /// A cubit which manages the onboarding status
- BlocProvider(
- create: (_) => OnboardingCubit(),
- ),
+ /// A cubit which manages the onboarding status
+ BlocProvider(
+ create: (_) => OnboardingCubit(),
+ ),
- /// Settings provider, not much else to say
- /// - If settings are not found, we automatically load some defaults
- /// so it is possible that someone's settings get wiped if there is
- /// an issue loading them
- BlocProvider(
- create: (ctx) => SettingsBloc(ctx.read()),
- ),
+ /// Settings provider, not much else to say
+ /// - If settings are not found, we automatically load some defaults
+ /// so it is possible that someone's settings get wiped if there is
+ /// an issue loading them
+ BlocProvider(
+ create: (ctx) => SettingsBloc(ctx.read()),
+ ),
- /// - A list of all the uuids for profiles which have been found in persistence
- /// - This list is ALL of the profiles which are loaded in the app for the onboarded atSign
- /// Note that multiple client atSigns have not been considered as part of the current implementation
- BlocProvider(
- create: (ctx) => ProfileListBloc(ctx.read()),
- ),
+ /// - A list of all the uuids for profiles which have been found in persistence
+ /// - This list is ALL of the profiles which are loaded in the app for the onboarded atSign
+ /// Note that multiple client atSigns have not been considered as part of the current implementation
+ BlocProvider(
+ create: (ctx) => ProfileListBloc(ctx.read()),
+ ),
- /// A cubit which caches [ProfileBloc] by uuid so they can be shared
- /// between the dashboard and the system tray
- BlocProvider(
- create: (ctx) => ProfileCacheCubit(ctx.read()),
- ),
+ /// A cubit which caches [ProfileBloc] by uuid so they can be shared
+ /// between the dashboard and the system tray
+ BlocProvider(
+ create: (ctx) => ProfileCacheCubit(ctx.read()),
+ ),
- /// [ProfilesSelectedCubit] reads from [ProfileListBloc], and must be under it
- /// - A list of the uuids for profiles which have been check selected in the UI
- BlocProvider(
- create: (_) => ProfilesSelectedCubit(),
- ),
+ /// [ProfilesSelectedCubit] reads from [ProfileListBloc], and must be under it
+ /// - A list of the uuids for profiles which have been check selected in the UI
+ BlocProvider(
+ create: (_) => ProfilesSelectedCubit(),
+ ),
- /// - A map of uuid: SocketConnector for running profiles (a cache of running connections)
- BlocProvider(
- create: (_) => ProfilesRunningCubit(),
- ),
+ /// - A map of uuid: SocketConnector for running profiles (a cache of running connections)
+ BlocProvider(
+ create: (_) => ProfilesRunningCubit(),
+ ),
/// A cubit which manages the system tray entries
BlocProvider(
create: (_) => TrayCubit(),
),
- /// A bloc which manages favorites
- BlocProvider(
- create: (ctx) => FavoriteBloc(ctx.read()),
- ),
- ],
- child: TrayManager(
- child: MaterialApp(
- navigatorKey: navState,
- initialRoute: Routes.onboarding,
- routes: Routes.routes,
- ),
- ),
- ),
+ /// A bloc which manages favorites
+ BlocProvider(
+ create: (ctx) => FavoriteBloc(ctx.read()),
+ ),
+ ],
+ child: BlocSelector(selector: (state) {
+ if (state is SettingsLoadedState) {
+ return state.settings.language;
+ }
+
+ return Language.english;
+ }, builder: (context, language) {
+ return TrayManager(
+ child: MaterialApp(
+ theme: AppTheme.light(),
+ localizationsDelegates: AppLocalizations.localizationsDelegates,
+ supportedLocales: AppLocalizations.supportedLocales,
+ locale: language.locale,
+ localeResolutionCallback: (locale, supportedLocales) {
+ return language.locale;
+ },
+ navigatorKey: navState,
+ initialRoute: Routes.onboarding,
+ routes: Routes.routes,
+ ),
+ );
+ })),
);
}
}
diff --git a/packages/dart/npt_flutter/lib/constants.dart b/packages/dart/npt_flutter/lib/constants.dart
index e12ec1250..843267e9e 100644
--- a/packages/dart/npt_flutter/lib/constants.dart
+++ b/packages/dart/npt_flutter/lib/constants.dart
@@ -13,10 +13,5 @@ class Constants {
"@rv_ap": "Singapore",
};
- // Languages (TODO)
- // English
- // Spanish
- // Br portuguese
- // Mandarin
- // Cantonese
+ static const languages = ['English', 'Spanish', 'Br portuguese', 'Mandarin', 'Cantonese'];
}
diff --git a/packages/dart/npt_flutter/lib/features/logging/widgets/export_logs_button.dart b/packages/dart/npt_flutter/lib/features/logging/widgets/export_logs_button.dart
index cfdf4e6a8..ed3fd91ca 100644
--- a/packages/dart/npt_flutter/lib/features/logging/widgets/export_logs_button.dart
+++ b/packages/dart/npt_flutter/lib/features/logging/widgets/export_logs_button.dart
@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:npt_flutter/features/logging/logging.dart';
class ExportLogsButton extends StatelessWidget {
@@ -10,13 +11,14 @@ class ExportLogsButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return ElevatedButton(
+ final strings = AppLocalizations.of(context)!;
+ return TextButton.icon(
onPressed: () async {
var list = context.read().logs;
final timestamp = DateTime.now().millisecondsSinceEpoch;
String? outputFile = await FilePicker.platform.saveFile(
- dialogTitle: 'Please select a file to export to:',
- fileName: 'NoPorts-Logs-$timestamp.txt',
+ dialogTitle: strings.selectExportFile,
+ fileName: 'NoPorts-${strings.logs}-$timestamp.txt',
);
if (outputFile == null) return;
@@ -25,7 +27,8 @@ class ExportLogsButton extends StatelessWidget {
await f.create(recursive: true);
await f.writeAsString(list.join("\n"));
},
- child: const Text("Export Logs"),
+ label: Text(strings.exportLogs),
+ icon: const Icon(Icons.download),
);
}
}
diff --git a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart
index 011563724..53d269738 100644
--- a/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart
+++ b/packages/dart/npt_flutter/lib/features/onboarding/widgets/onboarding_button.dart
@@ -1,3 +1,4 @@
+import 'package:at_contacts_flutter/at_contacts_flutter.dart';
import 'package:at_onboarding_flutter/at_onboarding_flutter.dart';
import 'package:flutter/material.dart';
import 'package:npt_flutter/constants.dart';
@@ -55,6 +56,7 @@ class _OnboardingButtonState extends State {
if (mounted) {
switch (onboardingResult.status) {
case AtOnboardingResultStatus.success:
+ await initializeContactsService(rootDomain: Constants.rootDomain);
postOnboard(onboardingResult.atsign!);
Navigator.of(context).pushReplacementNamed(widget.nextRoute);
break;
diff --git a/packages/dart/npt_flutter/lib/features/settings/models/settings.dart b/packages/dart/npt_flutter/lib/features/settings/models/settings.dart
index af6035399..4a86142ed 100644
--- a/packages/dart/npt_flutter/lib/features/settings/models/settings.dart
+++ b/packages/dart/npt_flutter/lib/features/settings/models/settings.dart
@@ -1,5 +1,6 @@
-import 'package:npt_flutter/app.dart';
+import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';
+import 'package:npt_flutter/app.dart';
part 'settings.g.dart';
@@ -18,6 +19,10 @@ enum PreferredViewLayout {
enum Language {
@JsonValue("en")
english,
+ @JsonValue("es")
+ spanish,
+ @JsonValue("pt-br")
+ portuguese,
}
@JsonSerializable()
@@ -59,8 +64,7 @@ class Settings extends Loggable {
static const String customRelayKey = 'custom';
Map toJson() => _$SettingsToJson(this);
- factory Settings.fromJson(Map json) =>
- _$SettingsFromJson(json);
+ factory Settings.fromJson(Map json) => _$SettingsFromJson(json);
@override
List