[
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n.vscode\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n\n.flutter-plugins\n.flutter-plugins-dependencies\nexample/.flutter-plugins-dependencies\n"
  },
  {
    "path": "README.md",
    "content": "# flutter_screen_recording\n\nFlutter plugin to record the screen on Android, iOS, and web.\n\nCurrent platform support in this repository:\n\n- Android: `minSdkVersion 23`\n- iOS: `iOS 11.0+`\n- Web: supported through the federated web implementation\n\n## Getting Started\n\nImport the package:\n\n```dart\nimport 'package:flutter_screen_recording/flutter_screen_recording.dart';\n```\n\nStart screen recording:\n\n```dart\nfinal bool started = await FlutterScreenRecording.startRecordScreen(\n  'my_recording',\n  titleNotification: 'Screen recording',\n  messageNotification: 'Recording in progress',\n);\n```\n\nStart screen recording with microphone audio:\n\n```dart\nfinal bool started = await FlutterScreenRecording.startRecordScreenAndAudio(\n  'my_recording',\n  titleNotification: 'Screen recording',\n  messageNotification: 'Recording in progress',\n);\n```\n\nStop recording and get the output path or file name:\n\n```dart\nfinal String path = await FlutterScreenRecording.stopRecordScreen;\n```\n\n## Android\n\nThe Android implementation uses `MediaProjection`, `MediaRecorder`, and a foreground service.\n\n- The plugin currently builds with `compileSdkVersion 35`\n- The plugin manifest already includes its service declaration and required foreground-service permissions\n- If you record audio, request microphone permission at runtime in your app\n- On modern Android versions, you may also need notification permission for the foreground service notification\n\nThe example app requests permissions with `permission_handler` before starting recording.\n\n## iOS\n\nThe iOS implementation uses `ReplayKit` and requires `iOS 11.0+`.\n\nAdd the usage description for microphone access if you record audio:\n\n```xml\n<key>NSMicrophoneUsageDescription</key>\n<string>Save audio in video</string>\n```\n\nThe plugin returns the local output file path. If your app later saves the file to the Photos library, also add the appropriate Photos usage description to your app.\n\n## Web\n\nThe web implementation uses `getDisplayMedia` and `MediaRecorder`.\n\n- Best experience is on modern desktop browsers\n- Browser support depends on screen-capture and codec support\n- The web implementation downloads the recorded file in the browser when recording stops\n\n## Notes\n\n- This package exposes asynchronous APIs; use `await` when starting and stopping recordings\n- Notification title and message parameters are used by the Android implementation\n- Returned output differs by platform: native platforms return a local path, while web triggers a browser download\n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "formatter:\n  page_width: 135\n"
  },
  {
    "path": "example/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Web related\nlib/generated_plugin_registrant.dart\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Exceptions to above rules.\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "example/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f\n  channel: beta\n\nproject_type: app\n"
  },
  {
    "path": "example/README.md",
    "content": "# flutter_screen_recording_example\n\nDemonstrates how to use the flutter_screen_recording plugin.\n\n## Getting Started\n\nThis project is a starting point for a Flutter application.\n\nA few resources to get you started if this is your first Flutter project:\n\n- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)\n- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)\n\nFor help getting started with Flutter, view our\n[online documentation](https://flutter.dev/docs), which offers tutorials,\nsamples, guidance on mobile development, and a full API reference.\n"
  },
  {
    "path": "example/android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n"
  },
  {
    "path": "example/android/app/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n    id 'org.jetbrains.kotlin.android'\n    id 'dev.flutter.flutter-gradle-plugin'\n}\n\ndef localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\nandroid {\n    namespace 'com.isvisoft.flutter_screen_recording_example'\n    compileSdkVersion 36\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.isvisoft.flutter_screen_recording_example\"\n        minSdkVersion flutter.minSdkVersion\n        targetSdkVersion 35\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    kotlinOptions {\n        jvmTarget = \"17\"\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.debug\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test:runner:1.1.0'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'\n    implementation 'androidx.appcompat:appcompat:1.0.0'\n\n\n}\n"
  },
  {
    "path": "example/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.isvisoft.flutter_screen_recording_example\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.isvisoft.flutter_screen_recording_example\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n    <application\n        android:label=\"flutter_screen_recording_example\"\n        android:icon=\"@mipmap/ic_launcher\">\n\n<!--        <service-->\n<!--            android:name=\"com.foregroundservice.ForegroundService\"-->\n<!--            android:foregroundServiceType=\"mediaProjection\">-->\n\n<!--        </service>-->\n\n        <activity\n            android:name=\"io.flutter.embedding.android.FlutterActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:exported=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n    <meta-data\n        android:name=\"flutterEmbedding\"\n        android:value=\"2\" />\n</manifest>\n"
  },
  {
    "path": "example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java",
    "content": "package io.flutter.plugins;\n\nimport androidx.annotation.Keep;\nimport androidx.annotation.NonNull;\nimport io.flutter.Log;\n\nimport io.flutter.embedding.engine.FlutterEngine;\n\n/**\n * Generated file. Do not edit.\n * This file is generated by the Flutter tool based on the\n * plugins that support the Android platform.\n */\n@Keep\npublic final class GeneratedPluginRegistrant {\n  private static final String TAG = \"GeneratedPluginRegistrant\";\n  public static void registerWith(@NonNull FlutterEngine flutterEngine) {\n    try {\n      flutterEngine.getPlugins().add(new com.pravera.flutter_foreground_task.FlutterForegroundTaskPlugin());\n    } catch (Exception e) {\n      Log.e(TAG, \"Error registering plugin flutter_foreground_task, com.pravera.flutter_foreground_task.FlutterForegroundTaskPlugin\", e);\n    }\n    try {\n      flutterEngine.getPlugins().add(new com.isvisoft.flutter_screen_recording.FlutterScreenRecordingPlugin());\n    } catch (Exception e) {\n      Log.e(TAG, \"Error registering plugin flutter_screen_recording, com.isvisoft.flutter_screen_recording.FlutterScreenRecordingPlugin\", e);\n    }\n    try {\n      flutterEngine.getPlugins().add(new com.crazecoder.openfile.OpenFilePlugin());\n    } catch (Exception e) {\n      Log.e(TAG, \"Error registering plugin open_file_android, com.crazecoder.openfile.OpenFilePlugin\", e);\n    }\n    try {\n      flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin());\n    } catch (Exception e) {\n      Log.e(TAG, \"Error registering plugin permission_handler_android, com.baseflow.permissionhandler.PermissionHandlerPlugin\", e);\n    }\n    try {\n      flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());\n    } catch (Exception e) {\n      Log.e(TAG, \"Error registering plugin shared_preferences_android, io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin\", e);\n    }\n  }\n}\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/isvisoft/example/MainActivity.kt",
    "content": "package com.isvisoft.example\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity() {\n}\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/isvisoft/flutter_screen_recording_example/MainActivity.kt",
    "content": "package com.isvisoft.flutter_screen_recording_example\n\nimport io.flutter.embedding.android.FlutterActivity\nimport io.flutter.embedding.engine.FlutterEngine;\n\nclass MainActivity: FlutterActivity() {\n\n}\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "example/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.isvisoft.flutter_screen_recording_example\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "example/android/build.gradle",
    "content": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Sep 17 21:08:02 CEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14-all.zip\n"
  },
  {
    "path": "example/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx4096M -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8\nkotlin.daemon.jvmargs=-Xmx2048M\n\nandroid.enableR8=true\nandroid.useAndroidX=true\nandroid.enableJetifier=false\n"
  },
  {
    "path": "example/android/settings.gradle",
    "content": "pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\").withInputStream { properties.load(it) }\n        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n        return flutterSdkPath\n    }()\n\n    includeBuild(\"$flutterSdkPath/packages/flutter_tools/gradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n    id \"com.android.application\" version \"8.11.1\" apply false\n    id \"org.jetbrains.kotlin.android\" version \"2.2.20\" apply false\n}\n\ninclude(\":app\")\n"
  },
  {
    "path": "example/ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "example/ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>$(DEVELOPMENT_LANGUAGE)</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>9.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/ephemeral/flutter_lldb_helper.py",
    "content": "#\n# Generated file, do not edit.\n#\n\nimport lldb\n\ndef handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):\n    \"\"\"Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.\"\"\"\n    base = frame.register[\"x0\"].GetValueAsAddress()\n    page_len = frame.register[\"x1\"].GetValueAsUnsigned()\n\n    # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the\n    # first page to see if handled it correctly. This makes diagnosing\n    # misconfiguration (e.g. missing breakpoint) easier.\n    data = bytearray(page_len)\n    data[0:8] = b'IHELPED!'\n\n    error = lldb.SBError()\n    frame.GetThread().GetProcess().WriteMemory(base, data, error)\n    if not error.Success():\n        print(f'Failed to write into {base}[+{page_len}]', error)\n        return\n\ndef __lldb_init_module(debugger: lldb.SBDebugger, _):\n    target = debugger.GetDummyTarget()\n    # Caveat: must use BreakpointCreateByRegEx here and not\n    # BreakpointCreateByName. For some reasons callback function does not\n    # get carried over from dummy target for the later.\n    bp = target.BreakpointCreateByRegex(\"^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$\")\n    bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))\n    bp.SetAutoContinue(True)\n    print(\"-- LLDB integration loaded --\")\n"
  },
  {
    "path": "example/ios/Flutter/ephemeral/flutter_lldbinit",
    "content": "#\n# Generated file, do not edit.\n#\n\ncommand script import --relative-to-command-file flutter_lldb_helper.py\n"
  },
  {
    "path": "example/ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "example/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou 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."
  },
  {
    "path": "example/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>flutter_screen_recording_example</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSMicrophoneUsageDescription</key>\n\t<string>Save audio in video</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>Save video in gallery</string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\""
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t48C732CB3C69385D54A034BD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 185C9162DA468CC4BE0965D1 /* Pods_Runner.framework */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t185C9162DA468CC4BE0965D1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t41805422E2BD3E2C89559507 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t6BBA514A532944C87EC9D773 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB6939BF1A171A396BBFFF539 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t48C732CB3C69385D54A034BD /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0857EB6ACFF648BF2EB910EA /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t185C9162DA468CC4BE0965D1 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\tA914DAAD988B38B3D7097D97 /* Pods */,\n\t\t\t\t0857EB6ACFF648BF2EB910EA /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA914DAAD988B38B3D7097D97 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB6939BF1A171A396BBFFF539 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t6BBA514A532944C87EC9D773 /* Pods-Runner.release.xcconfig */,\n\t\t\t\t41805422E2BD3E2C89559507 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t78DFD84CE180EFB1601D168A /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\t6C1CA423670BEB4A6D273175 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1020;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tDevelopmentTeam = Q5Y7GV2TU6;\n\t\t\t\t\t\tLastSwiftMigration = 0910;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t6C1CA423670BEB4A6D273175 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/flutter_foreground_plugin/flutter_foreground_plugin.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/flutter_screen_recording/flutter_screen_recording.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/open_file/open_file.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_foreground_plugin.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_screen_recording.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/open_file.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t78DFD84CE180EFB1601D168A /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = Q5Y7GV2TU6;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.isvisoft.flutterScreenRecordingExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = Q5Y7GV2TU6;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.isvisoft.flutterScreenRecordingExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = Q5Y7GV2TU6;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.isvisoft.flutterScreenRecordingExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/lib/generated_plugin_registrant.dart",
    "content": "//\n// Generated file. Do not edit.\n//\n\n// ignore_for_file: directives_ordering\n// ignore_for_file: lines_longer_than_80_chars\n// ignore_for_file: depend_on_referenced_packages\n\nimport 'package:flutter_screen_recording_web/flutter_screen_recording_web.dart';\nimport 'package:shared_preferences_web/shared_preferences_web.dart';\n\nimport 'package:flutter_web_plugins/flutter_web_plugins.dart';\n\n// ignore: public_member_api_docs\nvoid registerPlugins(Registrar registrar) {\n  WebFlutterScreenRecording.registerWith(registrar);\n  SharedPreferencesPlugin.registerWith(registrar);\n  registrar.registerMessageHandler();\n}\n"
  },
  {
    "path": "example/lib/main.dart",
    "content": "import 'dart:ui';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screen_recording/flutter_screen_recording.dart';\nimport 'package:quiver/async.dart';\nimport 'package:permission_handler/permission_handler.dart';\nimport 'package:open_file/open_file.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatefulWidget {\n  @override\n  _MyAppState createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n  bool recording = false;\n  int _time = 0;\n\n  requestPermissions() async {\n    if (!kIsWeb) {\n      if (await Permission.notification.isDenied) {\n        await Permission.notification.request();\n      }\n      if (await Permission.microphone.request().isDenied) {\n        await Permission.microphone.request();\n      }\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    requestPermissions();\n    startTimer();\n  }\n\n  void startTimer() {\n    CountdownTimer countDownTimer = new CountdownTimer(\n      new Duration(seconds: 1000),\n      new Duration(seconds: 1),\n    );\n\n    var sub = countDownTimer.listen(null);\n    sub.onData((duration) {\n      setState(() => _time++);\n    });\n\n    sub.onDone(() {\n      print(\"Done\");\n      sub.cancel();\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: Scaffold(\n        appBar: AppBar(\n          title: const Text('Flutter Screen Recording'),\n        ),\n        body: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: <Widget>[\n            Text('Time: $_time\\n'),\n            !recording\n                ? Center(\n                    child: ElevatedButton(\n                      child: Text(\"Record Screen\"),\n                      onPressed: () => startScreenRecord(false),\n                    ),\n                  )\n                : Container(),\n            !recording\n                ? Center(\n                    child: ElevatedButton(\n                      child: Text(\"Record Screen & audio\"),\n                      onPressed: () => startScreenRecord(true),\n                    ),\n                  )\n                : Center(\n                    child: ElevatedButton(\n                      child: Text(\"Stop Record\"),\n                      onPressed: () => stopScreenRecord(),\n                    ),\n                  )\n          ],\n        ),\n      ),\n    );\n  }\n\n  startScreenRecord(bool audio) async {\n    bool start = false;\n\n    if (audio) {\n      start = await FlutterScreenRecording.startRecordScreenAndAudio(\n        \"Title\",\n        titleNotification: \"titleNotification\",\n        messageNotification: \"messageNotification\",\n      );\n    } else {\n      start = await FlutterScreenRecording.startRecordScreen(\n        \"Title\",\n        titleNotification: \"titleNotification\",\n        messageNotification: \"messageNotification\",\n      );\n    }\n\n    if (start) {\n      setState(() => recording = !recording);\n    }\n\n    return start;\n  }\n\n  stopScreenRecord() async {\n    String path = await FlutterScreenRecording.stopRecordScreen;\n    setState(() {\n      recording = !recording;\n    });\n    print(\"Opening video\");\n    print(path);\n    OpenFile.open(path);\n  }\n}\n"
  },
  {
    "path": "example/pubspec.yaml",
    "content": "name: flutter_screen_recording_example\ndescription: Demonstrates how to use the flutter_screen_recording plugin.\npublish_to: \"none\"\n\nenvironment:\n  sdk: \">=2.12.0 <4.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  quiver: ^3.0.0\n  flutter_screen_recording:\n    path: ../flutter_screen_recording/\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^1.0.1\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n  flutter_foreground_task: ^9.1.0\n  permission_handler: ^11.3.1\n  open_file: ^3.5.10\n\ndependency_overrides:\n  flutter_screen_recording_web:\n    path: ../flutter_screen_recording_web\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n  # To add assets to your application, add an assets section, like this:\n  # assets:\n  #  - images/a_dot_burr.jpeg\n  #  - images/a_dot_ham.jpeg\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "example/test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility that Flutter provides. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:flutter_screen_recording_example/main.dart';\n\nvoid main() {\n  testWidgets('Verify Platform version', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(MyApp());\n\n    // Verify that platform version is retrieved.\n    expect(\n      find.byWidgetPredicate(\n        (Widget widget) => widget is Text &&\n                           widget.data!.startsWith('Running on:'),\n      ),\n      findsOneWidget,\n    );\n  });\n}\n"
  },
  {
    "path": "example/web/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta content=\"IE=Edge\" http-equiv=\"X-UA-Compatible\">\n  <meta name=\"description\" content=\"A new Flutter project.\">\n\n  <!-- iOS meta tags & icons -->\n  <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n  <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n  <meta name=\"apple-mobile-web-app-title\" content=\"example\">\n  <link rel=\"apple-touch-icon\" href=\"icons/Icon-192.png\">\n\n  <!-- Favicon -->\n  <link rel=\"shortcut icon\" type=\"image/png\" href=\"favicon.png\"/>\n\n  <title>example</title>\n  <link rel=\"manifest\" href=\"manifest.json\">\n</head>\n<body>\n  <!-- This script installs service_worker.js to provide PWA functionality to\n       application. For more information, see:\n       https://developers.google.com/web/fundamentals/primers/service-workers -->\n  <script>\n    if ('serviceWorker' in navigator) {\n      window.addEventListener('load', function () {\n        navigator.serviceWorker.register('flutter_service_worker.js');\n      });\n    }\n  </script>\n  <script src=\"main.dart.js\" type=\"application/javascript\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "example/web/manifest.json",
    "content": "{\n    \"name\": \"example\",\n    \"short_name\": \"example\",\n    \"start_url\": \".\",\n    \"display\": \"standalone\",\n    \"background_color\": \"#0175C2\",\n    \"theme_color\": \"#0175C2\",\n    \"description\": \"A new Flutter project.\",\n    \"orientation\": \"portrait-primary\",\n    \"prefer_related_applications\": false,\n    \"icons\": [\n        {\n            \"src\": \"icons/Icon-192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"icons/Icon-512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\"\n        }\n    ]\n}\n"
  },
  {
    "path": "flutter_screen_recording/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.vscode\n.pub-cache/\n.pub/\nbuild/\n\n# Web related\nlib/generated_plugin_registrant.dart\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Exceptions to above rules.\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "flutter_screen_recording/.metadata",
    "content": "# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f\n  channel: beta\n\nproject_type: plugin\n"
  },
  {
    "path": "flutter_screen_recording/CHANGELOG.md",
    "content": "## 2.0.24\n\n- Refactor\n\n## 2.0.23\n\n- Update flutter_foreground_task\n\n## 2.0.22\n\n- Bug Fixed\n\n## 2.0.21\n\n- Bug Fixed\n\n## 2.0.20\n\n- Update Android\n\n## 2.0.19\n\n- Fix Audio record in iOS\n\n## 2.0.18\n\n- Fix Android 34 notification\n\n## 2.0.17\n\n- Update web lib\n\n## 2.0.16\n\n- Update audio codecs android\n\n## 2.0.15\n\n- try/catch control\n\n## 2.0.14\n\n- Bug fixed ios\n\n## 2.0.13\n\n- Bug fixed\n\n## 2.0.12\n\n- Bug fixed\n\n## 2.0.11\n\n- Android v2 embedding\n\n## 2.0.10\n\n- Update kotlin and gradle versions\n\n## 2.0.9\n\n- Update flutter\n\n## 2.0.8\n\n- Implemented null-safety\n\n## 2.0.7\n\n- Bugs Android 12 fixed\n\n## 2.0.6\n\n- Support Android 12\n\n## 2.0.5\n\n- foreground android\n\n## 2.0.4\n\n- update android\n\n## 2.0.3\n\n- ios Bug\n\n## 2.0.2\n\n- Change devDependencies\n\n## 2.0.1\n\n- Change dependencies\n\n## 2.0.0\n\n- Federated Plugin\n- Web support\n\n## 1.0.10\n\n- Update docs\n\n## 1.0.9\n\n- iOS bug fixed\n\n## 1.0.8\n\n- Update Doc\n\n## 1.0.7\n\n- Add fun startRecordScreenAndAudio in Android\n\n## 1.0.6\n\n- Some Android bug fixed\n\n## 1.0.5\n\n- Android devices compatibility\n\n## 1.0.4\n\n- Included permission controller\n- Bug fixed\n\n## 1.0.2\n\n- ImagePicker conflict fixed\n- Remove HBRecorder.\n"
  },
  {
    "path": "flutter_screen_recording/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Isvisoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "flutter_screen_recording/README.md",
    "content": "# flutter_screen_recording\n\nFlutter plugin to record the screen on Android, iOS, and web.\n\nCurrent platform support in this repository:\n\n- Android: `minSdkVersion 23`\n- iOS: `iOS 11.0+`\n- Web: supported through the federated web implementation\n\n## Getting Started\n\nImport the package:\n\n```dart\nimport 'package:flutter_screen_recording/flutter_screen_recording.dart';\n```\n\nStart screen recording:\n\n```dart\nfinal bool started = await FlutterScreenRecording.startRecordScreen(\n  'my_recording',\n  titleNotification: 'Screen recording',\n  messageNotification: 'Recording in progress',\n);\n```\n\nStart screen recording with microphone audio:\n\n```dart\nfinal bool started = await FlutterScreenRecording.startRecordScreenAndAudio(\n  'my_recording',\n  titleNotification: 'Screen recording',\n  messageNotification: 'Recording in progress',\n);\n```\n\nStop recording and get the output path or file name:\n\n```dart\nfinal String path = await FlutterScreenRecording.stopRecordScreen;\n```\n\n## Android\n\nThe Android implementation uses `MediaProjection`, `MediaRecorder`, and a foreground service.\n\n- The plugin currently builds with `compileSdkVersion 35`\n- The plugin manifest already includes its service declaration and required foreground-service permissions\n- If you record audio, request microphone permission at runtime in your app\n- On modern Android versions, you may also need notification permission for the foreground service notification\n\nThe example app requests permissions with `permission_handler` before starting recording.\n\n## iOS\n\nThe iOS implementation uses `ReplayKit` and requires `iOS 11.0+`.\n\nAdd the usage description for microphone access if you record audio:\n\n```xml\n<key>NSMicrophoneUsageDescription</key>\n<string>Save audio in video</string>\n```\n\nThe plugin returns the local output file path. If your app later saves the file to the Photos library, also add the appropriate Photos usage description to your app.\n\n## Web\n\nThe web implementation uses `getDisplayMedia` and `MediaRecorder`.\n\n- Best experience is on modern desktop browsers\n- Browser support depends on screen-capture and codec support\n- The web implementation downloads the recorded file in the browser when recording stops\n\n## Notes\n\n- This package exposes asynchronous APIs; use `await` when starting and stopping recordings\n- Notification title and message parameters are used by the Android implementation\n- Returned output differs by platform: native platforms return a local path, while web triggers a browser download\n"
  },
  {
    "path": "flutter_screen_recording/android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "flutter_screen_recording/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java",
    "content": "package io.flutter.plugins;\n\nimport io.flutter.plugin.common.PluginRegistry;\nimport com.isvisoft.flutter_screen_recording.FlutterScreenRecordingPlugin;\n\n/**\n * Generated file. Do not edit.\n */\npublic final class GeneratedPluginRegistrant {\n  public static void registerWith(PluginRegistry registry) {\n    if (alreadyRegisteredWith(registry)) {\n      return;\n    }\n    FlutterScreenRecordingPlugin.registerWith(registry.registrarFor(\"com.isvisoft.flutter_screen_recording.FlutterScreenRecordingPlugin\"));\n  }\n\n  private static boolean alreadyRegisteredWith(PluginRegistry registry) {\n    final String key = GeneratedPluginRegistrant.class.getCanonicalName();\n    if (registry.hasPlugin(key)) {\n      return true;\n    }\n    registry.registrarFor(key);\n    return false;\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording/android/build.gradle",
    "content": "group 'com.isvisoft.flutter_screen_recording'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    ext.kotlin_version = '2.1.0'\n    repositories {\n        google()\n        jcenter()\n        maven { url 'https://jitpack.io' }\n\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:8.1.0'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n        jcenter()\n        maven { url 'https://jitpack.io' }\n        maven {\n            url \"https://artifact.bytedance.com/repository/Volcengine/\"\n        }\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 35\n    namespace 'com.isvisoft.flutter_screen_recording'\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n    defaultConfig {\n        minSdkVersion 23\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n    compileOptions {\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    android {\n        kotlinOptions {\n            jvmTarget = '17'\n        }\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.6.0'\n    implementation 'com.github.HBiSoft:HBRecorder:2.0.5'\n\n\n    // Flutter dependencies\n    //compileOnly(\"io.flutter:flutter_embedding_debug:1.0.0-dbec018f4d83ae4b7b97eb8c5a066c61832e12df\") // For debug\n    //compileOnly(\"io.flutter:flutter_embedding_release:1.0.0-dbec018f4d83ae4b7b97eb8c5a066c61832e12df\") // For release\n\n}\n"
  },
  {
    "path": "flutter_screen_recording/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Sep 24 17:44:55 CEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.0-all.zip\n"
  },
  {
    "path": "flutter_screen_recording/android/gradle.properties",
    "content": "android.enableJetifier=true\nandroid.useAndroidX=true\norg.gradle.jvmargs=-Xmx1536M\n\n"
  },
  {
    "path": "flutter_screen_recording/android/settings.gradle",
    "content": "rootProject.name = 'flutter_screen_recording'\n"
  },
  {
    "path": "flutter_screen_recording/android/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.isvisoft.flutter_screen_recording\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n\t<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION\" />\n\t<uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\t<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />\n\t<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n\t<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n\t<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n\t<application>\n\t\t<service android:name=\".ForegroundService\" android:foregroundServiceType=\"mediaProjection\" />\n\t</application>\n</manifest>\n"
  },
  {
    "path": "flutter_screen_recording/android/src/main/kotlin/com/isvisoft/flutter_screen_recording/FlutterScreenRecordingPlugin.kt",
    "content": "package com.isvisoft.flutter_screen_recording\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.ComponentName\nimport android.content.Intent\nimport android.content.ServiceConnection\nimport android.hardware.display.DisplayManager\nimport android.hardware.display.VirtualDisplay\nimport android.media.MediaRecorder\nimport android.media.projection.MediaProjection\nimport android.media.projection.MediaProjectionManager\nimport android.os.Build\nimport android.os.Environment\nimport android.os.IBinder\nimport android.util.DisplayMetrics\nimport android.util.Log\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler\nimport io.flutter.plugin.common.MethodChannel.Result\nimport io.flutter.plugin.common.PluginRegistry\nimport java.io.IOException\n\nimport io.flutter.embedding.engine.plugins.FlutterPlugin\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding\n\n\nclass FlutterScreenRecordingPlugin : \n    MethodCallHandler, \n    PluginRegistry.ActivityResultListener,\n    FlutterPlugin, \n    ActivityAware {\n\n    private var mScreenDensity: Int = 0\n    var mMediaRecorder: MediaRecorder? = null\n    val mProjectionManager: MediaProjectionManager by lazy {\n        ContextCompat.getSystemService(\n            pluginBinding!!.applicationContext,\n            MediaProjectionManager::class.java\n        ) ?: throw Exception(\"MediaProjectionManager not found\")\n    }\n    var mMediaProjection: MediaProjection? = null\n    var mMediaProjectionCallback: MediaProjectionCallback? = null\n    var mVirtualDisplay: VirtualDisplay? = null\n    private var mDisplayWidth: Int = 1280\n    private var mDisplayHeight: Int = 800\n    private var videoName: String? = \"\"\n    private var mFileName: String? = \"\"\n    private var mTitle = \"Your screen is being recorded\"\n    private var mMessage = \"Your screen is being recorded\"\n    private var recordAudio: Boolean? = false;\n    private val SCREEN_RECORD_REQUEST_CODE = 333\n\n    private var pendingResult: Result? = null\n\n    private var pluginBinding: FlutterPlugin.FlutterPluginBinding? = null\n    private var activityBinding: ActivityPluginBinding? = null\n\n    private var serviceConnection: ServiceConnection? = null\n\n    private fun completePendingResult(value: Boolean) {\n        pendingResult?.success(value)\n        pendingResult = null\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {\n\n        val context = pluginBinding!!.applicationContext\n        \n        if (requestCode == SCREEN_RECORD_REQUEST_CODE) {\n            if (pendingResult == null) {\n                Log.w(\"ScreenRecordingPlugin\", \"Ignoring activity result with no pending callback\")\n                if (resultCode != Activity.RESULT_OK) {\n                    ForegroundService.stopService(context)\n                }\n                return true\n            }\n\n            if (resultCode == Activity.RESULT_OK) {\n\n                ForegroundService.startService(context, mTitle, mMessage)\n                val intentConnection = Intent(context, ForegroundService::class.java)\n\n                serviceConnection = object : ServiceConnection {\n\n                    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {\n\n                        try {\n                            startRecordScreen()\n                            mMediaProjectionCallback = MediaProjectionCallback()\n                            mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data!!)\n                            mMediaProjection?.registerCallback(mMediaProjectionCallback!!, null)\n                            mVirtualDisplay = createVirtualDisplay()\n                            completePendingResult(true)\n\n                        } catch (e: Throwable) {\n                            e.message?.let {\n                                Log.e(\"ScreenRecordingPlugin\", it)\n                            }\n                            completePendingResult(false)\n                        }\n                    }\n\n                    override fun onServiceDisconnected(name: ComponentName?) {\n                    }\n                }\n\n                val isBound = context.bindService(intentConnection, serviceConnection!!, Activity.BIND_AUTO_CREATE)\n                if (!isBound) {\n                    ForegroundService.stopService(context)\n                    completePendingResult(false)\n                }\n\n            } else {\n                ForegroundService.stopService(context)\n                completePendingResult(false)\n            }\n            return true\n        }\n        return false\n    }\n\n    override fun onMethodCall(call: MethodCall, result: Result) {\n        val appContext = pluginBinding!!.applicationContext\n\n        when (call.method) {\n            \"startRecordScreen\" -> {\n                if (pendingResult != null) {\n                    result.error(\n                        \"already_pending\",\n                        \"A screen recording request is already pending.\",\n                        null\n                    )\n                    return\n                }\n\n                try {\n                    pendingResult = result\n                    val title = call.argument<String?>(\"title\")\n                    val message = call.argument<String?>(\"message\")\n\n                    if (!title.isNullOrEmpty()) {\n                        mTitle = title\n                    }\n\n                    if (!message.isNullOrEmpty()) {\n                        mMessage = message\n                    }\n\n                    val metrics = DisplayMetrics()\n\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n                        val display = activityBinding!!.activity.display\n                        display?.getRealMetrics(metrics)\n                    } else {\n                        @SuppressLint(\"NewApi\")\n                        val defaultDisplay = appContext.display\n                        defaultDisplay?.getMetrics(metrics)\n                    }\n                    mScreenDensity = metrics.densityDpi\n                    calculateResolution(metrics)\n                    videoName = call.argument<String?>(\"name\")\n                    recordAudio = call.argument<Boolean?>(\"audio\")\n\n                    val permissionIntent = mProjectionManager.createScreenCaptureIntent()\n                    ActivityCompat.startActivityForResult(\n                        activityBinding!!.activity,\n                        permissionIntent,\n                        SCREEN_RECORD_REQUEST_CODE,\n                        null\n                    )\n\n                } catch (e: Exception) {\n                    println(\"Error onMethodCall startRecordScreen\")\n                    println(e.message)\n                    pendingResult = null\n                    result.success(false)\n                }\n            }\n            \"stopRecordScreen\" -> {\n                try {\n                    serviceConnection?.let {\n                        appContext.unbindService(it)\n                    }\n                    ForegroundService.stopService(pluginBinding!!.applicationContext)\n                    if (mMediaRecorder != null) {\n                        stopRecordScreen()\n                        result.success(mFileName)\n                    } else {\n                        result.success(\"\")\n                    }\n                } catch (e: Exception) {\n                    result.success(\"\")\n                }\n            }\n            else -> {\n                result.notImplemented()\n            }\n        }\n    }\n\n    private fun calculateResolution(metrics: DisplayMetrics) {\n\n        mDisplayHeight = metrics.heightPixels\n        mDisplayWidth = metrics.widthPixels\n\n        var maxRes = 1280.0;\n        if (metrics.scaledDensity >= 3.0f) {\n            maxRes = 1920.0;\n        }\n        if (metrics.widthPixels > metrics.heightPixels) {\n            var rate = metrics.widthPixels / maxRes\n\n            if (rate > 1.5) {\n                rate = 1.5\n            }\n            mDisplayWidth = maxRes.toInt()\n            mDisplayHeight = (metrics.heightPixels / rate).toInt()\n            println(\"Rate : $rate\")\n        } else {\n            var rate = metrics.heightPixels / maxRes\n            if (rate > 1.5) {\n                rate = 1.5\n            }\n            mDisplayHeight = maxRes.toInt()\n            mDisplayWidth = (metrics.widthPixels / rate).toInt()\n            println(\"Rate : $rate\")\n        }\n\n        println(\"Scaled Density\")\n        println(metrics.scaledDensity)\n        println(\"Original Resolution \")\n        println(metrics.widthPixels.toString() + \" x \" + metrics.heightPixels)\n        println(\"Calcule Resolution \")\n        println(\"$mDisplayWidth x $mDisplayHeight\")\n    }\n\n    private fun startRecordScreen() {\n        try {\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                mMediaRecorder = MediaRecorder(pluginBinding!!.applicationContext)\n            } else {\n                @Suppress(\"DEPRECATION\")\n                mMediaRecorder = MediaRecorder()\n            }\n\n            try {\n                mFileName = if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {\n                    pluginBinding!!.applicationContext.externalCacheDir?.absolutePath\n                } else {\n                    pluginBinding!!.applicationContext.cacheDir?.absolutePath\n                }\n                mFileName += \"/$videoName.mp4\"\n            } catch (e: IOException) {\n                println(\"Error creating name\")\n                return\n            }\n\n            mMediaRecorder?.setVideoSource(MediaRecorder.VideoSource.SURFACE)\n            if (recordAudio!!) {\n                mMediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC);\n                mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);\n                mMediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);\n            } else {\n                mMediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)\n            }\n            mMediaRecorder?.setOutputFile(mFileName)\n            mMediaRecorder?.setVideoSize(mDisplayWidth, mDisplayHeight)\n            mMediaRecorder?.setVideoEncoder(MediaRecorder.VideoEncoder.H264)\n            mMediaRecorder?.setVideoEncodingBitRate(5 * mDisplayWidth * mDisplayHeight)\n            mMediaRecorder?.setVideoFrameRate(30)\n\n            mMediaRecorder?.prepare()\n            mMediaRecorder?.start()\n\n        } catch (e: Exception) {\n            Log.d(\"--INIT-RECORDER\", e.message + \"\")\n            println(\"Error startRecordScreen\")\n            println(e.message)\n        }\n\n    }\n\n    private fun stopRecordScreen() {\n        try {\n            println(\"stopRecordScreen\")\n            mMediaRecorder?.stop()\n            mMediaRecorder?.reset()\n            println(\"stopRecordScreen success\")\n\n        } catch (e: Exception) {\n            Log.d(\"--INIT-RECORDER\", e.message + \"\")\n            println(\"stopRecordScreen error\")\n            println(e.message)\n\n        } finally {\n            stopScreenSharing()\n        }\n    }\n\n    private fun createVirtualDisplay(): VirtualDisplay? {\n        try {\n            return mMediaProjection?.createVirtualDisplay(\n                \"MainActivity\", mDisplayWidth, mDisplayHeight, mScreenDensity,\n                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder?.surface, null, null\n            )\n        } catch (e: Exception) {\n            println(\"createVirtualDisplay err\")\n            println(e.message)\n            return null\n        }\n    }\n\n    private fun stopScreenSharing() {\n        if (mVirtualDisplay != null) {\n            mVirtualDisplay?.release()\n            if (mMediaProjection != null && mMediaProjectionCallback != null) {\n                mMediaProjection?.unregisterCallback(mMediaProjectionCallback!!)\n                mMediaProjection?.stop()\n                mMediaProjection = null\n            }\n            Log.d(\"TAG\", \"MediaProjection Stopped\")\n        }\n    }\n\n    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {\n        pluginBinding = binding;\n    }\n\n    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {}\n\n    override fun onAttachedToActivity(binding: ActivityPluginBinding) {\n        activityBinding = binding;\n        val channel = MethodChannel(pluginBinding!!.binaryMessenger, \"flutter_screen_recording\")\n        channel.setMethodCallHandler(this)\n        activityBinding!!.addActivityResultListener(this)\n    }\n\n    override fun onDetachedFromActivityForConfigChanges() {}\n\n    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {\n        activityBinding = binding;\n    }\n\n    override fun onDetachedFromActivity() {}\n\n    inner class MediaProjectionCallback : MediaProjection.Callback() {\n        override fun onStop() {\n            mMediaRecorder?.reset()\n            mMediaProjection = null\n            stopScreenSharing()\n        }\n    }\n}\n"
  },
  {
    "path": "flutter_screen_recording/android/src/main/kotlin/com/isvisoft/flutter_screen_recording/ForegroundService.kt",
    "content": "package com.isvisoft.flutter_screen_recording\n\nimport android.Manifest\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.Service\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport android.os.IBinder\nimport androidx.core.app.ActivityCompat\nimport androidx.core.app.NotificationCompat\nimport androidx.core.content.ContextCompat\nimport android.app.Activity\nimport android.os.Binder\n\nclass ForegroundService : Service() {\n    private val CHANNEL_ID = \"ForegroundService Kotlin\"\n    private val REQUEST_CODE_MEDIA_PROJECTION = 1001\n\n    companion object {\n        fun startService(context: Context, title: String, message: String) {\n            println(\"-------------------------- startService\");\n\n            try {\n                val startIntent = Intent(context, ForegroundService::class.java)\n                startIntent.putExtra(\"messageExtra\", message)\n                startIntent.putExtra(\"titleExtra\", title)\n                println(\"-------------------------- startService2\");\n\n                ContextCompat.startForegroundService(context, startIntent)\n                println(\"-------------------------- startService3\");\n\n            } catch (err: Exception) {\n                println(\"startService err\");\n                println(err);\n            }\n        }\n\n        fun stopService(context: Context) {\n            val stopIntent = Intent(context, ForegroundService::class.java)\n                .setAction(ACTION_STOP)\n            context.startService(stopIntent)\n        }\n\n        const val ACTION_STOP = \"com.foregroundservice.ACTION_STOP\"\n    }\n\n\n    @Suppress(\"DEPRECATION\")\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n\n        if (intent?.action == ACTION_STOP) {\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                stopForeground(STOP_FOREGROUND_REMOVE)\n            } else {\n                stopForeground(true)\n            }\n\n            stopSelf()\n\n            return START_NOT_STICKY\n        } else {\n\n            try {\n\n                println(\"-------------------------- onStartCommand\")\n\n                // Verificar permisos en Android 14 (SDK 34)\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {\n                    if (ContextCompat.checkSelfPermission(\n                            this,\n                            Manifest.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION\n                        )\n                        == PackageManager.PERMISSION_DENIED\n                    ) {\n                        println(\"MediaProjection permission not granted, requesting permission\")\n\n                        // Solicitar el permiso si no ha sido concedido\n                        ActivityCompat.requestPermissions(\n                            this as Activity,\n                            arrayOf(Manifest.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION),\n                            REQUEST_CODE_MEDIA_PROJECTION\n                        )\n                    } else {\n                        // Si ya está concedido, continuar normalmente\n                        startForegroundServiceWithNotification(intent)\n                    }\n                } else {\n                    // Si no es Android 14, continuar normalmente\n                    startForegroundServiceWithNotification(intent)\n                }\n\n                return START_STICKY\n            } catch (err: Exception) {\n                println(\"onStartCommand err\")\n                println(err)\n            }\n            return START_STICKY\n        }\n    }\n\n    private fun startForegroundServiceWithNotification(intent: Intent?) {\n        var title = intent?.getStringExtra(\"titleExtra\") ?: \"Flutter Screen Recording\"\n        var message = intent?.getStringExtra(\"messageExtra\") ?: \"\"\n\n        createNotificationChannel()\n        val notificationIntent = Intent(this, FlutterScreenRecordingPlugin::class.java)\n\n        val pendingIntent = PendingIntent.getActivity(\n            this, 0, notificationIntent, PendingIntent.FLAG_MUTABLE\n        )\n\n        val notification = NotificationCompat.Builder(this, CHANNEL_ID)\n            .setContentTitle(title)\n            .setContentText(message)\n            .setSmallIcon(android.R.drawable.presence_video_online)\n            .setContentIntent(pendingIntent)\n            .build()\n\n        startForeground(1, notification)\n        println(\"-------------------------- startForegroundServiceWithNotification\")\n    }\n\n    override fun onBind(intent: Intent): IBinder {\n        return Binder()\n    }\n\n    private fun createNotificationChannel() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val serviceChannel = NotificationChannel(\n                CHANNEL_ID, \"Foreground Service Channel\", NotificationManager.IMPORTANCE_DEFAULT\n            )\n            val manager = getSystemService(NotificationManager::class.java)\n            manager!!.createNotificationChannel(serviceChannel)\n        }\n    }\n}"
  },
  {
    "path": "flutter_screen_recording/ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n.generated/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/Generated.xcconfig\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "flutter_screen_recording/ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "flutter_screen_recording/ios/Classes/FlutterScreenRecordingPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface FlutterScreenRecordingPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "flutter_screen_recording/ios/Classes/FlutterScreenRecordingPlugin.m",
    "content": "#import \"FlutterScreenRecordingPlugin.h\"\n#import <flutter_screen_recording/flutter_screen_recording-Swift.h>\n\n@implementation FlutterScreenRecordingPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftFlutterScreenRecordingPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "flutter_screen_recording/ios/Classes/SwiftFlutterScreenRecordingPlugin.swift",
    "content": "import Flutter\nimport UIKit\nimport ReplayKit\nimport AVFoundation\n\npublic class SwiftFlutterScreenRecordingPlugin: NSObject, FlutterPlugin {\n    \n    let recorder = RPScreenRecorder.shared()\n    var videoWriter: AVAssetWriter?\n    var videoWriterInput: AVAssetWriterInput?\n    var audioWriterInput: AVAssetWriterInput?\n    var videoOutputURL: URL?\n    var isRecording = false\n    var firstTimestamp: CMTime? \n    let screenSize = UIScreen.main.bounds\n    \n    public static func register(with registrar: FlutterPluginRegistrar) {\n        let channel = FlutterMethodChannel(name: \"flutter_screen_recording\", binaryMessenger: registrar.messenger())\n        let instance = SwiftFlutterScreenRecordingPlugin()\n        registrar.addMethodCallDelegate(instance, channel: channel)\n    }\n\n    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n        switch call.method {\n        case \"startRecordScreen\":\n            guard let args = call.arguments as? [String: Any],\n                  let name = args[\"name\"] as? String,\n                  let includeAudio = args[\"audio\"] as? Bool else {\n                result(FlutterError(code: \"INVALID_ARGUMENTS\", message: \"Missing arguments\", details: nil))\n                return\n            }\n            startRecording(videoName: name, recordAudio: includeAudio, result: result)\n        case \"stopRecordScreen\":\n            stopRecording(result: result)\n        default:\n            result(FlutterMethodNotImplemented)\n        }\n    }\n    \n    func startRecording(videoName: String, recordAudio: Bool, result: @escaping FlutterResult) {\n        guard !isRecording else {\n            result(FlutterError(code: \"ALREADY_RECORDING\", message: \"Recording is already in progress\", details: nil))\n            return\n        }\n        \n        isRecording = true\n        \n        // Configurar la ruta del archivo de video\n        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]\n        videoOutputURL = URL(fileURLWithPath: documentsPath).appendingPathComponent(\"\\(videoName).mp4\")\n        \n        // Eliminar el archivo si ya existe\n        if FileManager.default.fileExists(atPath: videoOutputURL!.path) {\n            try? FileManager.default.removeItem(at: videoOutputURL!)\n        }\n        \n        if #available(iOS 11.0, *) {\n            // Crear el AVAssetWriter\n            do {\n                videoWriter = try AVAssetWriter(outputURL: videoOutputURL!, fileType: .mp4)\n            } catch {\n                result(FlutterError(code: \"FILE_ERROR\", message: \"Unable to create video file\", details: error.localizedDescription))\n                return\n            }\n            \n            // Configurar la entrada de video\n            let videoSettings: [String: Any] = [\n                AVVideoCodecKey: AVVideoCodecType.h264,\n                AVVideoWidthKey: screenSize.width,\n                AVVideoHeightKey: screenSize.height\n            ]\n            videoWriterInput = AVAssetWriterInput(mediaType: .video, outputSettings: videoSettings)\n            videoWriterInput?.expectsMediaDataInRealTime = true\n            videoWriter?.add(videoWriterInput!)\n            \n            // Configurar la entrada de audio si es necesario\n            if recordAudio {\n                let audioSettings: [String: Any] = [\n                    AVFormatIDKey: kAudioFormatMPEG4AAC,\n                    AVSampleRateKey: 44100,\n                    AVNumberOfChannelsKey: 2\n                ]\n                audioWriterInput = AVAssetWriterInput(mediaType: .audio, outputSettings: audioSettings)\n                audioWriterInput?.expectsMediaDataInRealTime = true\n                videoWriter?.add(audioWriterInput!)\n            }\n            \n            // Iniciar la captura con ReplayKit\n            recorder.isMicrophoneEnabled = recordAudio\n            recorder.startCapture(handler: { [weak self] sampleBuffer, sampleBufferType, error in\n                guard let self = self, self.isRecording, error == nil else { return }\n                \n                switch sampleBufferType {\n                case .video:\n                    self.handleVideoBuffer(sampleBuffer)\n                case .audioMic:\n                    if recordAudio {\n                        self.handleAudioBuffer(sampleBuffer)\n                    }\n                default:\n                    break\n                }\n            }) { error in\n                if let error = error {\n                    result(FlutterError(code: \"CAPTURE_ERROR\", message: \"Failed to start screen recording\", details: error.localizedDescription))\n                } else {\n                    result(true)\n                }\n            }\n        } \n        else {\n            result(FlutterError(code: \"IOS_VERSION_ERROR\", message: \"This feature is only available on iOS 11 or later\", details: nil))\n        }\n    }\n    \n    func handleVideoBuffer(_ sampleBuffer: CMSampleBuffer) {\n        // Añadir el video al archivo\n        guard let writer = videoWriter, let input = videoWriterInput else { return }\n        \n        if writer.status == .unknown {\n            firstTimestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)\n            writer.startWriting()\n            writer.startSession(atSourceTime: firstTimestamp!)\n        }\n        \n        if writer.status == .writing && input.isReadyForMoreMediaData {\n            input.append(sampleBuffer)\n        }\n    }\n    \n    func handleAudioBuffer(_ sampleBuffer: CMSampleBuffer) {\n        // Añadir el audio al video\n        guard let writer = videoWriter, let input = audioWriterInput else { return }\n        \n        if writer.status == .writing && input.isReadyForMoreMediaData {\n            input.append(sampleBuffer)\n        }\n    }\n    \n    func stopRecording(result: @escaping FlutterResult) {\n        // Detener la captura con ReplayKit\n        guard isRecording else {\n            result(FlutterError(code: \"NOT_RECORDING\", message: \"No recording in progress\", details: nil))\n            return\n        }\n        isRecording = false\n        if #available(iOS 11.0, *) {\n            recorder.stopCapture { [weak self] error in\n                guard let self = self else { return }\n                \n                self.videoWriterInput?.markAsFinished()\n                self.audioWriterInput?.markAsFinished()\n                self.videoWriter?.finishWriting {\n                    if let error = error {\n                        result(FlutterError(code: \"STOP_ERROR\", message: \"Failed to stop recording\", details: error.localizedDescription))\n                    } else {\n                        let alertController = UIAlertController(title: \"Your video was successfully saved\", message: nil, preferredStyle: .alert)\n                        let defaultAction = UIAlertAction(title: \"OK\", style: .default, handler: nil)\n                        alertController.addAction(defaultAction)\n                        result(self.videoOutputURL?.path)\n                    }\n                }\n            }\n        }\n        else {\n            result(FlutterError(code: \"IOS_VERSION_ERROR\", message: \"This feature is only available on iOS 11 or later\", details: nil))\n        }\n    }\n}"
  },
  {
    "path": "flutter_screen_recording/ios/flutter_screen_recording.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html\n#\nPod::Spec.new do |s|\n  s.name             = 'flutter_screen_recording'\n  s.version          = '0.0.1'\n  s.summary          = 'A new Flutter plugin for record the screen.'\n  s.description      = <<-DESC\nA new Flutter plugin for record the screen.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.public_header_files = 'Classes/**/*.h'\n  s.dependency 'Flutter'\n\n  s.ios.deployment_target = '10.0'\nend\n\n"
  },
  {
    "path": "flutter_screen_recording/lib/flutter_screen_recording.dart",
    "content": "//import 'file:D:/Workspace/flutter_screen_recording/flutter_screen_recording_platform_interface/lib/flutter_screen_recording_platform_interface.dart';\nimport 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter_foreground_task/flutter_foreground_task.dart';\nimport 'package:flutter_screen_recording_platform_interface/flutter_screen_recording_platform_interface.dart';\n\nclass FlutterScreenRecording {\n  static Future<bool> startRecordScreen(String name, {String? titleNotification, String? messageNotification}) async {\n    try {\n      if (titleNotification == null) {\n        titleNotification = \"\";\n      }\n      if (messageNotification == null) {\n        messageNotification = \"\";\n      }\n\n      if (!kIsWeb) {\n        _maybeStartFGS(titleNotification, messageNotification);\n      }\n      final bool start = await FlutterScreenRecordingPlatform.instance.startRecordScreen(\n        name,\n        notificationTitle: titleNotification,\n        notificationMessage: messageNotification,\n      );\n\n      return start;\n    } catch (err) {\n      print(\"startRecordScreen err\");\n      print(err);\n    }\n\n    return false;\n  }\n\n  static Future<bool> startRecordScreenAndAudio(String name, {String? titleNotification, String? messageNotification}) async {\n    try {\n      if (titleNotification == null) {\n        titleNotification = \"\";\n      }\n      if (messageNotification == null) {\n        messageNotification = \"\";\n      }\n      if (!kIsWeb) {\n        _maybeStartFGS(titleNotification, messageNotification);\n      }\n      final bool start = await FlutterScreenRecordingPlatform.instance.startRecordScreenAndAudio(\n        name,\n        notificationTitle: titleNotification,\n        notificationMessage: messageNotification,\n      );\n      return start;\n    } catch (err) {\n      print(\"startRecordScreenAndAudio err\");\n      print(err);\n    }\n    return false;\n  }\n\n  static Future<String> get stopRecordScreen async {\n    try {\n      final String path = await FlutterScreenRecordingPlatform.instance.stopRecordScreen;\n      if (!kIsWeb && Platform.isAndroid) {\n        FlutterForegroundTask.stopService();\n      }\n      return path;\n    } catch (err) {\n      print(\"stopRecordScreen err\");\n      print(err);\n    }\n    return \"\";\n  }\n\n  static _maybeStartFGS(String titleNotification, String messageNotification) {\n    try {\n      if (!kIsWeb && Platform.isAndroid) {\n        FlutterForegroundTask.init(\n          androidNotificationOptions: AndroidNotificationOptions(\n            channelId: 'notification_channel_id',\n            channelName: titleNotification,\n            channelDescription: messageNotification,\n            channelImportance: NotificationChannelImportance.LOW,\n            priority: NotificationPriority.LOW,\n            // iconData: const NotificationIconData(\n            //   resType: ResourceType.mipmap,\n            //   resPrefix: ResourcePrefix.ic,\n            //   name: 'launcher',\n            // ),\n          ),\n          iosNotificationOptions: const IOSNotificationOptions(\n            showNotification: true,\n            playSound: false,\n          ),\n          foregroundTaskOptions: ForegroundTaskOptions(\n            eventAction: ForegroundTaskEventAction.repeat(5000),\n            autoRunOnBoot: true,\n            autoRunOnMyPackageReplaced: true,\n            allowWakeLock: true,\n            allowWifiLock: true,\n          ),\n        );\n      }\n    } catch (err) {\n      print(\"_maybeStartFGS err\");\n      print(err);\n    }\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording/pubspec.yaml",
    "content": "name: flutter_screen_recording\ndescription: A new Flutter plugin for record the screen. This plugin can be used for record the screen on android, iOS, and web devices.\nversion: 2.0.24\nhomepage: \"https://github.com/Isvisoft/flutter_screen_recording\"\n\nenvironment:\n  sdk: \">=2.12.0 <4.0.0\"\n  flutter: \">=1.17.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_foreground_task: ^9.1.0\n  flutter_screen_recording_platform_interface: ^1.0.3\n  flutter_screen_recording_web: ^1.0.8\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n  plugin:\n    platforms:\n      android:\n        package: com.isvisoft.flutter_screen_recording\n        pluginClass: FlutterScreenRecordingPlugin\n      ios:\n        pluginClass: FlutterScreenRecordingPlugin\n      web:\n        default_package: flutter_screen_recording_web\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Flutter.podspec\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: a2bde82fbd52e09057a4146f46889f4e10342d32\n  channel: beta\n\nproject_type: package\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/CHANGELOG.md",
    "content": "## 1.0.3\n\n\\*Bug fixed.\n\n## 1.0.2\n\n\\*Implemented null-safety.\n\n## 1.0.1\n\n\\*Update plugin_platform_interface\n\n## 1.0.0\n\n\\*Initial release.\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Isvisoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/README.md",
    "content": "# flutter_screen_recording_platform_interface\n\nA common platform interface for the [`flutter_screen_recording`][1] plugin.\n\nThis interface allows platform-specific implementations of the `flutter_screen_recording`\nplugin, as well as the plugin itself, to ensure they are supporting the\nsame interface.\n\n# Usage\n\nTo implement a new platform-specific implementation of `flutter_screen_recording`, extend\n[`FlutterScreenRecordingPlatform`][2] with an implementation that performs the\nplatform-specific behavior, and when you register your plugin, set the default\n`FlutterScreenRecordingPlatform` by calling\n`FlutterScreenRecordingPlatform.instance = MyPlatformFlutterScreenRecording()`.\n\n[1]: ../flutter_screen_recording\n[2]: lib/flutter_screen_recording_platform_interface.dart"
  },
  {
    "path": "flutter_screen_recording_platform_interface/lib/flutter_screen_recording_platform_interface.dart",
    "content": "library flutter_screen_recording_platform_interface;\n\nimport 'dart:async';\nimport 'package:plugin_platform_interface/plugin_platform_interface.dart';\nimport 'method_channel_flutter_screen_recording.dart';\n\nabstract class FlutterScreenRecordingPlatform extends PlatformInterface {\n  /// Constructs a UrlLauncherPlatform.\n  FlutterScreenRecordingPlatform() : super(token: _token);\n\n  static final Object _token = Object();\n\n  static FlutterScreenRecordingPlatform _instance =\n      MethodChannelFlutterScreenRecording();\n\n  /// The default instance of [FlutterScreenRecordingPlatform] to use.\n  ///\n  /// Defaults to [MethodChannelUrlLauncher].\n  static FlutterScreenRecordingPlatform get instance => _instance;\n\n  /// Platform-specific plugins should set this with their own platform-specific\n  /// class that extends [UrlLauncherPlatform] when they register themselves.\n  // TODO(amirh): Extract common platform interface logic.\n  // https://github.com/flutter/flutter/issues/43368\n  static set instance(FlutterScreenRecordingPlatform instance) {\n    PlatformInterface.verifyToken(instance, _token);\n    _instance = instance;\n  }\n\n  Future<bool> startRecordScreen(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) {\n    throw UnimplementedError();\n  }\n\n  Future<bool> startRecordScreenAndAudio(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) {\n    throw UnimplementedError();\n  }\n\n  Future<String> get stopRecordScreen {\n    throw UnimplementedError();\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/lib/method_channel_flutter_screen_recording.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/services.dart';\n\nimport 'flutter_screen_recording_platform_interface.dart';\n\nclass MethodChannelFlutterScreenRecording\n    extends FlutterScreenRecordingPlatform {\n  static const MethodChannel _channel =\n      const MethodChannel('flutter_screen_recording');\n\n  Future<bool> startRecordScreen(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) async {\n    final bool start = await _channel.invokeMethod('startRecordScreen', {\n      \"name\": name,\n      \"audio\": false,\n      \"title\": notificationTitle,\n      \"message\": notificationMessage,\n    });\n    return start;\n  }\n\n  Future<bool> startRecordScreenAndAudio(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) async {\n    final bool start = await _channel.invokeMethod('startRecordScreen', {\n      \"name\": name,\n      \"audio\": true,\n      \"title\": notificationTitle,\n      \"message\": notificationMessage,\n    });\n    return start;\n  }\n\n  Future<String> get stopRecordScreen async {\n    final String path = await _channel.invokeMethod('stopRecordScreen');\n    return path;\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording_platform_interface/pubspec.yaml",
    "content": "name: flutter_screen_recording_platform_interface\ndescription: A common platform interface for the flutter_screen_recording plugin\nversion: 1.0.3\nhomepage: \"https://github.com/Isvisoft/flutter_screen_recording/tree/web/flutter_screen_recording_platform_interface\"\n\nenvironment:\n  sdk: \">=2.12.0 <4.0.0\"\n  flutter: \">=1.17.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  plugin_platform_interface: ^2.0.2\n  meta: ^1.5.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n"
  },
  {
    "path": "flutter_screen_recording_web/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\nbuild/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Flutter.podspec\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/Flutter/flutter_export_environment.sh\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "flutter_screen_recording_web/.metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: a2bde82fbd52e09057a4146f46889f4e10342d32\n  channel: beta\n\nproject_type: package\n"
  },
  {
    "path": "flutter_screen_recording_web/CHANGELOG.md",
    "content": "## 1.0.8\n\n\\*Update dependencies\n\n## 1.0.7\n\n\\*Bug fixed\n\n## 1.0.6\n\n\\*Bug fixed\n\n## 1.0.5\n\n\\*Update interface\n\n## 1.0.4\n\n\\*Bug fixed\n\n## 1.0.3\n\n\\*Null safety\n\n## 1.0.2\n\n\\*Reorder codecs\n\n## 1.0.1\n\n\\*Change dependencies\n\n## 1.0.0\n\n\\*Initial release.\n"
  },
  {
    "path": "flutter_screen_recording_web/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Isvisoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "flutter_screen_recording_web/README.md",
    "content": "# flutter_screen_recording\n\nThe web implementation of [`flutter_screen_recording`][1].\n\n## Usage\n\nThis package is [endorsed](https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin),\nwhich means you can simply use `flutter_screen_recording` normally. This package will be automatically included in your app when you do.\n\n\n[1]: ../flutter_screen_recording"
  },
  {
    "path": "flutter_screen_recording_web/lib/flutter_screen_recording_web.dart",
    "content": "library flutter_screen_recording_web;\n\nimport 'dart:async';\nimport 'dart:html';\nimport 'dart:js';\n\nimport 'interop/get_display_media.dart';\n\nimport 'package:flutter_screen_recording_platform_interface/flutter_screen_recording_platform_interface.dart';\nimport 'package:flutter_web_plugins/flutter_web_plugins.dart';\n\nclass WebFlutterScreenRecording extends FlutterScreenRecordingPlatform {\n  MediaStream? stream;\n  String? name;\n  MediaRecorder? mediaRecorder;\n  Blob? recordedChunks;\n  String? mimeType;\n\n  static registerWith(Registrar registrar) {\n    FlutterScreenRecordingPlatform.instance = WebFlutterScreenRecording();\n  }\n\n  @override\n  Future<bool> startRecordScreen(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) async {\n    return _record(name, true, false);\n  }\n\n  @override\n  Future<bool> startRecordScreenAndAudio(\n    String name, {\n    String notificationTitle = \"\",\n    String notificationMessage = \"\",\n  }) async {\n    return _record(name, true, true);\n  }\n\n  Future<bool> _record(String name, bool recordVideo, bool recordAudio) async {\n    try {\n      var audioStream;\n\n      final captureOptions = [\n        {\n          \"video\": {\n            \"displaySurface\": 'browser',\n          },\n          \"preferCurrentTab\": true,\n          \"selfBrowserSurface\": 'include',\n          \"surfaceSwitching\": 'include',\n        },\n        {\n          \"video\": {\n            \"displaySurface\": 'browser',\n          },\n          \"preferCurrentTab\": true,\n          \"selfBrowserSurface\": 'include',\n        },\n      ];\n\n      for (var i = 0; i < captureOptions.length; i++) {\n        try {\n          stream = await navigator.getDisplayMedia(captureOptions[i]);\n          break;\n        } catch (e) {\n          if (i == captureOptions.length - 1) {\n            rethrow;\n          }\n        }\n      }\n\n      if (recordAudio) {\n        audioStream = await navigator.getUserMedia({\"audio\": true});\n        if (audioStream.getAudioTracks().isNotEmpty) {\n          stream!.addTrack(audioStream.getAudioTracks()[0]);\n        }\n      }\n\n      this.name = name;\n\n      if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {\n        print('video/webm;codecs=vp9');\n        mimeType = 'video/webm;codecs=vp9,opus';\n      } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8.0')) {\n        print('video/webm;codecs=vp8.0');\n        mimeType = 'video/webm;codecs=vp8.0,opus';\n      } else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {\n        print('video/webm;codecs=vp8');\n        mimeType = 'video/webm;codecs=vp8,opus';\n      } else if (MediaRecorder.isTypeSupported('video/mp4;codecs=h265')) {\n        mimeType = 'video/mp4;codecs=h265,opus';\n        print(\"video/mp4;codecs=h265\");\n      } else if (MediaRecorder.isTypeSupported('video/mp4;codecs=h264')) {\n        print(\"video/mp4;codecs=h264\");\n        mimeType = 'video/mp4;codecs=h264,opus';\n      } else if (MediaRecorder.isTypeSupported('video/webm;codecs=h265')) {\n        print(\"video/webm;codecs=h265\");\n        mimeType = 'video/webm;codecs=h265,opus';\n      } else if (MediaRecorder.isTypeSupported('video/webm;codecs=h264')) {\n        print(\"video/webm;codecs=h264\");\n        mimeType = 'video/webm;codecs=h264,opus';\n      } else {\n        mimeType = 'video/webm';\n      }\n\n      this.mediaRecorder = new MediaRecorder(stream!, {'mimeType': mimeType});\n\n      this.mediaRecorder!.addEventListener('dataavailable', (Event event) {\n        print(\"datavailable ${event.runtimeType}\");\n        recordedChunks = JsObject.fromBrowserObject(event)['data'];\n        this.mimeType = mimeType;\n        print(\"blob size: ${recordedChunks?.size ?? 'empty'}\");\n      });\n\n      this.stream!.getVideoTracks()[0].addEventListener('ended', (Event event) {\n        //If user stop sharing screen, stop record\n        stopRecordScreen;\n      });\n\n      this.mediaRecorder!.start();\n\n      return true;\n    } catch (e) {\n      print(\"--->$e\");\n      return false;\n    }\n  }\n\n  @override\n  Future<String> get stopRecordScreen {\n    final c = new Completer<String>();\n    this.mediaRecorder!.addEventListener(\"stop\", (event) {\n      mediaRecorder = null;\n      this.stream!.getTracks().forEach((element) => element.stop());\n      this.stream = null;\n      final a = document.createElement(\"a\") as AnchorElement;\n      final url = Url.createObjectUrl(new Blob(List<dynamic>.from([recordedChunks]), mimeType));\n      document.body!.append(a);\n      a.style.display = \"none\";\n      a.href = url;\n      a.download = this.name;\n      a.click();\n      Url.revokeObjectUrl(url);\n\n      c.complete(this.name);\n    });\n    mediaRecorder!.stop();\n    return c.future;\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording_web/lib/interop/get_display_media.dart",
    "content": "import 'dart:async';\nimport 'dart:html';\nimport 'dart:js_util' as JSUtils;\nimport 'dart:html' as HTML;\n\nclass navigator {\n  static Future<MediaStream> getUserMedia(Map<String, dynamic> mediaConstraints) async {\n    try {\n      final nav = HTML.window.navigator;\n      if (mediaConstraints['video'] is Map) {\n        if (mediaConstraints['video']['facingMode'] != null) {\n          mediaConstraints['video'].remove('facingMode');\n        }\n      }\n      final jsStream = await nav.getUserMedia(audio: mediaConstraints['audio'] ?? false, video: mediaConstraints['video'] ?? false);\n      return MediaStream(jsStream);\n    } catch (e) {\n      throw 'Unable to getUserMedia: ${e.toString()}';\n    }\n  }\n\n  static Future<MediaStream> getDisplayMedia(Map<String, dynamic> mediaConstraints) async {\n    try {\n      final mediaDevices = HTML.window.navigator.mediaDevices;\n      final dynamic arg = JSUtils.jsify(mediaConstraints);\n\n      final HTML.MediaStream jsStream =\n          await JSUtils.promiseToFuture<HTML.MediaStream>(JSUtils.callMethod(mediaDevices!, 'getDisplayMedia', [arg]));\n      return MediaStream(jsStream);\n    } catch (e) {\n      throw 'Unable to getDisplayMedia: ${e.toString()}';\n    }\n  }\n\n  static Future<List<dynamic>> getSources() async {\n    final devices = await HTML.window.navigator.mediaDevices!.enumerateDevices();\n    final result = [];\n    for (final device in devices) {\n      result.add(<String, String>{'deviceId': device.deviceId, 'groupId': device.groupId, 'kind': device.kind, 'label': device.label});\n    }\n    return result;\n  }\n}\n"
  },
  {
    "path": "flutter_screen_recording_web/pubspec.yaml",
    "content": "name: flutter_screen_recording_web\ndescription: Web platform implementation of flutter_screen_recording\nversion: 1.0.8\nhomepage: \"https://github.com/Isvisoft/flutter_screen_recording\"\n\nenvironment:\n  sdk: \">=2.12.0 <4.0.0\"\n  flutter: \">=1.20.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_screen_recording_platform_interface: ^1.0.3\n\n  flutter_web_plugins:\n    sdk: flutter\n  js: ^0.7.1\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\nflutter:\n  plugin:\n    platforms:\n      web:\n        pluginClass: WebFlutterScreenRecording\n        fileName: flutter_screen_recording_web.dart\n"
  },
  {
    "path": "flutter_screen_recording_web/test/flutter_screen_recording_web_test.dart",
    "content": "import 'package:flutter_test/flutter_test.dart';\n\nimport 'package:flutter_screen_recording_web/flutter_screen_recording_web.dart';\n\nvoid main() {}\n"
  }
]