From 55824ddb21e1731c3833cfc2e32506c36434f65e Mon Sep 17 00:00:00 2001 From: cancerai Date: Mon, 6 Apr 2026 16:14:35 +0800 Subject: [PATCH] add: password-generator tool --- .../password-generator/android/.gitignore | 45 +++ PP-tools/password-generator/android/README.md | 16 + .../android/analysis_options.yaml | 28 ++ .../android/android/.gitignore | 14 + .../android/android/app/build.gradle.kts | 44 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 45 +++ .../android/app/src/main/icon-playstore.png | Bin 0 -> 7866 bytes .../password_generator/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../src/main/res/drawable/icon_background.xml | 74 +++++ .../src/main/res/drawable/icon_foreground.xml | 14 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-anydpi-v26/icon.xml | 5 + .../main/res/mipmap-anydpi-v26/icon_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../app/src/main/res/mipmap-hdpi/icon.webp | Bin 0 -> 674 bytes .../src/main/res/mipmap-hdpi/icon_round.webp | Bin 0 -> 1940 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../app/src/main/res/mipmap-mdpi/icon.webp | Bin 0 -> 486 bytes .../src/main/res/mipmap-mdpi/icon_round.webp | Bin 0 -> 1484 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../app/src/main/res/mipmap-xhdpi/icon.webp | Bin 0 -> 892 bytes .../src/main/res/mipmap-xhdpi/icon_round.webp | Bin 0 -> 2664 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../app/src/main/res/mipmap-xxhdpi/icon.webp | Bin 0 -> 1184 bytes .../main/res/mipmap-xxhdpi/icon_round.webp | Bin 0 -> 4132 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/mipmap-xxxhdpi/icon.webp | Bin 0 -> 1648 bytes .../main/res/mipmap-xxxhdpi/icon_round.webp | Bin 0 -> 5914 bytes .../app/src/main/res/values-night/styles.xml | 18 ++ .../src/main/res/values/icon_background.xml | 4 + .../app/src/main/res/values/styles.xml | 18 ++ .../app/src/profile/AndroidManifest.xml | 7 + .../android/android/build.gradle.kts | 24 ++ .../android/android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/android/settings.gradle.kts | 26 ++ .../password-generator/android/lib/main.dart | 284 ++++++++++++++++++ .../password-generator/android/pubspec.lock | 213 +++++++++++++ .../password-generator/android/pubspec.yaml | 89 ++++++ .../android/test/widget_test.dart | 30 ++ 42 files changed, 1046 insertions(+) create mode 100755 PP-tools/password-generator/android/.gitignore create mode 100755 PP-tools/password-generator/android/README.md create mode 100755 PP-tools/password-generator/android/analysis_options.yaml create mode 100755 PP-tools/password-generator/android/android/.gitignore create mode 100755 PP-tools/password-generator/android/android/app/build.gradle.kts create mode 100755 PP-tools/password-generator/android/android/app/src/debug/AndroidManifest.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/AndroidManifest.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/icon-playstore.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/kotlin/org/cancerai/password_generator/MainActivity.kt create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_background.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_foreground.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/drawable/launch_background.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon_round.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/icon.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/icon_round.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-mdpi/icon.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-mdpi/icon_round.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/icon.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/icon_round.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon_round.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon_round.webp create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/values-night/styles.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/values/icon_background.xml create mode 100755 PP-tools/password-generator/android/android/app/src/main/res/values/styles.xml create mode 100755 PP-tools/password-generator/android/android/app/src/profile/AndroidManifest.xml create mode 100755 PP-tools/password-generator/android/android/build.gradle.kts create mode 100755 PP-tools/password-generator/android/android/gradle.properties create mode 100755 PP-tools/password-generator/android/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 PP-tools/password-generator/android/android/settings.gradle.kts create mode 100755 PP-tools/password-generator/android/lib/main.dart create mode 100755 PP-tools/password-generator/android/pubspec.lock create mode 100755 PP-tools/password-generator/android/pubspec.yaml create mode 100755 PP-tools/password-generator/android/test/widget_test.dart diff --git a/PP-tools/password-generator/android/.gitignore b/PP-tools/password-generator/android/.gitignore new file mode 100755 index 0000000..3820a95 --- /dev/null +++ b/PP-tools/password-generator/android/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/PP-tools/password-generator/android/README.md b/PP-tools/password-generator/android/README.md new file mode 100755 index 0000000..d7fb564 --- /dev/null +++ b/PP-tools/password-generator/android/README.md @@ -0,0 +1,16 @@ +# password_generator + +password generator + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/PP-tools/password-generator/android/analysis_options.yaml b/PP-tools/password-generator/android/analysis_options.yaml new file mode 100755 index 0000000..0d29021 --- /dev/null +++ b/PP-tools/password-generator/android/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/PP-tools/password-generator/android/android/.gitignore b/PP-tools/password-generator/android/android/.gitignore new file mode 100755 index 0000000..be3943c --- /dev/null +++ b/PP-tools/password-generator/android/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/PP-tools/password-generator/android/android/app/build.gradle.kts b/PP-tools/password-generator/android/android/app/build.gradle.kts new file mode 100755 index 0000000..bbcc421 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "org.cancerai.password_generator" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "org.cancerai.password_generator" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/PP-tools/password-generator/android/android/app/src/debug/AndroidManifest.xml b/PP-tools/password-generator/android/android/app/src/debug/AndroidManifest.xml new file mode 100755 index 0000000..399f698 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/AndroidManifest.xml b/PP-tools/password-generator/android/android/app/src/main/AndroidManifest.xml new file mode 100755 index 0000000..9025b80 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/icon-playstore.png b/PP-tools/password-generator/android/android/app/src/main/icon-playstore.png new file mode 100755 index 0000000000000000000000000000000000000000..4941176a2d0b0768f64b5422eb06486402565ceb GIT binary patch literal 7866 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 A>i_@% literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/kotlin/org/cancerai/password_generator/MainActivity.kt b/PP-tools/password-generator/android/android/app/src/main/kotlin/org/cancerai/password_generator/MainActivity.kt new file mode 100755 index 0000000..cd2e474 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/kotlin/org/cancerai/password_generator/MainActivity.kt @@ -0,0 +1,5 @@ +package org.cancerai.password_generator + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/PP-tools/password-generator/android/android/app/src/main/res/drawable-v21/launch_background.xml b/PP-tools/password-generator/android/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100755 index 0000000..f74085f --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_background.xml b/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_background.xml new file mode 100755 index 0000000..ca3826a --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_foreground.xml b/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_foreground.xml new file mode 100755 index 0000000..4b82114 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/drawable/icon_foreground.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/res/drawable/launch_background.xml b/PP-tools/password-generator/android/android/app/src/main/res/drawable/launch_background.xml new file mode 100755 index 0000000..304732f --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon.xml b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon.xml new file mode 100755 index 0000000..e9984d8 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon_round.xml b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon_round.xml new file mode 100755 index 0000000..e9984d8 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-anydpi-v26/icon_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/icon.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-hdpi/icon.webp new file mode 100755 index 0000000000000000000000000000000000000000..55e7359262def92ba22b9727bc3546fb535a7726 GIT binary patch literal 674 zcmV;T0$u%5Nk&GR0ssJ4MM6+kP&iDD0ssInN5ByfHOSSrZEc(Hh)SNiWh$Ii=N!SW zFf%hVGcz+w`sK`A$<|l!_`VTvt8H7JeBUp)yS1s%4Xn(eq^4(uw5f2Y+@(q~12TZF z^Z&^;0m!^R#ivZ=Q%u2A0;P;Z;ISIilPAfeR3{+apn zP{X6+lmRTVLauNaIHY5Ufhsq`+^J6uNb9ILwM$Qfm{k~%;wtg$#uN|8NcnC69*g$? zTJ!+$X}MLSQk4@H$5jF?o~j03(Q+-9;W%Wmp8;AtlEdHyJ&qiQEDmsB0C^;rgKAuh z7Vw6}eG5Q~w-$l-w4^oz)#^x!JH#)YvFekac5ymX#F0iGh*OL+Fo#!qCLg05Uu*FT z&-7E2{j-1)TeyaS%N|Np>_zfCNDTBuEk@K!P9v z5=3XCv(@;PU6VDL``RlZqQpd>%t%ERWhwTQicEj#mly>|B^?ml-;fHc|K*0$OI z4w#uaDKj%OGnv*<`+Jo|WbQ~EZVi7*hH_QLZ}dz=|0e*gHf_grk~$7%v17WXM3`oz zA}1?Ks)UJVD6ciRadpc)jU0!GB~`Lpq!5wUG=_^k;^v^=Mx@9v3XRgqQ;m#hV{=&Y zOJsV8Vyh^2J?)W&p7uzTG$7_I$zf$x{>mlhljYOM<*&<_vml2?ClTXLvknSk=rZqEJR^PhXMz#oix2fKbr4=*!j^rN{2O z(@0`wbrI)Pp^c_7Iz5TgF$Mb%5%7Q{mZkxUBhQ~dA1eY(Wo#sZ0em$UO-W@sSpC6e zDj~Z8Xc;~BSJKVnPpeI^u4L2H=}TNnVY)c5kAOT0XFGr`ca%T1186^O^Hk$!LoiBa z3RYZlHA$R+=2bZr{)pl4c*+N0r)a&b`gBW4Q;VutIVrd0Lj||ruFq^iK2>S8rMEpPy zO~D?!U7bnl(*67AW}xlZeRnENOq{)c|D88*&3}F*R*0q>^u0+L&38soR0Y~1_oNxB zNfb3^4Vv-8{UAce0k`63MrT?2X9j~de<8$i9NfNKRXE4b;CpPa&CM5dj9jfUI;MjU z)?uj>N_dL-;74tt>Y8?XBP^Bhg=Q>Q%G7M|2Y{`Xo_RO7O?bWyFCtGujepCrJ@Z+|IYvjq5;OIs+jJF#>sMqDxuD5cJ{h zIpq%o(Fu-hIxva2ku%qpbV@p!B*{NX-AOWC;Hwies$I&SZ2|`@#190jc791rr6}XQ zmz4G1*CnOBFDc(vC#JV;}ZX;qm35!8gwt%+KIC-a-Bgq{scjn{V9X z%VC;NyJHU-)HBZ@Owa06%&0bbdkr6Zm864Lm4kXu9UFk5soG(KpGn3rv^Ni){r~Lp zm^Rp3RfZN{zAtb;1wD^tql!t2hF^H&Gqfzn>ETrZ)tBn}TO>_OQAGt-7bxj8_v@%7 zdg@a>%=FX>Q1|GGo$?gZWOmi+*ZhO0Lfy%j`B7D%(N!zD8Kv!{ReN*cT4;P!l~_W& ze>G@!)8;Nl)iCT*oTh>+wvXSddWM&H{-pd@Q3p;Ru~W?eWe2;}fTpc_zx`pDfcv#p)z+wCuYPLPXV#Da z<;Oc$g@(}Sfzz#X@~VafR@Bz0{BJq;oP*A#;W1cN#v4^wu0FKcX6&o4x>Ake>dW$r ziqZV?>#fJtmFr`)7-Z9$&;&Z3w*1}iT}%Z^7_NS8CbhmUsY*u8K5bNY}`6Ba%9;Fpv>j8@7}uG+6QzVG`DzAlndqx%v*_u%-&<;L0dG1?N`&8jR{zY#jF zHT?F&Z@m9Gp$Gk_f}>Iz6#CPXUlQJYcl%+Cp+$LSGg!85-m3E2b)hk|9lFBcGgdux z@#V*#{QW+xbyEAx&bj|Yt&@HToAT=8M=s8q3tgaX-rcHlGuj%Ql|yqY)P+XS655Si zsQW^_=WaG;yYY?9a~JA0bmYI&C(h1I3ef(+S|Q~vYOGslk$O;nVjh~#%1`{KY27+r a`R@R;7VKbq*~r@?bo+9{|7jT!#Aq@7nbLLu literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@UMNk&HA0RRA3MM6+kP&iD{0RR9mFTe{Bl|Zt#?RfKTt8N#;S(nmf*mgUz zZJVi$KO8!L`hLau{eH#Y8v!{G0D?_y+cu_1zge%`z?jN<`X&JXN^jU30Z*v&h9q(* zr3#5?FME3KF0f1@dP89(dQ+}L$AkS9Tz4F%QHHZ0JJ|8~aK?h6ykUH(C{K3Em;F!q z1CE*c)AMkX1rk9PZcV@5$slk;fBNWJp%rR;_Vva|!&*g(lbX%1qWF;FN%3OAr~&%C zXDMzr)T*5sVc4VVu#MC9}aK12jb#B+VY2oRLo`u`fZ-4rrXH{|D6AlvKZ^4$vd4%wMylH-w>BIBPw7XM4N!xNr6W+G0zM(( zzfw^N2fP(ftOz#zR2Dd3uK=m?SHL@Rc$gV;tyQwtGOD(j>6jVm^n6y)R0(UX>XXwc zH#0wLEqP`b7vQQeGkY`hj|(t(W|mOIHx!sNa|sFh%(!2_zGfa?U$OTF)+$@&uYmFj z6)IGKy((6yP+{+l3Kc3_rS844_eO;ZD4&_aT5EP@Ff&ip`pM~J&dek%GXrF2#tz&0 z_3Bw`{o?%mdgW>dyRTngHFwX?UB_`K)hMiRR7!;kdvBn!YOcI%t@@b}X2!GDntJ>G zeu7k?LWR%2KkU7+_qISpq8fnbI1blw9Q5`7U#MvBJ&)Z#|ElEVbaGd{$8i`Jx7+ku z3p0b6!CDI^rxRudRn6ty-Nec1^m}?fH_i;M?(gSj=IA(%-{Ux{zW)C=_uhRUzrTy0 ze}B!#aR}EB4-0SK-#=)6{rb|bA0CQd|Npn2e}CfV-{0%a<730u|G%lAxc~nd$@$Li zo^9VvQ0?TbnVfCA?xMEa`)2C)Y~R)9)jhLr&z#L!wQbDgm(2bJzfXP<{ht8xZR$~w zr>Fq2|#zP2)Dg@e}PSAbngnL_Zm_UFsM9W(Ux(}Uj zkHv9^19cSRCW0&RHD#t;?UpQ@>8bX+Yi7zR zUUuhKB05E`7wEOm4HT2Scxo5V-GGa{tjoV9Jl;bn_3(MVAKEW8>Hy)fZbJJP z!S{lFLc=~GtS?;$3ETRXrg2{pzVBa}F8PU2W~`sVM~}_s;-e_$S;vk_AN+E8(sEz* zGu$nii^;B3m|Nlw_tE*OJS`e|njHvDT8#o8xf&z+q7|zr2|3OCd=`o7w6{Aah0s|6 zPzr!j5VB+AzoC^TDqhNQF~1@TFH|8DTJDC<4oX9({7Kt$HG+ZPui!*!NLVxeAOnC_ zc4L?3PNvk_#lF|1GCBE^c9hi!fPtFRIG#4a4Y(jJj+biFmNaN(z8qpD80d2HSfJ?1 zK-bv0-<4TLnYF5)_Q|&ym{dGDKulu5mIHTI)yUKQxz<~~&ayd+w(9eR{Mqz^kyrQ4 zKC!OBb&Z8@*UQ^NqI#M7n+C+F5Fe8%u4cW z{8{UV=LcB%%63E?TS+T??#EhxZXy5X)@qG+FCWM;ByGMBn&D9h%`d0X?!Rj3roa(RfZG|4wP66&=8 literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..09d4391482be68e9e4a07fab769b5de337d16eb1 GIT binary patch literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/icon.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xhdpi/icon.webp new file mode 100755 index 0000000000000000000000000000000000000000..8604be1bb3ae33c0e782eb759628f563d704cbe9 GIT binary patch literal 892 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 WX=!taDXLUJ6AeQ`R4S2uHVyy_t~5CS literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100755 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon.webp new file mode 100755 index 0000000000000000000000000000000000000000..f8aca4c6b2e4909de29d4063a599114de2608b48 GIT binary patch literal 1184 zcmV;R1Yi47Nk&GP1ONb6MM6+kP&iDB1ONapkH8}kb&f!Q;D4Kkh)Cj*$=UzUkfdL- zXWM=U8%=hvz_u^96`7fB+qP|m_H|V~w_&AI{q+Bge|2?rMZmFbYkBg2mS53$g1fuB z55b*^%54Nr1#@9h(tGLd^!|T;awh2ZJTQsD*_b$H*4o$Pvh=dFgtsAOX3b;a*{N~0CvVl4vekdW z`;>Dv?x1KE1JANmohvveL7{W`=Qj4nJV!&$Nhzd=h$w*>vlDnR3Pm$Rnsch)q#ei< zwtJ6zJ*>GAP58Qy7YfoAAT$lnuZQbwO=u4CaZ*9bK&p~2abenD7bY|Xi}n?Sq(#b4 zxPAb>l^M{)uZW56orutqN!)oJ==GWuPgAfn+45ULL}{@KPk!c=f^B8RJH^3I7D`D? z6m?JJ!dmbp!T`kXVrkR!SWd6^26Cty$|#!L2z8pv#F}!7CN_OjL8A%UpJ(L7?#}w+ zT9QAPuK{^7(o`mJoF6*zn3IQXX_0#>+4nfR>2rj}u4}f`PNmRWzNwg6bcJqbj;AS+ zyOWbK6C5q1o-68^yLfoCW}&y_Id_JilTv|8#&2X6tJ}#^WQq^D@frnAPL<8IaNdSY z{Ub9AF6zIxFMS+F?kq2l6#}-&?8{X*FlG0wEIOe4+UmTk1kM~Qje@%CR_{)Vm>N#* zT~MPm*+$@AF|sJ&iq*aD5Hrij7$`Z@c2f>U_)vYIx}eS0fR+LqvI?|V{XHO)@R0%i zK1=}P@!^0WAEw`K-V=R51F`-|^bk`|MOS{ftr-efX7yJf3tNZoqe@nau;!D9niAoi zh^Ube4XO9MbaSxN4AfTbvE!bv!{PkW^9p_lb2CQW7+|*~By+7MIFzdLI0YXn;0M6t61_?LwcPBt(Rk z%wB#gWI=1oiw9cJ;eK@>5jnI-=K~HM!c)*e4fHkPKDF`%!XYJsbRJ{TI(M}UfV5GO z&?NiG!xsoiNCYWA;mB*ld?d8cKny^XdXPMK>JcIcnNyKVsc-=k=8#wUb1gaU;h@BjziMlYkV zUMAeoK%p1}fq;cT?K~9MtDm>C^X$au)!#eLZJF@5o$J3RKewOF+^yGOYv&;V3j)Lh zgF;0-!VU9LR8m$_(Ym8UZ;!#QgGt}MuX#sFr9)AMFyf(tLNN*g1}#UZd{+IU$|Wc% zDI+kX^^4f%(7?PI_BJ3EUL+yCd~TKennj79m(M}EhZnKIf$Zcqp;-9@JR^o%5b!>z`ADm_R5 literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon_round.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxhdpi/icon_round.webp new file mode 100755 index 0000000000000000000000000000000000000000..848afae8d9c19ae530d96dda792433444953590a GIT binary patch literal 4132 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 literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon.webp new file mode 100755 index 0000000000000000000000000000000000000000..e95365560831d42d0983990d6153b3acdaf97c02 GIT binary patch literal 1648 zcmV-$29NntNk&F!1^@t8MM6+kP&iCm1^@srzrZgLwT9xhZ6j&_!E?9Yh?oEdx+a57 zD>V$L@|7Mf!M3fn$>u+U52`E0-QC^YQgMZBt`6 zubr5g?LHl~Y4I=}VXEJ0R)6$fE<&Ojavxgp}L1 zj%|A{-F$7^wrw-N%}n@g`~h`4eP6R}E7|$sb=`Xc?(eo4l8}Ww6p?R=xX;9<5GEET z?hCOI5z(=#Ko>=RQHh9{m|RF}5!Jr#z`DEoi*{+B_C|cE-NXNP3z51e7BUgltgmbQ zu0qtC-wu@`1*t+r?KH+{sbnA-7%1<1#+cSFk%CYy(lthVl@oxCfup>p_w^wVsmX+- zc50{5j+Q-E2D11O@9%dZ4GEQyyYE{yjFvrSdhDgKdn2v*l_=xOJO`%uY3tpUiF{U3*#h{1kAe|`Ep!8OcEKaJDT`%%mA!IECQez z>|2}pa?~K~LoE9*DB;WzL$LR-3AjV7!JAqbgTTyD$lV-wv}Y{Lf8|6ejj<2!S4*kG zTtpZ%o^wreo z10hl^ftz-CjDH_=fK~0{W0k-)TRi4FjSyQvM>+{P!kl8X6skMGhT8*r6wt0ToZG_UI*BaMSoiFWrTlgH!N*nV=BxfdWwDmVdql_;U~X zC9T@&udrJ|9e7U>Gy!@F{CMr#(xk&WqM}t#S~N#gbxMQMo$Atbs67XD>hhY@pjvhL zcadj$jB6_fGCZ!!Zj~4D%KM&xLI#w8q(3A74=3G*yx<4i1}Fm22SdIaC!I{*<^vK8 z+yEj1lYh9L=zUUtW(U|xfl)x3OUb|EBtCD2XH3Vn9Rn(P8SAh`UFtrxhmWhv$gu`V z4mA+}SrAf%T>ByUCIU}AEUa7!&0%x5?R=g;z zrXUs?f|ti59fdbsd<8!sPrc`X_h~-#1kSr;2bU!vI0GdC0UMF4(vgGWOHMtB4=|xr zSq5q(^7Fhb6+XiKIQ=|IkW>3X2rC2~7z~6Uc6m1PXO!%_dc*rC(ESQSJ&nj$XyF^Y zgU4{ihuzm5@|R~Lb^rz#2nDg_AR>^sAa`ETjFK5u`)s=4(v6?*`v0W&Y59~t;-8XF z`tJRI!{_rZ@3Cb@^^B5yxIhH#5)=U>K@#W)LKKo_Wv?tj$&9iYR*bvj4VN$YZC@qYn_w6>li5ibrAsE#}-Tg literal 0 HcmV?d00001 diff --git a/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon_round.webp b/PP-tools/password-generator/android/android/app/src/main/res/mipmap-xxxhdpi/icon_round.webp new file mode 100755 index 0000000000000000000000000000000000000000..d2e1e31274d36f1278d01a658bb2df8c29e4ba34 GIT binary patch literal 5914 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 + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/main/res/values/icon_background.xml b/PP-tools/password-generator/android/android/app/src/main/res/values/icon_background.xml new file mode 100755 index 0000000..5e90b05 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/values/icon_background.xml @@ -0,0 +1,4 @@ + + + #F4F4F4 + \ No newline at end of file diff --git a/PP-tools/password-generator/android/android/app/src/main/res/values/styles.xml b/PP-tools/password-generator/android/android/app/src/main/res/values/styles.xml new file mode 100755 index 0000000..cb1ef88 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/PP-tools/password-generator/android/android/app/src/profile/AndroidManifest.xml b/PP-tools/password-generator/android/android/app/src/profile/AndroidManifest.xml new file mode 100755 index 0000000..399f698 --- /dev/null +++ b/PP-tools/password-generator/android/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/PP-tools/password-generator/android/android/build.gradle.kts b/PP-tools/password-generator/android/android/build.gradle.kts new file mode 100755 index 0000000..dbee657 --- /dev/null +++ b/PP-tools/password-generator/android/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/PP-tools/password-generator/android/android/gradle.properties b/PP-tools/password-generator/android/android/gradle.properties new file mode 100755 index 0000000..fbee1d8 --- /dev/null +++ b/PP-tools/password-generator/android/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true diff --git a/PP-tools/password-generator/android/android/gradle/wrapper/gradle-wrapper.properties b/PP-tools/password-generator/android/android/gradle/wrapper/gradle-wrapper.properties new file mode 100755 index 0000000..e4ef43f --- /dev/null +++ b/PP-tools/password-generator/android/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/PP-tools/password-generator/android/android/settings.gradle.kts b/PP-tools/password-generator/android/android/settings.gradle.kts new file mode 100755 index 0000000..733fdd2 --- /dev/null +++ b/PP-tools/password-generator/android/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.10.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false +} + +include(":app") diff --git a/PP-tools/password-generator/android/lib/main.dart b/PP-tools/password-generator/android/lib/main.dart new file mode 100755 index 0000000..3283e5f --- /dev/null +++ b/PP-tools/password-generator/android/lib/main.dart @@ -0,0 +1,284 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + TextEditingController categoryController = TextEditingController(); + TextEditingController changeDataController = TextEditingController(); + ScrollController scrollController = ScrollController(); + String resultStr = ""; + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: Text("密码生成器")), + body: Container( + padding: EdgeInsets.only(left: 10, right: 10), + child: ListView( + scrollDirection: Axis.vertical, + controller: scrollController, + children: [ + DefaultTextStyle( + style: TextStyle(color: Colors.black, fontSize: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "C (communication)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text("社交类: 该类软件包含以文本,语音,图片,音视频等方式进行社交,典型如微信,qq,电子邮箱 "), + SizedBox(height: 20), + Text( + "T (technology)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text( + "科技/技术类: 该类软件包含以提供计算机技术等其他工程类技术支持/论坛为主的服务,典型如csdn,华为 ", + ), + SizedBox(height: 20), + Text( + "S (shopping)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text("购物/外卖类: 该类软件包含各种以线上购买实体商品为主的服务,典型如淘宝,京东 "), + SizedBox(height: 20), + Text( + "EDU (education)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text("教育/学习类: 该类软件专注于提供教育,学术,辅导等的支持/资料,典型如扇贝英语,作业帮 "), + SizedBox(height: 20), + Text( + "E (entertainment)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text("游戏/娱乐类: 该类软件专注于以提供电子游戏,休闲娱乐为主的服务,典型如王者荣耀,抖音 "), + SizedBox(height: 20), + Text( + "O (other)", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25, + color: Colors.green, + ), + ), + Text("其他: 当一个服务不属于以上任何类别,那么归属于此类,典型如processon,工商银行 "), + ], + ), + SizedBox(height: 20), + + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(flex: 2, child: Text("Category:")), + Expanded( + flex: 3, + child: SizedBox( + width: 200, + height: 50, + child: TextField(controller: categoryController), + ), + ), + ], + ), + SizedBox(height: 20), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(flex: 2, child: Text("Change date: ")), + Expanded( + flex: 3, + child: SizedBox( + width: 200, + height: 50, + child: TextField(controller: changeDataController), + ), + ), + ], + ), + SizedBox(height: 20), + Center( + child: GestureDetector( + onTap: () { + setState(() { + resultStr = genPasswd(); + }); + WidgetsBinding.instance.addPostFrameCallback((val) { + scrollController.jumpTo( + scrollController.position.maxScrollExtent, + ); + }); + }, + child: Container( + width: MediaQuery.of(context).size.width / 2, + height: 50, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFF8447D5), + borderRadius: BorderRadiusGeometry.circular(20), + ), + child: Text( + "generate password", + style: TextStyle(fontSize: 18, color: Colors.white), + ), + ), + ), + ), + + resultStr.isEmpty + ? SizedBox() + : Center( + child: Builder( + builder: (BuildContext context) { + return GestureDetector( + onLongPress: () { + Clipboard.setData( + ClipboardData(text: resultStr), + ).then((val) { + double offsetTop = + MediaQuery.of(context).size.height - + 200; + ScaffoldMessenger.of( + context, + ).showSnackBar( + SnackBar( + backgroundColor: Color(0xE4616161), + behavior: SnackBarBehavior.floating, + margin: EdgeInsets.only( + bottom: offsetTop, + left: 100, + right: 100 + ), + content: Center( + child: Text("saved to clipboard"), + ), + ), + ); + }); + }, + child: Container( + margin: EdgeInsets.only(top: 10), + child: Text( + resultStr, + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.w900, + letterSpacing: 2, + ), + ), + ), + ); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + String genRandomString(int length) { + String re = ""; + Random random = Random(); + + for (int i = 0; i < length; i++) { + int de = random.nextInt(2) + 1; + + switch (de) { + case 1: + int lowerCase = random.nextInt(122 - 97 + 1) + 97; + re += String.fromCharCode(lowerCase); + break; + case 2: + int upperCase = random.nextInt(90 - 65 + 1) + 65; + re += String.fromCharCode(upperCase); + break; + default: + print("Unexpected value: $de"); + break; + } + } + return re; + } + + String genLowerLetter(int length) { + String re = ""; + Random random = Random(); + + for (int i = 0; i < length; i++) { + int lowerCase = random.nextInt(122 - 97 + 1) + 97; + re += String.fromCharCode(lowerCase); + } + return re; + } + + String genPasswd() { + String categoryText = categoryController.text; + String dateText = changeDataController.text; + if (categoryText.isEmpty || dateText.isEmpty) { + return "Please done the form"; + } + + // verify if the field valid + // ================== START ================== + const categoryList = ["C", "T", "S", "EDU", "E", "O"]; + if (!categoryList.contains(categoryText)) { + return "Category: input not valid"; + } + + if (dateText.length != 4) { + return "Date: the length must be 4"; + } + var dateList = dateText.split(''); + for (var i = 0; i < dateList.length; i++) { + if (!(dateList[i].codeUnitAt(0) >= 48 && + dateList[i].codeUnitAt(0) <= 57)) { + return "Date: all digit must be a number"; + } + } + // ================== END ================== + + return "${categoryText}${dateText}${genLowerLetter(2)}_${genRandomString(8)}"; + } +} diff --git a/PP-tools/password-generator/android/pubspec.lock b/PP-tools/password-generator/android/pubspec.lock new file mode 100755 index 0000000..3decd54 --- /dev/null +++ b/PP-tools/password-generator/android/pubspec.lock @@ -0,0 +1,213 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" + source: hosted + version: "0.7.7" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" +sdks: + dart: ">=3.10.4 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/PP-tools/password-generator/android/pubspec.yaml b/PP-tools/password-generator/android/pubspec.yaml new file mode 100755 index 0000000..c1acd32 --- /dev/null +++ b/PP-tools/password-generator/android/pubspec.yaml @@ -0,0 +1,89 @@ +name: password_generator +description: "password generator" +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.1.0 + +environment: + sdk: ^3.10.4 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/PP-tools/password-generator/android/test/widget_test.dart b/PP-tools/password-generator/android/test/widget_test.dart new file mode 100755 index 0000000..c9efdaf --- /dev/null +++ b/PP-tools/password-generator/android/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:password_generator/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}