From 13376118c3dd888b3b429b1976bef0fcce7f625d Mon Sep 17 00:00:00 2001 From: Bartosz Date: Thu, 28 Nov 2024 20:57:58 +0000 Subject: [PATCH] add of sim changes --- dialer/android/build.gradle | 1 + dialer/android/gradle.properties | 2 +- .../settings/key/delete_key_pair.dart | 22 +- .../settings/key/export_private_key.dart | 26 +- .../settings/key/generate_new_key_pair.dart | 14 +- .../settings/key/manage_keys_page.dart | 40 +- .../settings/key/show_public_key_qr.dart | 8 +- .../settings/key/show_public_key_text.dart | 10 +- dialer/lib/features/settings/settings.dart | 8 +- .../lib/features/settings/sim/choose_sim.dart | 46 +- .../settings/sim/settings_accounts.dart | 12 +- .../features/settings/sim/sim_parameters.dart | 54 +- dialer/packages/mobile_number/CHANGELOG.md | 59 ++ dialer/packages/mobile_number/LICENSE | 13 + dialer/packages/mobile_number/README.md | 66 +++ .../mobile_number/android/build.gradle | 41 ++ .../mobile_number/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/res/values/strings_en.arb | 1 + .../mobile_number/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 10 + .../mobile_number/CountryToPhonePrefix.java | 262 +++++++++ .../mobile_number/MobileNumberPlugin.java | 248 +++++++++ .../com/amorenew/mobile_number/SimCard.java | 73 +++ .../packages/mobile_number/example/README.md | 16 + .../example/android/app/build.gradle | 58 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 58 ++ .../EmbeddingV1Activity.java | 14 + .../mobile_number_example/MainActivity.java | 15 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/res/values/strings_en.arb | 1 + .../example/android/settings.gradle | 15 + .../example/android/settings_aar.gradle | 1 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../mobile_number/example/ios/Podfile | 84 +++ .../ios/Runner.xcodeproj/project.pbxproj | 506 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + .../example/ios/Runner/AppDelegate.h | 6 + .../example/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 45 ++ .../mobile_number/example/ios/Runner/main.m | 9 + .../mobile_number/example/lib/main.dart | 78 +++ .../mobile_number/example/pubspec.yaml | 64 +++ .../example/test/widget_test.dart | 27 + .../ios/Classes/MobileNumberPlugin.h | 4 + .../ios/Classes/MobileNumberPlugin.m | 20 + .../mobile_number/ios/mobile_number.podspec | 21 + .../mobile_number/lib/mobile_number.dart | 65 +++ .../packages/mobile_number/lib/sim_card.dart | 43 ++ .../mobile_number/lib/widget_lifecycle.dart | 30 ++ .../packages/mobile_number/local.properties | 9 + dialer/packages/mobile_number/pubspec.yaml | 23 + .../mobile_number/res/values/strings_en.arb | 0 dialer/packages/mobile_number/sample1.png | Bin 0 -> 71924 bytes .../test/mobile_number_test.dart | 21 + dialer/pubspec.yaml | 3 +- 94 files changed, 2584 insertions(+), 123 deletions(-) create mode 100644 dialer/packages/mobile_number/CHANGELOG.md create mode 100644 dialer/packages/mobile_number/LICENSE create mode 100644 dialer/packages/mobile_number/README.md create mode 100644 dialer/packages/mobile_number/android/build.gradle create mode 100644 dialer/packages/mobile_number/android/gradle.properties create mode 100644 dialer/packages/mobile_number/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 dialer/packages/mobile_number/android/res/values/strings_en.arb create mode 100644 dialer/packages/mobile_number/android/settings.gradle create mode 100644 dialer/packages/mobile_number/android/src/main/AndroidManifest.xml create mode 100644 dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/CountryToPhonePrefix.java create mode 100644 dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/MobileNumberPlugin.java create mode 100644 dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/SimCard.java create mode 100644 dialer/packages/mobile_number/example/README.md create mode 100644 dialer/packages/mobile_number/example/android/app/build.gradle create mode 100644 dialer/packages/mobile_number/example/android/app/src/debug/AndroidManifest.xml create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/AndroidManifest.xml create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/EmbeddingV1Activity.java create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/MainActivity.java create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 dialer/packages/mobile_number/example/android/app/src/main/res/values/styles.xml create mode 100644 dialer/packages/mobile_number/example/android/app/src/profile/AndroidManifest.xml create mode 100644 dialer/packages/mobile_number/example/android/build.gradle create mode 100644 dialer/packages/mobile_number/example/android/gradle.properties create mode 100644 dialer/packages/mobile_number/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 dialer/packages/mobile_number/example/android/res/values/strings_en.arb create mode 100644 dialer/packages/mobile_number/example/android/settings.gradle create mode 100644 dialer/packages/mobile_number/example/android/settings_aar.gradle create mode 100644 dialer/packages/mobile_number/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 dialer/packages/mobile_number/example/ios/Flutter/Debug.xcconfig create mode 100644 dialer/packages/mobile_number/example/ios/Flutter/Release.xcconfig create mode 100644 dialer/packages/mobile_number/example/ios/Podfile create mode 100644 dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 dialer/packages/mobile_number/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 dialer/packages/mobile_number/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 dialer/packages/mobile_number/example/ios/Runner/AppDelegate.h create mode 100644 dialer/packages/mobile_number/example/ios/Runner/AppDelegate.m create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 dialer/packages/mobile_number/example/ios/Runner/Info.plist create mode 100644 dialer/packages/mobile_number/example/ios/Runner/main.m create mode 100644 dialer/packages/mobile_number/example/lib/main.dart create mode 100644 dialer/packages/mobile_number/example/pubspec.yaml create mode 100644 dialer/packages/mobile_number/example/test/widget_test.dart create mode 100644 dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.h create mode 100644 dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.m create mode 100644 dialer/packages/mobile_number/ios/mobile_number.podspec create mode 100644 dialer/packages/mobile_number/lib/mobile_number.dart create mode 100644 dialer/packages/mobile_number/lib/sim_card.dart create mode 100644 dialer/packages/mobile_number/lib/widget_lifecycle.dart create mode 100644 dialer/packages/mobile_number/local.properties create mode 100644 dialer/packages/mobile_number/pubspec.yaml create mode 100644 dialer/packages/mobile_number/res/values/strings_en.arb create mode 100644 dialer/packages/mobile_number/sample1.png create mode 100644 dialer/packages/mobile_number/test/mobile_number_test.dart diff --git a/dialer/android/build.gradle b/dialer/android/build.gradle index d2ffbff..457de89 100644 --- a/dialer/android/build.gradle +++ b/dialer/android/build.gradle @@ -16,3 +16,4 @@ subprojects { tasks.register("clean", Delete) { delete rootProject.buildDir } + diff --git a/dialer/android/gradle.properties b/dialer/android/gradle.properties index 157afb8..2a32243 100644 --- a/dialer/android/gradle.properties +++ b/dialer/android/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true -org.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 \ No newline at end of file +org.gradle.java.home=/usr/lib/jvm/java-17-openjdk-17.0.13.0.11-3.fc41.x86_64 diff --git a/dialer/lib/features/settings/key/delete_key_pair.dart b/dialer/lib/features/settings/key/delete_key_pair.dart index b38276f..8d21198 100644 --- a/dialer/lib/features/settings/key/delete_key_pair.dart +++ b/dialer/lib/features/settings/key/delete_key_pair.dart @@ -1,18 +1,16 @@ -// delete_key_pair.dart - import 'package:flutter/material.dart'; -class SuppressionPaireClesPage extends StatelessWidget { - const SuppressionPaireClesPage({super.key}); +class DeleteKeyPairPage extends StatelessWidget { + const DeleteKeyPairPage({super.key}); void _deleteKeyPair(BuildContext context) { - // key deletion logic (not implemented here) + // Key deletion logic (not implemented here) // ... // Show confirmation message ScaffoldMessenger.of(context).showSnackBar( const SnackBar( - content: Text('La paire de clés a été supprimée.'), + content: Text('The key pair has been deleted.'), ), ); @@ -25,18 +23,18 @@ class SuppressionPaireClesPage extends StatelessWidget { context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Confirmer la Suppression'), + title: const Text('Confirm Deletion'), content: const Text( - 'Êtes-vous sûr de vouloir supprimer la paire de clés ? Cette action est irréversible.'), + 'Are you sure you want to delete the key pair? This action is irreversible.'), actions: [ TextButton( - child: const Text('Annuler'), + child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( - child: const Text('Supprimer'), + child: const Text('Delete'), onPressed: () { Navigator.of(context).pop(); _deleteKeyPair(context); @@ -53,14 +51,14 @@ class SuppressionPaireClesPage extends StatelessWidget { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Suppression d\'une Paire de Clés'), + title: const Text('Delete a Key Pair'), ), body: Center( child: ElevatedButton( onPressed: () { _showConfirmationDialog(context); }, - child: const Text('Supprimer la Paire de Clés'), + child: const Text('Delete Key Pair'), ), ), ); diff --git a/dialer/lib/features/settings/key/export_private_key.dart b/dialer/lib/features/settings/key/export_private_key.dart index 1878a2b..694d757 100644 --- a/dialer/lib/features/settings/key/export_private_key.dart +++ b/dialer/lib/features/settings/key/export_private_key.dart @@ -1,24 +1,22 @@ -// export_private_key.dart - import 'package:flutter/material.dart'; import 'dart:typed_data'; import 'dart:convert'; import 'package:pointycastle/export.dart' as crypto; import 'package:file_picker/file_picker.dart'; -class ExportationClePriveePage extends StatefulWidget { - const ExportationClePriveePage({super.key}); +class ExportPrivateKeyPage extends StatefulWidget { + const ExportPrivateKeyPage({super.key}); @override - _ExportationClePriveePageState createState() => _ExportationClePriveePageState(); + _ExportPrivateKeyPageState createState() => _ExportPrivateKeyPageState(); } -class _ExportationClePriveePageState extends State { +class _ExportPrivateKeyPageState extends State { final TextEditingController _passwordController = TextEditingController(); Future _exportPrivateKey() async { // Replace with your actual private key retrieval logic - final String privateKeyPem = 'Votre clé privée ici'; + final String privateKeyPem = 'Your private key here'; // Get the password from the user input final password = _passwordController.text; @@ -32,7 +30,7 @@ class _ExportationClePriveePageState extends State { // Let the user pick a file location final outputFile = await FilePicker.platform.saveFile( - dialogTitle: 'Enregistrer la clé privée chiffrée', + dialogTitle: 'Save encrypted private key', fileName: 'private_key_encrypted.aes', ); @@ -44,8 +42,8 @@ class _ExportationClePriveePageState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('Clé Exportée'), - content: const Text('La clé privée chiffrée a été exportée avec succès.'), + title: const Text('Key Exported'), + content: const Text('The encrypted private key has been exported successfully.'), actions: [ TextButton( onPressed: () => Navigator.pop(context), @@ -80,14 +78,14 @@ class _ExportationClePriveePageState extends State { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Exportation de la Clé Privée'), + title: const Text('Export Private Key'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ const Text( - 'Entrez un mot de passe pour chiffrer la clé privée:', + 'Enter a password to encrypt the private key:', style: TextStyle(color: Colors.white), ), TextField( @@ -95,14 +93,14 @@ class _ExportationClePriveePageState extends State { obscureText: true, style: const TextStyle(color: Colors.white), decoration: const InputDecoration( - hintText: 'Mot de passe', + hintText: 'Password', hintStyle: TextStyle(color: Colors.grey), ), ), const SizedBox(height: 20), ElevatedButton( onPressed: _exportPrivateKey, - child: const Text('Exporter la Clé Privée Chiffrée'), + child: const Text('Export Encrypted Private Key'), ), ], ), diff --git a/dialer/lib/features/settings/key/generate_new_key_pair.dart b/dialer/lib/features/settings/key/generate_new_key_pair.dart index 0f8e08d..9254e45 100644 --- a/dialer/lib/features/settings/key/generate_new_key_pair.dart +++ b/dialer/lib/features/settings/key/generate_new_key_pair.dart @@ -5,11 +5,11 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:asn1lib/asn1lib.dart'; -class GenerationNouvellePaireClesPage extends StatelessWidget { - const GenerationNouvellePaireClesPage({super.key}); +class GenerateNewKeyPairPage extends StatelessWidget { + const GenerateNewKeyPairPage({super.key}); Future> _generateKeyPair() async { - // key generation logic using pointycastle + // Key generation logic using pointycastle final keyParams = crypto.RSAKeyGeneratorParameters( BigInt.parse('65537'), 2048, @@ -94,7 +94,7 @@ class GenerationNouvellePaireClesPage extends StatelessWidget { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Génération d\'une Nouvelle Paire de Clés'), + title: const Text('Generate a New Key Pair'), ), body: Center( child: ElevatedButton( @@ -104,8 +104,8 @@ class GenerationNouvellePaireClesPage extends StatelessWidget { showDialog( context: context, builder: (context) => AlertDialog( - title: const Text('Clés Générées'), - content: const Text('La nouvelle paire de clés a été générée avec succès.'), + title: const Text('Keys Generated'), + content: const Text('The new key pair has been generated successfully.'), actions: [ TextButton( onPressed: () => Navigator.pop(context), @@ -115,7 +115,7 @@ class GenerationNouvellePaireClesPage extends StatelessWidget { ), ); }, - child: const Text('Générer une Nouvelle Paire de Clés'), + child: const Text('Generate a New Key Pair'), ), ), ); diff --git a/dialer/lib/features/settings/key/manage_keys_page.dart b/dialer/lib/features/settings/key/manage_keys_page.dart index 65db77d..a3b7ad1 100644 --- a/dialer/lib/features/settings/key/manage_keys_page.dart +++ b/dialer/lib/features/settings/key/manage_keys_page.dart @@ -1,45 +1,43 @@ -// manage_keys_page.dart - import 'package:flutter/material.dart'; -import 'package:dialer/features/settings/key/show_public_key_text.dart'; import 'package:dialer/features/settings/key/show_public_key_qr.dart'; +import 'package:dialer/features/settings/key/show_public_key_text.dart'; import 'package:dialer/features/settings/key/generate_new_key_pair.dart'; import 'package:dialer/features/settings/key/export_private_key.dart'; import 'package:dialer/features/settings/key/delete_key_pair.dart'; -class GestionDeClesPage extends StatelessWidget { - const GestionDeClesPage({super.key}); +class KeyManagementPage extends StatelessWidget { + const KeyManagementPage({super.key}); void _navigateToOption(BuildContext context, String option) { switch (option) { - case 'Affichage de la clé publique en texte': + case 'Display public key as text': Navigator.push( context, - MaterialPageRoute(builder: (context) => const AffichageClePubliqueTextePage()), + MaterialPageRoute(builder: (context) => const DisplayPublicKeyTextPage()), ); break; - case 'Affichage de la clé publique en QR code': + case 'Display public key as QR code': Navigator.push( context, - MaterialPageRoute(builder: (context) => const AffichageClePubliqueQRCodePage()), + MaterialPageRoute(builder: (context) => const DisplayPublicKeyQRCodePage()), ); break; - case 'Génération d\'une nouvelle paire de clés': + case 'Generate a new key pair': Navigator.push( context, - MaterialPageRoute(builder: (context) => const GenerationNouvellePaireClesPage()), + MaterialPageRoute(builder: (context) => const GenerateNewKeyPairPage()), ); break; - case 'Exportation de la clé privée en fichier chiffré par mot de passe (AES 256)': + case 'Export private key to password-encrypted file (AES 256)': Navigator.push( context, - MaterialPageRoute(builder: (context) => const ExportationClePriveePage()), + MaterialPageRoute(builder: (context) => const ExportPrivateKeyPage()), ); break; - case 'Suppression d\'une paire de clés, POPUP d\'avertissement': + case 'Delete a key pair, warning POPUP': Navigator.push( context, - MaterialPageRoute(builder: (context) => const SuppressionPaireClesPage()), + MaterialPageRoute(builder: (context) => const DeleteKeyPairPage()), ); break; default: @@ -51,17 +49,17 @@ class GestionDeClesPage extends StatelessWidget { @override Widget build(BuildContext context) { final keyManagementOptions = [ - 'Affichage de la clé publique en texte', - 'Affichage de la clé publique en QR code', - 'Génération d\'une nouvelle paire de clés', - 'Exportation de la clé privée en fichier chiffré par mot de passe (AES 256)', - 'Suppression d\'une paire de clés, POPUP d\'avertissement', + 'Display public key as text', + 'Display public key as QR code', + 'Generate a new key pair', + 'Export private key to password-encrypted file (AES 256)', + 'Delete a key pair, warning POPUP', ]; return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Gestion de clés'), + title: const Text('Key Management'), ), body: ListView.builder( itemCount: keyManagementOptions.length, diff --git a/dialer/lib/features/settings/key/show_public_key_qr.dart b/dialer/lib/features/settings/key/show_public_key_qr.dart index bfc9853..ca00fbb 100644 --- a/dialer/lib/features/settings/key/show_public_key_qr.dart +++ b/dialer/lib/features/settings/key/show_public_key_qr.dart @@ -1,18 +1,18 @@ import 'package:flutter/material.dart'; import 'package:pretty_qr_code/pretty_qr_code.dart'; -class AffichageClePubliqueQRCodePage extends StatelessWidget { - const AffichageClePubliqueQRCodePage({super.key}); +class DisplayPublicKeyQRCodePage extends StatelessWidget { + const DisplayPublicKeyQRCodePage({super.key}); @override Widget build(BuildContext context) { // Replace with your actual public key retrieval logic - final String publicKey = 'Votre clé publique ici'; + final String publicKey = 'Your public key here'; return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Clé Publique en QR Code'), + title: const Text('Public Key in QR Code'), ), body: Center( child: PrettyQr( diff --git a/dialer/lib/features/settings/key/show_public_key_text.dart b/dialer/lib/features/settings/key/show_public_key_text.dart index ab69e49..8b99d16 100644 --- a/dialer/lib/features/settings/key/show_public_key_text.dart +++ b/dialer/lib/features/settings/key/show_public_key_text.dart @@ -1,19 +1,17 @@ -// show_public_key_text.dart - import 'package:flutter/material.dart'; -class AffichageClePubliqueTextePage extends StatelessWidget { - const AffichageClePubliqueTextePage({super.key}); +class DisplayPublicKeyTextPage extends StatelessWidget { + const DisplayPublicKeyTextPage({super.key}); @override Widget build(BuildContext context) { // Replace with your actual public key retrieval logic - final String publicKey = 'Votre clé publique ici'; + final String publicKey = 'Your public key here'; return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Clé Publique en Texte'), + title: const Text('Public Key as Text'), ), body: Center( child: Padding( diff --git a/dialer/lib/features/settings/settings.dart b/dialer/lib/features/settings/settings.dart index bdc22f3..be94b8c 100644 --- a/dialer/lib/features/settings/settings.dart +++ b/dialer/lib/features/settings/settings.dart @@ -16,7 +16,7 @@ class SettingsPage extends StatelessWidget { MaterialPageRoute(builder: (context) => const SettingsCallPage()), ); break; - case 'Page des comptes téléphoniques': + case 'Page of telephone accounts': Navigator.push( context, MaterialPageRoute(builder: (context) => const SettingsAccountsPage()), @@ -25,7 +25,7 @@ class SettingsPage extends StatelessWidget { case 'Gestion de clés': Navigator.push( context, - MaterialPageRoute(builder: (context) => const GestionDeClesPage()), + MaterialPageRoute(builder: (context) => const KeyManagementPage()), ); break; // Add more cases for other settings pages @@ -39,8 +39,8 @@ class SettingsPage extends StatelessWidget { Widget build(BuildContext context) { final settingsOptions = [ 'Calling settings', - 'Page des comptes téléphoniques', - 'Gestion de clés', // Add the new option here + 'Page of telephone accounts', + 'Key management', ]; return Scaffold( diff --git a/dialer/lib/features/settings/sim/choose_sim.dart b/dialer/lib/features/settings/sim/choose_sim.dart index 5bd5f7a..75cbb34 100644 --- a/dialer/lib/features/settings/sim/choose_sim.dart +++ b/dialer/lib/features/settings/sim/choose_sim.dart @@ -1,11 +1,8 @@ -// choose_sim.dart - import 'package:flutter/material.dart'; -import 'package:sim_data/sim_data.dart'; -import 'package:permission_handler/permission_handler.dart'; +import 'package:mobile_number/mobile_number.dart'; class ChooseSimPage extends StatefulWidget { - const ChooseSimPage({super.key}); + const ChooseSimPage({Key? key}) : super(key: key); @override _ChooseSimPageState createState() => _ChooseSimPageState(); @@ -22,20 +19,27 @@ class _ChooseSimPageState extends State { } Future _fetchSimCards() async { - if (await Permission.phone.request().isGranted) { - try { - final simData = await SimDataPlugin.getSimData(); - setState(() { - _simCards = simData.cards; - _selectedSimIndex = 0; - }); - } catch (e) { - // Handle error - print('Error fetching SIM data: $e'); + try { + bool permissionsGranted = await MobileNumber.hasPhonePermission; + if (!permissionsGranted) { + await MobileNumber.requestPhonePermission; + permissionsGranted = await MobileNumber.hasPhonePermission; } - } else { - // Permission denied - print('Phone permission denied'); + if (permissionsGranted) { + List? simCards = await MobileNumber.getSimCards; + if (simCards != null && mounted) { + setState(() { + _simCards = simCards; + _selectedSimIndex = 0; + }); + } else { + print('No SIM cards found'); + } + } else { + print('Phone permission denied'); + } + } catch (e) { + print('Failed to get SIM cards: $e'); } } @@ -52,12 +56,12 @@ class _ChooseSimPageState extends State { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Choisir la SIM'), + title: const Text('Choose SIM'), ), body: _simCards.isEmpty ? const Center( child: Text( - 'Aucune carte SIM trouvée', + 'No SIM cards found', style: TextStyle(color: Colors.white), ), ) @@ -71,7 +75,7 @@ class _ChooseSimPageState extends State { style: const TextStyle(color: Colors.white), ), subtitle: Text( - 'Opérateur: ${sim.carrierName}', + 'Operator: ${sim.carrierName ?? 'N/A'}', style: const TextStyle(color: Colors.grey), ), trailing: Radio( diff --git a/dialer/lib/features/settings/sim/settings_accounts.dart b/dialer/lib/features/settings/sim/settings_accounts.dart index 1ababb4..b8893ab 100644 --- a/dialer/lib/features/settings/sim/settings_accounts.dart +++ b/dialer/lib/features/settings/sim/settings_accounts.dart @@ -1,11 +1,9 @@ -// settings_accounts.dart - import 'package:flutter/material.dart'; -import 'package:dialer/features/settings/sim/choose_sim.dart'; -import 'package:dialer/features/settings/sim/sim_parameters.dart'; +import 'choose_sim.dart'; +import 'sim_parameters.dart'; class SettingsAccountsPage extends StatelessWidget { - const SettingsAccountsPage({super.key}); + const SettingsAccountsPage({Key? key}) : super(key: key); void _navigateToAccountOption(BuildContext context, String option) { switch (option) { @@ -21,7 +19,6 @@ class SettingsAccountsPage extends StatelessWidget { MaterialPageRoute(builder: (context) => const SimParametersPage()), ); break; - // Handle more options if needed default: break; } @@ -47,7 +44,8 @@ class SettingsAccountsPage extends StatelessWidget { accountOptions[index], style: const TextStyle(color: Colors.white), ), - trailing: const Icon(Icons.arrow_forward_ios, color: Colors.white), + trailing: + const Icon(Icons.arrow_forward_ios, color: Colors.white), onTap: () { _navigateToAccountOption(context, accountOptions[index]); }, diff --git a/dialer/lib/features/settings/sim/sim_parameters.dart b/dialer/lib/features/settings/sim/sim_parameters.dart index ff83299..abca65e 100644 --- a/dialer/lib/features/settings/sim/sim_parameters.dart +++ b/dialer/lib/features/settings/sim/sim_parameters.dart @@ -1,11 +1,8 @@ -// sim_parameters.dart - import 'package:flutter/material.dart'; -import 'package:sim_data/sim_data.dart'; -import 'package:permission_handler/permission_handler.dart'; +import 'package:mobile_number/mobile_number.dart'; class SimParametersPage extends StatefulWidget { - const SimParametersPage({super.key}); + const SimParametersPage({Key? key}) : super(key: key); @override _SimParametersPageState createState() => _SimParametersPageState(); @@ -21,19 +18,27 @@ class _SimParametersPageState extends State { } Future _fetchSimParameters() async { - if (await Permission.phone.request().isGranted) { - try { - final simData = await SimDataPlugin.getSimData(); - setState(() { - _simCards = simData.cards; - }); - } catch (e) { - // Handle error - print('Error fetching SIM data: $e'); + try { + bool permissionsGranted = await MobileNumber.hasPhonePermission; + if (!permissionsGranted) { + await MobileNumber.requestPhonePermission; + // Check again if permission is granted + permissionsGranted = await MobileNumber.hasPhonePermission; } - } else { - // Permission denied - print('Phone permission denied'); + if (permissionsGranted) { + List? simCards = await MobileNumber.getSimCards; + if (simCards != null && mounted) { + setState(() { + _simCards = simCards; + }); + } else { + print('No SIM cards found'); + } + } else { + print('Phone permission denied'); + } + } catch (e) { + print('Failed to get SIM cards: $e'); } } @@ -47,13 +52,12 @@ class _SimParametersPageState extends State { ), subtitle: Text( ''' -Opérateur: ${sim.carrierName} -Pays: ${sim.countryCode ?? 'N/A'} -MCC: ${sim.mcc ?? 'N/A'} -MNC: ${sim.mnc ?? 'N/A'} -Slot Index: ${sim.slotIndex ?? 'N/A'} +Carrier Name: ${sim.carrierName ?? 'N/A'} +Country Iso: ${sim.countryIso ?? 'N/A'} Display Name: ${sim.displayName ?? 'N/A'} - ''', +Slot Index: ${sim.slotIndex ?? 'N/A'} +Number: ${sim.number ?? 'N/A'} +''', style: const TextStyle(color: Colors.grey), ), ), @@ -65,12 +69,12 @@ Display Name: ${sim.displayName ?? 'N/A'} return Scaffold( backgroundColor: Colors.black, appBar: AppBar( - title: const Text('Paramètre SIM'), + title: const Text('SIM Parameters'), ), body: _simCards.isEmpty ? const Center( child: Text( - 'Aucune carte SIM trouvée', + 'No SIM cards found', style: TextStyle(color: Colors.white), ), ) diff --git a/dialer/packages/mobile_number/CHANGELOG.md b/dialer/packages/mobile_number/CHANGELOG.md new file mode 100644 index 0000000..df92003 --- /dev/null +++ b/dialer/packages/mobile_number/CHANGELOG.md @@ -0,0 +1,59 @@ +## 2.1.1 + +* Fix Android building + +## 2.1.0 + +* Make min sdk to Flutter 3.0.0 + +## 2.0.0 + +* Remove null check operator from method ListenPhone + +## 1.0.4 + +* Null safety support + +## 1.0.3 + +* Fix crash because of null value on empty number + +## 1.0.2 + +* Support old Flutter plugin V1 + +## 1.0.1 + +* Fix crash related to Android 10 + +## 1.0.0 + +* Addded has phone permission +* Added request phone permission +* Added phone permission listener +* Fix bugs + +## 0.0.6 + +* Add sample image. + +## 0.0.5 + +* Add support for dual sim card. + +## 0.0.4 + +* Print exception message on debugging console. + +## 0.0.3 + +* Migrate to AndroidX + +## 0.0.2 + +* Add gt mobile number native code to Android + + +## 0.0.1 + +* Initial Release. diff --git a/dialer/packages/mobile_number/LICENSE b/dialer/packages/mobile_number/LICENSE new file mode 100644 index 0000000..a4e6d51 --- /dev/null +++ b/dialer/packages/mobile_number/LICENSE @@ -0,0 +1,13 @@ + Copyright 2023 Amr Eniou + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/dialer/packages/mobile_number/README.md b/dialer/packages/mobile_number/README.md new file mode 100644 index 0000000..84e0f97 --- /dev/null +++ b/dialer/packages/mobile_number/README.md @@ -0,0 +1,66 @@ +# mobile_number + +This is a FLutter Plugin to get the device mobile number. +#### Note: It works for Android only because getting mobile number of sim card is not supported in iOS. +#### Note: If the mobile number is not pre-exist on sim card it will not return te phone number. + +## Installation +#### Link on Flutter plugins +https://pub.dev/packages/mobile_number + +#### Note: +if you still using depecated FlutterActivty on MainActivity.java +which is import of +- `import io.flutter.app.FlutterActivity;` + +not +- `import io.flutter.embedding.android.FlutterActivity;` + +then you need to add the following to your MainActivity.java +``` +@Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MobileNumberPlugin.registerWith(registrarFor("com.amorenew.mobile_number.MobileNumberPlugin()")); + } + ``` + +## Usage + +#### Check Phone Permission + +```await MobileNumber.hasPhonePermission``` + +#### Request Phone Permission + +```await MobileNumber.requestPhonePermission``` + +#### Listen to widget resume after Phone Permission request + +```MobileNumber.listenPhonePermission((isPermissionGranted) { + if (isPermissionGranted) { + //Get mobile number + } else { + //Request Phone Permission + } + }); + ``` + +#### Get first sim card number + +```Future getMobileNumber() async { + final String mobileNumber = await MobileNumber.mobileNumber; + return mobileNumber; + } + ``` + +#### Get List of sim cards for dual sim cards + +```Future> geSimCards() async { + final List simCards = await MobileNumber.getSimCards; + return simCards; + } + ``` + + +![alt text](https://raw.githubusercontent.com/amorenew/Flutter-Mobile-Number-Plugin/master/sample1.png) diff --git a/dialer/packages/mobile_number/android/build.gradle b/dialer/packages/mobile_number/android/build.gradle new file mode 100644 index 0000000..a4fd297 --- /dev/null +++ b/dialer/packages/mobile_number/android/build.gradle @@ -0,0 +1,41 @@ +group 'com.amorenew.mobile_number' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.2.2' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 33 + namespace "com.amorenew.mobile_number" + + defaultConfig { + targetSdkVersion 33 + minSdkVersion 21 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} + +dependencies { + implementation 'androidx.core:core:1.9.0' + // Other dependencies... +} diff --git a/dialer/packages/mobile_number/android/gradle.properties b/dialer/packages/mobile_number/android/gradle.properties new file mode 100644 index 0000000..9209e5d --- /dev/null +++ b/dialer/packages/mobile_number/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true \ No newline at end of file diff --git a/dialer/packages/mobile_number/android/gradle/wrapper/gradle-wrapper.properties b/dialer/packages/mobile_number/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..84d1f85 --- /dev/null +++ b/dialer/packages/mobile_number/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/dialer/packages/mobile_number/android/res/values/strings_en.arb b/dialer/packages/mobile_number/android/res/values/strings_en.arb new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/dialer/packages/mobile_number/android/res/values/strings_en.arb @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/dialer/packages/mobile_number/android/settings.gradle b/dialer/packages/mobile_number/android/settings.gradle new file mode 100644 index 0000000..70dd11c --- /dev/null +++ b/dialer/packages/mobile_number/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'mobile_number' diff --git a/dialer/packages/mobile_number/android/src/main/AndroidManifest.xml b/dialer/packages/mobile_number/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..104e2ce --- /dev/null +++ b/dialer/packages/mobile_number/android/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/CountryToPhonePrefix.java b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/CountryToPhonePrefix.java new file mode 100644 index 0000000..ef1deae --- /dev/null +++ b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/CountryToPhonePrefix.java @@ -0,0 +1,262 @@ +package com.amorenew.mobile_number; + +import java.util.HashMap; +import java.util.Map; + +class CountryToPhonePrefix { + + private static Map map = new HashMap<>(); + + static String prefixFor(String iso2CountryCode) { + String result = map.get(iso2CountryCode.toUpperCase()); + if (result == null) { + return ""; + } + return result; + } + + static { + map.put("AC", "247"); + map.put("AD", "376"); + map.put("AE", "971"); + map.put("AF", "93"); + map.put("AG", "1268"); + map.put("AI", "1264"); + map.put("AL", "355"); + map.put("AM", "374"); + map.put("AN", "599"); + map.put("AO", "244"); + map.put("AR", "54"); + map.put("AS", "1684"); + map.put("AT", "43"); + map.put("AU", "61"); + map.put("AW", "297"); + map.put("AX", "35818"); +// map.put("AZ", "37497"); + map.put("AZ", "994"); + map.put("BA", "387"); + map.put("BB", "1246"); + map.put("BD", "880"); + map.put("BE", "32"); + map.put("BF", "226"); + map.put("BG", "359"); + map.put("BH", "973"); + map.put("BI", "257"); + map.put("BJ", "229"); + map.put("BM", "1441"); + map.put("BN", "673"); + map.put("BO", "591"); + map.put("BR", "55"); + map.put("BS", "1242"); + map.put("BT", "975"); + map.put("BW", "267"); + map.put("BY", "375"); + map.put("BZ", "501"); + map.put("CA", "1"); + map.put("CC", "61"); + map.put("CD", "243"); + map.put("CF", "236"); + map.put("CG", "242"); + map.put("CH", "41"); + map.put("CI", "225"); + map.put("CK", "682"); + map.put("CL", "56"); + map.put("CM", "237"); + map.put("CN", "86"); + map.put("CO", "57"); + map.put("CR", "506"); + map.put("CS", "381"); + map.put("CU", "53"); + map.put("CV", "238"); + map.put("CX", "61"); +// map.put("CY", "90392"); + map.put("CY", "357"); + map.put("CZ", "420"); + map.put("DE", "49"); + map.put("DJ", "253"); + map.put("DK", "45"); + map.put("DM", "1767"); + map.put("DO", "1809"); // and 1829? + map.put("DZ", "213"); + map.put("EC", "593"); + map.put("EE", "372"); + map.put("EG", "20"); + map.put("EH", "212"); + map.put("ER", "291"); + map.put("ES", "34"); + map.put("ET", "251"); + map.put("FI", "358"); + map.put("FJ", "679"); + map.put("FK", "500"); + map.put("FM", "691"); + map.put("FO", "298"); + map.put("FR", "33"); + map.put("GA", "241"); + map.put("GB", "44"); + map.put("GD", "1473"); + map.put("GE", "995"); + map.put("GF", "594"); + map.put("GG", "44"); + map.put("GH", "233"); + map.put("GI", "350"); + map.put("GL", "299"); + map.put("GM", "220"); + map.put("GN", "224"); + map.put("GP", "590"); + map.put("GQ", "240"); + map.put("GR", "30"); + map.put("GT", "502"); + map.put("GU", "1671"); + map.put("GW", "245"); + map.put("GY", "592"); + map.put("HK", "852"); + map.put("HN", "504"); + map.put("HR", "385"); + map.put("HT", "509"); + map.put("HU", "36"); + map.put("ID", "62"); + map.put("IE", "353"); + map.put("IL", "972"); + map.put("IM", "44"); + map.put("IN", "91"); + map.put("IO", "246"); + map.put("IQ", "964"); + map.put("IR", "98"); + map.put("IS", "354"); + map.put("IT", "39"); + map.put("JE", "44"); + map.put("JM", "1876"); + map.put("JO", "962"); + map.put("JP", "81"); + map.put("KE", "254"); + map.put("KG", "996"); + map.put("KH", "855"); + map.put("KI", "686"); + map.put("KM", "269"); + map.put("KN", "1869"); + map.put("KP", "850"); + map.put("KR", "82"); + map.put("KW", "965"); + map.put("KY", "1345"); + map.put("KZ", "7"); + map.put("LA", "856"); + map.put("LB", "961"); + map.put("LC", "1758"); + map.put("LI", "423"); + map.put("LK", "94"); + map.put("LR", "231"); + map.put("LS", "266"); + map.put("LT", "370"); + map.put("LU", "352"); + map.put("LV", "371"); + map.put("LY", "218"); + map.put("MA", "212"); + map.put("MC", "377"); +// map.put("MD", "373533"); + map.put("MD", "373"); + map.put("ME", "382"); + map.put("MG", "261"); + map.put("MH", "692"); + map.put("MK", "389"); + map.put("ML", "223"); + map.put("MM", "95"); + map.put("MN", "976"); + map.put("MO", "853"); + map.put("MP", "1670"); + map.put("MQ", "596"); + map.put("MR", "222"); + map.put("MS", "1664"); + map.put("MT", "356"); + map.put("MU", "230"); + map.put("MV", "960"); + map.put("MW", "265"); + map.put("MX", "52"); + map.put("MY", "60"); + map.put("MZ", "258"); + map.put("NA", "264"); + map.put("NC", "687"); + map.put("NE", "227"); + map.put("NF", "672"); + map.put("NG", "234"); + map.put("NI", "505"); + map.put("NL", "31"); + map.put("NO", "47"); + map.put("NP", "977"); + map.put("NR", "674"); + map.put("NU", "683"); + map.put("NZ", "64"); + map.put("OM", "968"); + map.put("PA", "507"); + map.put("PE", "51"); + map.put("PF", "689"); + map.put("PG", "675"); + map.put("PH", "63"); + map.put("PK", "92"); + map.put("PL", "48"); + map.put("PM", "508"); + map.put("PR", "1787"); // and 1939 ? + map.put("PS", "970"); + map.put("PT", "351"); + map.put("PW", "680"); + map.put("PY", "595"); + map.put("QA", "974"); + map.put("RE", "262"); + map.put("RO", "40"); + map.put("RS", "381"); + map.put("RU", "7"); + map.put("RW", "250"); + map.put("SA", "966"); + map.put("SB", "677"); + map.put("SC", "248"); + map.put("SD", "249"); + map.put("SE", "46"); + map.put("SG", "65"); + map.put("SH", "290"); + map.put("SI", "386"); + map.put("SJ", "47"); + map.put("SK", "421"); + map.put("SL", "232"); + map.put("SM", "378"); + map.put("SN", "221"); + map.put("SO", "252"); + map.put("SR", "597"); + map.put("ST", "239"); + map.put("SV", "503"); + map.put("SY", "963"); + map.put("SZ", "268"); + map.put("TA", "290"); + map.put("TC", "1649"); + map.put("TD", "235"); + map.put("TG", "228"); + map.put("TH", "66"); + map.put("TJ", "992"); + map.put("TK", "690"); + map.put("TL", "670"); + map.put("TM", "993"); + map.put("TN", "216"); + map.put("TO", "676"); + map.put("TR", "90"); + map.put("TT", "1868"); + map.put("TV", "688"); + map.put("TW", "886"); + map.put("TZ", "255"); + map.put("UA", "380"); + map.put("UG", "256"); + map.put("US", "1"); + map.put("UY", "598"); + map.put("UZ", "998"); + map.put("VA", "379"); + map.put("VC", "1784"); + map.put("VE", "58"); + map.put("VG", "1284"); + map.put("VI", "1340"); + map.put("VN", "84"); + map.put("VU", "678"); + map.put("WF", "681"); + map.put("WS", "685"); + map.put("YE", "967"); + map.put("YT", "262"); + map.put("ZA", "27"); + map.put("ZM", "260"); + map.put("ZW", "263"); + }} diff --git a/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/MobileNumberPlugin.java b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/MobileNumberPlugin.java new file mode 100644 index 0000000..58f487b --- /dev/null +++ b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/MobileNumberPlugin.java @@ -0,0 +1,248 @@ +package com.amorenew.mobile_number; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import org.json.JSONArray; + +import java.util.ArrayList; +import java.util.List; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry.Registrar; +import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener; + +/** + * MobileNumberPlugin + */ +public class MobileNumberPlugin implements FlutterPlugin, ActivityAware, MethodCallHandler, RequestPermissionsResultListener { + private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0; + final String Event_phonePermissionResult = "requestPhonePermission="; + private EventChannel.EventSink permissionEvent; + private Context applicationContext; + private Activity activity; + private TelephonyManager telephonyManager; + private Result result; + private MethodChannel methodChannel; + private EventChannel permissionEventChannel; + + + /** + * Plugin registration. + */ + public static void registerWith(Registrar registrar) { + final MobileNumberPlugin instance = new MobileNumberPlugin(); + instance.onAttachedToEngine(registrar.context(), registrar.messenger(), registrar.activity()); + } + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + onAttachedToEngine(flutterPluginBinding.getApplicationContext(), flutterPluginBinding.getBinaryMessenger(), null); + } + + private void onAttachedToEngine(Context applicationContext, BinaryMessenger messenger, Activity _activity) { + this.applicationContext = applicationContext; + if(_activity!=null) + this.activity=_activity; + methodChannel = new MethodChannel(messenger, "mobile_number"); + methodChannel.setMethodCallHandler(this); + permissionEventChannel = new EventChannel(messenger, "phone_permission_event"); + permissionEventChannel.setStreamHandler(new EventChannel.StreamHandler() { + @Override + public void onListen(Object o, EventChannel.EventSink eventSink) { + permissionEvent = eventSink; + } + + @Override + public void onCancel(Object o) { + + } + }); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + + } + + @Override + public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) { + //MobileNumberPlugin.activity = activityPluginBinding.getActivity(); + //activityV2 = activityPluginBinding.getActivity(); + activity = activityPluginBinding.getActivity(); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + + } + + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding activityPluginBinding) { + + } + + @Override + public void onDetachedFromActivity() { + + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + this.result = result; + final String method_GetMobileNumber = "getMobileNumber"; + final String method_hasPhonePermission = "hasPhonePermission"; + final String method_requestPhonePermission = "requestPhonePermission"; + switch (call.method) { + case method_GetMobileNumber: + telephonyManager = (TelephonyManager) applicationContext + .getSystemService(Context.TELEPHONY_SERVICE); + getMobileNumber(); + break; + case method_hasPhonePermission: + result.success(hasPhonePermission()); + break; + case method_requestPhonePermission: + requestPhonePermission(); + break; + default: + result.notImplemented(); + break; + } + } + + private boolean hasPhonePermission() { + if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { + return ContextCompat.checkSelfPermission(applicationContext, + Manifest.permission.READ_PHONE_NUMBERS) == PackageManager.PERMISSION_GRANTED; + } else { + return ContextCompat.checkSelfPermission(applicationContext, + Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; + } + } + + private void requestPhonePermission() { + if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, + Manifest.permission.READ_PHONE_NUMBERS)) { + // Show an explanation to the user *asynchronously* -- don't block + // this thread waiting for the user's response! After the user + // sees the explanation, try again to request the permission. + } else { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.READ_PHONE_NUMBERS}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); + } + } else { + if (ActivityCompat.shouldShowRequestPermissionRationale(activity, + Manifest.permission.READ_PHONE_STATE)) { + } else { + ActivityCompat.requestPermissions(activity, + new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); + } + } + } + + private void getMobileNumber() { + if (!hasPhonePermission()) { + requestPhonePermission(); + } else { + // Permission has already been granted + generateMobileNumber(); + + } + } + + @SuppressLint("HardwareIds") + private void generateMobileNumber() { + JSONArray simJsonArray = new JSONArray(); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { + for (SubscriptionInfo subscriptionInfo : getSubscriptions()) { + SimCard simCard = new SimCard(telephonyManager, subscriptionInfo); + simJsonArray.put(simCard.toJSON()); + } + } + if (simJsonArray.length()==0) { + SimCard simCard = getSingleSimCard(); + if (simCard != null) { + simJsonArray.put(simCard.toJSON()); + } + } + + if (simJsonArray.toString().isEmpty()) { + Log.d("UNAVAILABLE", "No phone number on sim card#3"); + result.error("UNAVAILABLE", "No phone number on sim card", null); + } else result.success(simJsonArray.toString()); + } + + + @SuppressLint("HardwareIds") + SimCard getSingleSimCard() { + if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_NUMBERS) == PackageManager.PERMISSION_DENIED + && ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED) { + Log.e("UNAVAILABLE", "No phone number on sim card Permission Denied#2", null); + return null; + } else if (telephonyManager.getLine1Number() == null || telephonyManager.getLine1Number().isEmpty()) { + Log.e("UNAVAILABLE", "No phone number on sim card#2", null); + return null; + } + return new SimCard(telephonyManager); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1) + List getSubscriptions() { + final SubscriptionManager subscriptionManager = (SubscriptionManager) activity.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + + if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_NUMBERS) == PackageManager.PERMISSION_DENIED + && ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED) { + Log.e("UNAVAILABLE", "No phone number on sim card Permission Denied#1", null); + return new ArrayList<>(); + } else if (subscriptionManager == null) { + Log.e("UNAVAILABLE", "No phone number on sim card#1", null); + return new ArrayList<>(); + } + return subscriptionManager.getActiveSubscriptionInfoList(); + } + + + @Override + public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + // If request is cancelled, the result arrays are empty. + if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (permissionEvent != null) + permissionEvent.success(true); + generateMobileNumber(); + return true; + } else { + if (permissionEvent != null) + permissionEvent.success(false); + } + } + result.error("PERMISSION", "onRequestPermissionsResult is not granted", null); + return false; + } + + +} diff --git a/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/SimCard.java b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/SimCard.java new file mode 100644 index 0000000..180cf49 --- /dev/null +++ b/dialer/packages/mobile_number/android/src/main/java/com/amorenew/mobile_number/SimCard.java @@ -0,0 +1,73 @@ +package com.amorenew.mobile_number; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.telephony.SubscriptionInfo; +import android.telephony.TelephonyManager; + +import androidx.annotation.RequiresApi; + +import org.json.JSONException; +import org.json.JSONObject; + +public class SimCard { + + private String carrierName = ""; + private String displayName = ""; + private int slotIndex = 0; + private String number = ""; + private String countryIso = ""; + private String countryPhonePrefix = ""; + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1) + public SimCard(TelephonyManager telephonyManager, SubscriptionInfo subscriptionInfo) { + this.carrierName = subscriptionInfo.getCarrierName().toString(); + this.displayName = subscriptionInfo.getDisplayName().toString(); + this.slotIndex = subscriptionInfo.getSimSlotIndex(); + this.number = subscriptionInfo.getNumber(); + if (subscriptionInfo.getCountryIso() != null && !subscriptionInfo.getCountryIso().isEmpty()) + this.countryIso = subscriptionInfo.getCountryIso(); + else if (telephonyManager.getSimCountryIso() != null) + this.countryIso = telephonyManager.getSimCountryIso(); + this.countryPhonePrefix = CountryToPhonePrefix.prefixFor(this.countryIso); + } + + @SuppressLint({"MissingPermission", "HardwareIds"}) + public SimCard(TelephonyManager telephonyManager) { + if (telephonyManager.getSimOperator() != null) + carrierName = telephonyManager.getSimOperatorName(); + if (telephonyManager.getSimOperator() != null) + displayName = telephonyManager.getSimOperatorName(); + if (telephonyManager.getSimCountryIso() != null) { + countryIso = telephonyManager.getSimCountryIso(); + countryPhonePrefix = CountryToPhonePrefix.prefixFor(countryIso); + } + if (telephonyManager.getLine1Number() != null && !telephonyManager.getLine1Number().isEmpty()) { + if (telephonyManager.getLine1Number().startsWith("0")) + number = countryPhonePrefix + telephonyManager.getLine1Number().substring(1); + number = telephonyManager.getLine1Number(); + } + } + +// final JSONArray jsonArray = new JSONArray(); + + JSONObject toJSON() { + JSONObject json = new JSONObject(); + try { + json.put("carrierName", carrierName); + json.put("displayName", displayName); + json.put("slotIndex", slotIndex); + json.put("number", number); + json.put("countryIso", countryIso); + json.put("countryPhonePrefix", countryPhonePrefix); + } catch (JSONException e) { + e.printStackTrace(); + } + return json; + + } +} + + + + diff --git a/dialer/packages/mobile_number/example/README.md b/dialer/packages/mobile_number/example/README.md new file mode 100644 index 0000000..aea5cb0 --- /dev/null +++ b/dialer/packages/mobile_number/example/README.md @@ -0,0 +1,16 @@ +# mobile_number_example + +Demonstrates how to use the mobile_number plugin. + +## 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://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/dialer/packages/mobile_number/example/android/app/build.gradle b/dialer/packages/mobile_number/example/android/app/build.gradle new file mode 100644 index 0000000..cf077d8 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/build.gradle @@ -0,0 +1,58 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdk 33 + + + defaultConfig { + applicationId "com.example.mobile_number_example" + minSdkVersion 21 + targetSdkVersion 33 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + signingConfig signingConfigs.debug + } + } + lint { + disable 'InvalidPackage' + } +} + +flutter { + source '../..' +} + +dependencies { + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test:runner:1.4.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} diff --git a/dialer/packages/mobile_number/example/android/app/src/debug/AndroidManifest.xml b/dialer/packages/mobile_number/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..ceca4b9 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dialer/packages/mobile_number/example/android/app/src/main/AndroidManifest.xml b/dialer/packages/mobile_number/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f1c94e9 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/EmbeddingV1Activity.java b/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/EmbeddingV1Activity.java new file mode 100644 index 0000000..5edd23f --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/EmbeddingV1Activity.java @@ -0,0 +1,14 @@ +package com.example.mobile_number_example; + +import android.os.Bundle; + +import com.amorenew.mobile_number.MobileNumberPlugin; +import io.flutter.app.FlutterActivity; + +public class EmbeddingV1Activity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MobileNumberPlugin.registerWith(registrarFor("com.amorenew.mobile_number.MobileNumberPlugin()")); + } +} diff --git a/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/MainActivity.java b/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/MainActivity.java new file mode 100644 index 0000000..e85a073 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/main/java/com/example/mobile_number_example/MainActivity.java @@ -0,0 +1,15 @@ +package com.example.mobile_number_example; + +import io.flutter.embedding.android.FlutterActivity; + + +public class MainActivity extends FlutterActivity { + + + // @Override + // public void configureFlutterEngine(FlutterEngine flutterEngine) { + // super.configureFlutterEngine(flutterEngine); + // flutterEngine.getPlugins().add(new com.example.mobile_number.MobileNumberPlugin()); + // } + +} \ No newline at end of file diff --git a/dialer/packages/mobile_number/example/android/app/src/main/res/drawable/launch_background.xml b/dialer/packages/mobile_number/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 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/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 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@Uy!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/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 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/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/dialer/packages/mobile_number/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/android/app/src/main/res/values/styles.xml b/dialer/packages/mobile_number/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..bd1a80d --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/dialer/packages/mobile_number/example/android/app/src/profile/AndroidManifest.xml b/dialer/packages/mobile_number/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..ceca4b9 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dialer/packages/mobile_number/example/android/build.gradle b/dialer/packages/mobile_number/example/android/build.gradle new file mode 100644 index 0000000..ac477c2 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.2.2' + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/dialer/packages/mobile_number/example/android/gradle.properties b/dialer/packages/mobile_number/example/android/gradle.properties new file mode 100644 index 0000000..b6e61b6 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/gradle.properties @@ -0,0 +1,4 @@ +android.enableJetifier=true +android.useAndroidX=true +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true diff --git a/dialer/packages/mobile_number/example/android/gradle/wrapper/gradle-wrapper.properties b/dialer/packages/mobile_number/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..f7253d4 --- /dev/null +++ b/dialer/packages/mobile_number/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 19 14:57:48 GST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip diff --git a/dialer/packages/mobile_number/example/android/res/values/strings_en.arb b/dialer/packages/mobile_number/example/android/res/values/strings_en.arb new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/dialer/packages/mobile_number/example/android/res/values/strings_en.arb @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/dialer/packages/mobile_number/example/android/settings.gradle b/dialer/packages/mobile_number/example/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/dialer/packages/mobile_number/example/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/dialer/packages/mobile_number/example/android/settings_aar.gradle b/dialer/packages/mobile_number/example/android/settings_aar.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/dialer/packages/mobile_number/example/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/dialer/packages/mobile_number/example/ios/Flutter/AppFrameworkInfo.plist b/dialer/packages/mobile_number/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9367d48 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/dialer/packages/mobile_number/example/ios/Flutter/Debug.xcconfig b/dialer/packages/mobile_number/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..e8efba1 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/dialer/packages/mobile_number/example/ios/Flutter/Release.xcconfig b/dialer/packages/mobile_number/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..399e934 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/dialer/packages/mobile_number/example/ios/Podfile b/dialer/packages/mobile_number/example/ios/Podfile new file mode 100644 index 0000000..5a69b89 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Podfile @@ -0,0 +1,84 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + generated_key_values = {} + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values +end + +target 'Runner' do + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' + + # Plugin Pods + + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.pbxproj b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d8f7dec --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileNumberExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileNumberExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileNumberExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..786d6aa --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/dialer/packages/mobile_number/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.h b/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.m b/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..59a72e9 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/Main.storyboard b/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner/Info.plist b/dialer/packages/mobile_number/example/ios/Runner/Info.plist new file mode 100644 index 0000000..08b3730 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + mobile_number_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/dialer/packages/mobile_number/example/ios/Runner/main.m b/dialer/packages/mobile_number/example/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/dialer/packages/mobile_number/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/dialer/packages/mobile_number/example/lib/main.dart b/dialer/packages/mobile_number/example/lib/main.dart new file mode 100644 index 0000000..eedfd58 --- /dev/null +++ b/dialer/packages/mobile_number/example/lib/main.dart @@ -0,0 +1,78 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:mobile_number/mobile_number.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + String _mobileNumber = ''; + List _simCard = []; + + @override + void initState() { + super.initState(); + MobileNumber.listenPhonePermission((isPermissionGranted) { + if (isPermissionGranted) { + initMobileNumberState(); + } else {} + }); + + initMobileNumberState(); + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initMobileNumberState() async { + if (!await MobileNumber.hasPhonePermission) { + await MobileNumber.requestPhonePermission; + return; + } + // Platform messages may fail, so we use a try/catch PlatformException. + try { + _mobileNumber = (await MobileNumber.mobileNumber)!; + _simCard = (await MobileNumber.getSimCards)!; + } on PlatformException catch (e) { + debugPrint("Failed to get mobile number because of '${e.message}'"); + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() {}); + } + + Widget fillCards() { + List widgets = _simCard + .map((SimCard sim) => Text( + 'Sim Card Number: (${sim.countryPhonePrefix}) - ${sim.number}\nCarrier Name: ${sim.carrierName}\nCountry Iso: ${sim.countryIso}\nDisplay Name: ${sim.displayName}\nSim Slot Index: ${sim.slotIndex}\n\n')) + .toList(); + return Column(children: widgets); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Column( + children: [ + Text('Running on: $_mobileNumber\n'), + fillCards() + ], + ), + ), + ), + ); + } +} diff --git a/dialer/packages/mobile_number/example/pubspec.yaml b/dialer/packages/mobile_number/example/pubspec.yaml new file mode 100644 index 0000000..b9afa83 --- /dev/null +++ b/dialer/packages/mobile_number/example/pubspec.yaml @@ -0,0 +1,64 @@ +name: mobile_number_example +description: Demonstrates how to use the mobile_number plugin. +publish_to: 'none' + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=2.0.0" + +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: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + mobile_number: + path: ../ + +# 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. +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/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # 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/custom-fonts/#from-packages diff --git a/dialer/packages/mobile_number/example/test/widget_test.dart b/dialer/packages/mobile_number/example/test/widget_test.dart new file mode 100644 index 0000000..5fcac6c --- /dev/null +++ b/dialer/packages/mobile_number/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. 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 '../../example/lib/main.dart'; + +void main() { + // testWidgets('Verify Platform version', (WidgetTester tester) async { + // // Build our app and trigger a frame. + // await tester.pumpWidget(MyApp()); + + // // Verify that platform version is retrieved. + // expect( + // find.byWidgetPredicate( + // (Widget widget) => widget is Text && + // widget.data.startsWith('Running on:'), + // ), + // findsOneWidget, + // ); + // }); +} diff --git a/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.h b/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.h new file mode 100644 index 0000000..972894f --- /dev/null +++ b/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface MobileNumberPlugin : NSObject +@end diff --git a/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.m b/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.m new file mode 100644 index 0000000..54e19e3 --- /dev/null +++ b/dialer/packages/mobile_number/ios/Classes/MobileNumberPlugin.m @@ -0,0 +1,20 @@ +#import "MobileNumberPlugin.h" + +@implementation MobileNumberPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"mobile_number" + binaryMessenger:[registrar messenger]]; + MobileNumberPlugin* instance = [[MobileNumberPlugin alloc] init]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + if ([@"getPlatformVersion" isEqualToString:call.method]) { + result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/dialer/packages/mobile_number/ios/mobile_number.podspec b/dialer/packages/mobile_number/ios/mobile_number.podspec new file mode 100644 index 0000000..9d05ad1 --- /dev/null +++ b/dialer/packages/mobile_number/ios/mobile_number.podspec @@ -0,0 +1,21 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'mobile_number' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' +end + diff --git a/dialer/packages/mobile_number/lib/mobile_number.dart b/dialer/packages/mobile_number/lib/mobile_number.dart new file mode 100644 index 0000000..62c06c6 --- /dev/null +++ b/dialer/packages/mobile_number/lib/mobile_number.dart @@ -0,0 +1,65 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:mobile_number/sim_card.dart'; +import 'package:mobile_number/widget_lifecycle.dart'; + +export 'package:mobile_number/sim_card.dart'; +export 'package:mobile_number/widget_lifecycle.dart'; + +class MobileNumber { + static const MethodChannel _channel = const MethodChannel('mobile_number'); + + static void listenPhonePermission( + Function(bool isPermissionGranted) subscription, + ) { + WidgetsBinding.instance.addObserver( + WidgetLifecycle( + resumeCallBack: (() async { + if (await MobileNumber.hasPhonePermission) { + subscription(true); + } else { + subscription(false); + } + }), + ), + ); + } + + static Future get hasPhonePermission async { + final bool hasPermission = + await _channel.invokeMethod('hasPhonePermission'); + return hasPermission; + } + + static Future get requestPhonePermission async { + await _channel.invokeMethod('requestPhonePermission'); + } + + static Future? get mobileNumber async { + final String simCardsJson = await _channel.invokeMethod('getMobileNumber'); + if (simCardsJson.isEmpty) { + return ''; + } + List simCards = SimCard.parseSimCards(simCardsJson); + if (simCards.isNotEmpty && simCards[0].number != null) { + return simCards[0].countryPhonePrefix! + simCards[0].number!; + } else { + return ''; + } + } + + static Future>? get getSimCards async { + final String simCardsJson = await _channel.invokeMethod('getMobileNumber'); + if (simCardsJson.isEmpty) { + return []; + } + List simCards = SimCard.parseSimCards(simCardsJson); + if (simCards.isNotEmpty) { + return simCards; + } else { + return []; + } + } +} diff --git a/dialer/packages/mobile_number/lib/sim_card.dart b/dialer/packages/mobile_number/lib/sim_card.dart new file mode 100644 index 0000000..fecedab --- /dev/null +++ b/dialer/packages/mobile_number/lib/sim_card.dart @@ -0,0 +1,43 @@ +import 'dart:convert'; + +class SimCard { + final String? carrierName; + final String? displayName; + final int? slotIndex; + final String? number; + final String? countryIso; + final String? countryPhonePrefix; + + SimCard({ + this.carrierName, + this.displayName, + this.slotIndex, + this.number, + this.countryIso, + this.countryPhonePrefix, + }); + + factory SimCard.fromMap(Map json) => SimCard( + carrierName: json["carrierName"], + displayName: json["displayName"], + slotIndex: json["slotIndex"], + number: json["number"], + countryIso: json["countryIso"], + countryPhonePrefix: json["countryPhonePrefix"], + ); + + Map toMap() => { + "carrierName": carrierName, + "displayName": displayName, + "slotIndex": slotIndex, + "number": number, + "countryIso": countryIso, + "countryPhonePrefix": countryPhonePrefix, + }; + + static List parseSimCards(String str) => + List.from(json.decode(str).map((x) => SimCard.fromMap(x))); + + static String simCardToJson(List data) => + json.encode(List.from(data.map((x) => x.toMap()))); +} diff --git a/dialer/packages/mobile_number/lib/widget_lifecycle.dart b/dialer/packages/mobile_number/lib/widget_lifecycle.dart new file mode 100644 index 0000000..07d966a --- /dev/null +++ b/dialer/packages/mobile_number/lib/widget_lifecycle.dart @@ -0,0 +1,30 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class WidgetLifecycle extends WidgetsBindingObserver { + final AsyncCallback? resumeCallBack; + final AsyncCallback? suspendingCallBack; + + WidgetLifecycle({ + this.resumeCallBack, + this.suspendingCallBack, + }); + + @override + Future didChangeAppLifecycleState(AppLifecycleState state) async { + switch (state) { + case AppLifecycleState.resumed: + if (resumeCallBack != null) { + await resumeCallBack!(); + } + break; + case AppLifecycleState.inactive: + case AppLifecycleState.paused: + case AppLifecycleState.detached: + if (suspendingCallBack != null) { + await suspendingCallBack!(); + } + break; + } + } +} diff --git a/dialer/packages/mobile_number/local.properties b/dialer/packages/mobile_number/local.properties new file mode 100644 index 0000000..108eb4e --- /dev/null +++ b/dialer/packages/mobile_number/local.properties @@ -0,0 +1,9 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Mon Jun 03 03:03:49 EET 2019 +ndk.dir=D\:\\Programming\\Android\\Tools\\Android_SDK\\ndk-bundle +sdk.dir=D\:\\Programming\\Android\\Tools\\Android_SDK diff --git a/dialer/packages/mobile_number/pubspec.yaml b/dialer/packages/mobile_number/pubspec.yaml new file mode 100644 index 0000000..b5c299b --- /dev/null +++ b/dialer/packages/mobile_number/pubspec.yaml @@ -0,0 +1,23 @@ +name: mobile_number +description: A Flutter plugin for fetching the device's mobile number or list sim cards data +version: 2.1.1 +homepage: https://github.com/amorenew/Flutter-Mobile-Number-Plugin + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=3.0.0 <4.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + android: + package: com.amorenew.mobile_number + pluginClass: MobileNumberPlugin diff --git a/dialer/packages/mobile_number/res/values/strings_en.arb b/dialer/packages/mobile_number/res/values/strings_en.arb new file mode 100644 index 0000000..e69de29 diff --git a/dialer/packages/mobile_number/sample1.png b/dialer/packages/mobile_number/sample1.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe82c0026cff9d145f60afcdba723792c844a00 GIT binary patch literal 71924 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 YuwwlBp7B!05Fc=zcSORU+xw^e3t>WSRsaA1 literal 0 HcmV?d00001 diff --git a/dialer/packages/mobile_number/test/mobile_number_test.dart b/dialer/packages/mobile_number/test/mobile_number_test.dart new file mode 100644 index 0000000..fce92aa --- /dev/null +++ b/dialer/packages/mobile_number/test/mobile_number_test.dart @@ -0,0 +1,21 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mobile_number/mobile_number.dart'; + +void main() { + const MethodChannel channel = MethodChannel('mobile_number'); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { + expect(await MobileNumber.mobileNumber, ''); + }); +} diff --git a/dialer/pubspec.yaml b/dialer/pubspec.yaml index 6618f25..c4f7803 100644 --- a/dialer/pubspec.yaml +++ b/dialer/pubspec.yaml @@ -38,12 +38,13 @@ dependencies: flutter_contacts: ^1.1.9+2 permission_handler: ^10.2.0 # For handling permissions cached_network_image: ^3.2.3 # For caching contact images - sim_data: ^0.0.2 pretty_qr_code: ^3.3.0 pointycastle: ^3.4.0 file_picker: ^5.2.5 asn1lib: ^1.0.0 intl_utils: ^2.0.7 + mobile_number: + path: packages/mobile_number dev_dependencies: flutter_test: