From ecfe8371f515149f235aad6c7fefba8decbf253e Mon Sep 17 00:00:00 2001 From: Anirudh Sevugan Date: Tue, 28 Jan 2025 18:49:30 -0600 Subject: [PATCH] Delete flutter-exoplayer/flutter_beta_exoplayer_creator directory --- .../flutter_beta_exoplayer_creator/.gitignore | 45 -- .../flutter_beta_exoplayer_creator/.metadata | 30 - .../flutter_beta_exoplayer_creator/README.md | 16 - .../analysis_options.yaml | 28 - .../android/.gitignore | 13 - .../android/app/build.gradle | 44 -- .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 49 -- .../media3_exoplayer_creator/MainActivity.kt | 5 - .../res/drawable-v21/launch_background.xml | 12 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values-night/styles.xml | 18 - .../app/src/main/res/values/styles.xml | 18 - .../app/src/profile/AndroidManifest.xml | 7 - .../android/build.gradle | 18 - .../android/gradle.properties | 3 - .../gradle/wrapper/gradle-wrapper.properties | 5 - .../android/settings.gradle | 25 - .../assets/icon.png | Bin 39996 -> 0 bytes .../lib/main.dart | 107 --- .../lib/screens/video_screen.dart | 339 --------- .../lib/utils/permission_utils.dart | 52 -- .../lib/utils/video_player_manager.dart | 25 - .../lib/utils/web_vtt.dart | 38 -- .../lib/widgets/video_player_widget.dart | 304 --------- .../pubspec.lock | 642 ------------------ .../pubspec.yaml | 97 --- .../test/widget_test.dart | 1 - 33 files changed, 1960 deletions(-) delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/.gitignore delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/.metadata delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/README.md delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/analysis_options.yaml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/.gitignore delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/build.gradle delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/debug/AndroidManifest.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/AndroidManifest.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/kotlin/com/anirudhsevugan/md3exoplayer/media3_exoplayer_creator/MainActivity.kt delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values-night/styles.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values/styles.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/profile/AndroidManifest.xml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/build.gradle delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle.properties delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/android/settings.gradle delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/assets/icon.png delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/main.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/screens/video_screen.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/permission_utils.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/video_player_manager.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/web_vtt.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/lib/widgets/video_player_widget.dart delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.lock delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.yaml delete mode 100644 flutter-exoplayer/flutter_beta_exoplayer_creator/test/widget_test.dart diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/.gitignore b/flutter-exoplayer/flutter_beta_exoplayer_creator/.gitignore deleted file mode 100644 index 79c113f..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.build/ -.buildlog/ -.history -.svn/ -.swiftpm/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/.metadata b/flutter-exoplayer/flutter_beta_exoplayer_creator/.metadata deleted file mode 100644 index 52db189..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/.metadata +++ /dev/null @@ -1,30 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: "8495dee1fd4aacbe9de707e7581203232f591b2f" - channel: "stable" - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 8495dee1fd4aacbe9de707e7581203232f591b2f - base_revision: 8495dee1fd4aacbe9de707e7581203232f591b2f - - platform: android - create_revision: 8495dee1fd4aacbe9de707e7581203232f591b2f - base_revision: 8495dee1fd4aacbe9de707e7581203232f591b2f - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/README.md b/flutter-exoplayer/flutter_beta_exoplayer_creator/README.md deleted file mode 100644 index 11ac461..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# media3_exoplayer_creator - -ExoPlayer Creator that supports Media3 - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/analysis_options.yaml b/flutter-exoplayer/flutter_beta_exoplayer_creator/analysis_options.yaml deleted file mode 100644 index 0d29021..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/analysis_options.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/.gitignore b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/.gitignore deleted file mode 100644 index 55afd91..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/to/reference-keystore -key.properties -**/*.keystore -**/*.jks diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/build.gradle b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/build.gradle deleted file mode 100644 index f1c79d5..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.anirudhsevugan.md3exoplayer.media3_exoplayer_creator" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.anirudhsevugan.md3exoplayer.media3_exoplayer_creator" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/debug/AndroidManifest.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/AndroidManifest.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 7fe6dc0..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/kotlin/com/anirudhsevugan/md3exoplayer/media3_exoplayer_creator/MainActivity.kt b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/kotlin/com/anirudhsevugan/md3exoplayer/media3_exoplayer_creator/MainActivity.kt deleted file mode 100644 index 155d6b9..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/kotlin/com/anirudhsevugan/md3exoplayer/media3_exoplayer_creator/MainActivity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.anirudhsevugan.md3exoplayer.media3_exoplayer_creator - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable-v21/launch_background.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable/launch_background.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values-night/styles.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values/styles.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef88..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/profile/AndroidManifest.xml b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/build.gradle b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/build.gradle deleted file mode 100644 index d2ffbff..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle.properties b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle.properties deleted file mode 100644 index 2597170..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError -android.useAndroidX=true -android.enableJetifier=true diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle/wrapper/gradle-wrapper.properties b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7bb2df6..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/settings.gradle b/flutter-exoplayer/flutter_beta_exoplayer_creator/android/settings.gradle deleted file mode 100644 index a42444d..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/assets/icon.png b/flutter-exoplayer/flutter_beta_exoplayer_creator/assets/icon.png deleted file mode 100644 index 1a775c85bc47786112bd142fe1b7f8eb580e075e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39996 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μ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 diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/main.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/main.dart deleted file mode 100644 index b49f2b5..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/main.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:media3_exoplayer_creator/screens/video_screen.dart'; // Import other files as needed - -void main() { - runApp(MyApp()); -} - -class MyApp extends StatefulWidget { - const MyApp({super.key}); - - @override - State createState() => _MyAppState(); -} - -class _MyAppState extends State { - bool _isDarkMode = false; - - void _toggleTheme() { - setState(() { - _isDarkMode = !_isDarkMode; - }); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: _isDarkMode - ? ThemeData.dark().copyWith( - primaryColor: Colors.lightBlue, // Light Blue primary color - colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.lightBlue) - .copyWith(secondary: Colors.lightBlue), - appBarTheme: AppBarTheme( - color: Colors.lightBlue, - titleTextStyle: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - textButtonTheme: TextButtonThemeData( - style: TextButton.styleFrom( - foregroundColor: Colors.lightBlue, // Light Blue for text buttons - ), - ), - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: Colors.white, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: Colors.lightBlue, // Light Blue for borders - width: 2, - ), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: Colors.lightBlue, // Light Blue for focused border - width: 2, - ), - ), - ), - ) - : ThemeData.light().copyWith( - primaryColor: Colors.lightBlue, // Light Blue primary color - scaffoldBackgroundColor: Colors.white, - colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.lightBlue) - .copyWith(secondary: Colors.lightBlue), - appBarTheme: AppBarTheme( - color: Colors.lightBlue, - titleTextStyle: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - textButtonTheme: TextButtonThemeData( - style: TextButton.styleFrom( - foregroundColor: Colors.lightBlue, // Light Blue for text buttons - ), - ), - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: Colors.white, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: Colors.lightBlue, // Light Blue for borders - width: 2, - ), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: Colors.lightBlue, // Light Blue for focused border - width: 2, - ), - ), - ), - ), - home: Scaffold( - body: VideoScreen(), - ), - ); - } -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/screens/video_screen.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/screens/video_screen.dart deleted file mode 100644 index 241dc12..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/screens/video_screen.dart +++ /dev/null @@ -1,339 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:file_picker/file_picker.dart'; -import '../widgets/video_player_widget.dart'; - -class VideoScreen extends StatefulWidget { - const VideoScreen({super.key}); - - @override - _VideoScreenState createState() => _VideoScreenState(); -} - -class _VideoScreenState extends State { - String _videoUrl = ''; - String _filePath = ''; - String _subtitleUrl = ''; - String _subtitleFilePath = ''; - final bool _isDarkMode = false; // Store the manual theme preference - - // Function to pick the file after choosing the type - Future _pickFile(FileType type) async { - FilePickerResult? result = await FilePicker.platform.pickFiles( - type: type, // File type selected by user - ); - - if (result != null && result.files.single.path != null) { - setState(() { - _filePath = result.files.single.path!; - _videoUrl = ''; // Clear video URL if file is picked - }); - } - } - - // Show the dialog to choose file type - Future _showFileTypeDialog() async { - return showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('What kind of file would you like to pick?'), - actions: [ - TextButton( - child: const Text('Video'), - onPressed: () { - Navigator.of(context).pop(); - _pickFile(FileType.video); // Pick video files - }, - ), - TextButton( - child: const Text('Audio'), - onPressed: () { - Navigator.of(context).pop(); - _pickFile(FileType.audio); // Pick audio files - }, - ), - TextButton( - child: const Text('Cancel'), - onPressed: () => Navigator.of(context).pop(), // Cancel action - ), - ], - ); - }, - ); - } - - // Show the dialog to enter video URL - Future _showVideoURLDialog() async { - final TextEditingController videoController = TextEditingController(); - - return showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Enter Media URL'), - content: TextField( - controller: videoController, - decoration: const InputDecoration(hintText: 'Enter a valid media URL'), - keyboardType: TextInputType.url, - ), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: const Text('OK'), - onPressed: () { - setState(() { - _videoUrl = videoController.text; - _filePath = ''; - }); - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - - // Show the subtitle dialog - Future _showSubtitleDialog() async { - final TextEditingController subtitleController = TextEditingController(); - - return showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Enter Subtitle URL'), - content: TextField( - controller: subtitleController, - decoration: const InputDecoration(hintText: 'Enter a valid subtitle URL'), - keyboardType: TextInputType.url, - ), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: const Text('OK'), - onPressed: () { - setState(() { - _subtitleUrl = subtitleController.text; - _subtitleFilePath = ''; // Clear file path when URL is used - }); - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - - // Play the video - void _playMedia() { - setState(() { - // Switch to the VideoPlayerWidget screen - }); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: _onWillPop, // Custom back button behavior - child: MaterialApp( - debugShowCheckedModeBanner: false, - themeMode: _isDarkMode ? ThemeMode.dark : ThemeMode.system, - // Respect system theme - theme: _lightTheme(), - darkTheme: _darkTheme(), - home: Scaffold( - appBar: _videoUrl.isNotEmpty || _filePath.isNotEmpty - ? null // Hide AppBar when video is playing - : AppBar( - title: const Text('SimpliPlay Neo'), - ), - body: Center( - child: _videoUrl.isEmpty && _filePath.isEmpty - ? SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // Central Buttons (Enter Video URL, Choose File, Add Subtitle) - _buildButtonRow(), - SizedBox(height: 20), - // Play Button - This only appears if a file or URL is chosen - ], - ), - ) - : WillPopScope( - onWillPop: () async { - // Show confirmation dialog before exiting VideoPlayerWidget - return (await _showExitConfirmation()) ?? false; - }, - child: VideoPlayerWidget( - videoUrl: _videoUrl, - filePath: _filePath, - subtitleUrl: _subtitleUrl, - subtitleFilePath: _subtitleFilePath, - ), - ), - ), - ), - ), - ); - } - - // Row containing the buttons - Widget _buildButtonRow() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildCentralButton( - icon: Icons.link, - label: 'Enter Media URL', - onPressed: _showVideoURLDialog, - ), - SizedBox(width: 20), - _buildCentralButton( - icon: Icons.video_library, - label: 'Choose File', - onPressed: _showFileTypeDialog, // Show the file type dialog - ), - SizedBox(width: 20), - _buildCentralButton( - icon: Icons.subtitles, - label: 'Enter Subtitle URL', - onPressed: _showSubtitleDialog, - ), - ], - ); - } - - // Central button widget - Widget _buildCentralButton({ - required IconData icon, - required String label, - required VoidCallback onPressed, - }) { - return Column( - children: [ - IconButton( - icon: Icon(icon, size: 50), - onPressed: onPressed, - ), - Text(label), - ], - ); - } - - Future _onWillPop() async { - // If the video is not playing (i.e., file or URL is empty), exit the app - if (_videoUrl.isEmpty && _filePath.isEmpty) { - return true; // Exit the app - } - - // If the video is playing, show the confirmation dialog - return (await _showExitConfirmation()) ?? false; - } - - // Show the exit confirmation dialog - Future _showExitConfirmation() async { - return showDialog( - context: context, - barrierDismissible: false, // Prevent dismissing by tapping outside the dialog - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Are you sure you want to exit?'), - actions: [ - TextButton( - child: const Text('No'), - onPressed: () { - Navigator.of(context).pop(false); // Stay on current screen - }, - ), - TextButton( - child: const Text('Yes'), - onPressed: () { - Navigator.of(context).pop(true); // Navigate back to VideoScreen - Navigator.of(context).pushReplacement( - MaterialPageRoute(builder: (context) => VideoScreen())); - }, - ), - ], - ); - }, - ); - } - - // Light theme - ThemeData _lightTheme() { - return ThemeData( - primaryColor: Colors.lightBlue, - scaffoldBackgroundColor: Colors.white, - colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.lightBlue) - .copyWith(secondary: Colors.lightBlue), - appBarTheme: AppBarTheme( - color: Colors.lightBlue, - titleTextStyle: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - iconTheme: IconThemeData( - color: Colors.black, // Black icons for light mode - ), - textTheme: TextTheme( - bodyLarge: TextStyle(color: Colors.black), - bodyMedium: TextStyle(color: Colors.black), - bodySmall: TextStyle(color: Colors.black), - ), - dialogTheme: DialogTheme( - backgroundColor: Colors.white, - // White background for dialog in light mode - titleTextStyle: TextStyle( - color: Colors.black), // Black text in light mode - ), - ); - } - - // Dark theme - ThemeData _darkTheme() { - return ThemeData( - primaryColor: Colors.blue, - // Primary color for the theme - scaffoldBackgroundColor: Colors.black, - // Black background for the scaffold - colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blue) - .copyWith(secondary: Colors.blue), - appBarTheme: AppBarTheme( - color: Colors.blue, // Blue AppBar background - titleTextStyle: TextStyle( - color: Colors.white, // White text on AppBar - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - iconTheme: IconThemeData( - color: Colors.white, // White icons for dark mode - ), - textTheme: TextTheme( - bodyLarge: TextStyle(color: Colors.white), - bodyMedium: TextStyle(color: Colors.white), - bodySmall: TextStyle(color: Colors.white), - ), - dialogTheme: DialogTheme( - backgroundColor: Color(0xFF333333), - // Dark background for dialog in dark mode - titleTextStyle: TextStyle( - color: Colors.white), // White text in dark mode - ), - ); - } -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/permission_utils.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/permission_utils.dart deleted file mode 100644 index 8a60c6e..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/permission_utils.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:permission_handler/permission_handler.dart'; -import 'package:flutter/material.dart'; - -Future requestPermissionIfNeeded(String subtitleFilePath, BuildContext context) async { - if (subtitleFilePath.isNotEmpty) { - // Only request permission if a subtitle file is chosen - PermissionStatus status = await Permission.storage.status; - - if (!status.isGranted) { - // If permission is not granted, request it - status = await Permission.storage.request(); - if (status.isDenied) { - // If permission is denied, show an alert dialog - _showPermissionDeniedDialog(context); - return; // Exit as we cannot proceed without permission - } else if (status.isPermanentlyDenied) { - // If the permission is permanently denied, guide the user to settings - _showPermissionDeniedDialog(context, permanentlyDenied: true); - return; - } - } - } -} - -void _showPermissionDeniedDialog(BuildContext context, {bool permanentlyDenied = false}) { - showDialog( - context: context, - barrierDismissible: false, // Prevent tapping outside to dismiss - builder: (BuildContext context) { - return AlertDialog( - title: Text('Permission Denied'), - content: Text( - permanentlyDenied - ? 'The permission to access external storage has been permanently denied. Please go to the app settings to enable it.' - : 'You have denied the permission to access external storage. Please allow it to proceed.', - ), - actions: [ - TextButton( - onPressed: () { - if (permanentlyDenied) { - // Optionally, open app settings if permission is permanently denied - openAppSettings(); - } - Navigator.of(context).pop(); // Close the dialog - }, - child: Text('OK'), - ), - ], - ); - }, - ); -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/video_player_manager.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/video_player_manager.dart deleted file mode 100644 index b4d16b1..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/video_player_manager.dart +++ /dev/null @@ -1,25 +0,0 @@ -class VideoPlayerManager { - static final VideoPlayerManager _instance = VideoPlayerManager._internal(); - - bool _isPlaying = false; - - // Private constructor - VideoPlayerManager._internal(); - - factory VideoPlayerManager() { - return _instance; - } - - // To start playing the video - void playVideo() { - _isPlaying = true; - } - - // To stop or pause the video - void stopVideo() { - _isPlaying = false; - } - - // To check if video is playing - bool get isPlaying => _isPlaying; -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/web_vtt.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/web_vtt.dart deleted file mode 100644 index 51dda3e..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/utils/web_vtt.dart +++ /dev/null @@ -1,38 +0,0 @@ -class WebVttCue { - final Duration start; - final Duration end; - final String text; - - WebVttCue({ - required this.start, - required this.end, - required this.text, - }); -} - -// Subtitle parsing logic (WebVTT format) -List parseWebVtt(String subtitleData) { - final cuePattern = RegExp(r'(\d{2}:\d{2}:\d{2}.\d{3}) --> (\d{2}:\d{2}:\d{2}.\d{3})\n(.*?)\n\n', dotAll: true); - final List cues = []; - - for (final match in cuePattern.allMatches(subtitleData)) { - final start = _parseTime(match.group(1)!); - final end = _parseTime(match.group(2)!); - final text = match.group(3)!; - cues.add(WebVttCue(start: start, end: end, text: text)); - } - - return cues; -} - -// Helper method to parse time string to Duration -Duration _parseTime(String time) { - final parts = time.split(':'); - final secondsParts = parts[2].split('.'); - return Duration( - hours: int.parse(parts[0]), - minutes: int.parse(parts[1]), - seconds: int.parse(secondsParts[0]), - milliseconds: int.parse(secondsParts[1]), - ); -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/widgets/video_player_widget.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/widgets/video_player_widget.dart deleted file mode 100644 index d794be5..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/lib/widgets/video_player_widget.dart +++ /dev/null @@ -1,304 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:video_player/video_player.dart'; -import 'package:chewie/chewie.dart'; -import 'package:http/http.dart' as http; -import 'dart:io'; // Import to use File class -import 'package:media3_exoplayer_creator/utils/permission_utils.dart'; // Import permission_utils.dart for permission handling -import 'package:keep_screen_on/keep_screen_on.dart'; // Import keep_screen_on -import '../utils/web_vtt.dart'; // Import web_vtt.dart for subtitle handling - -class VideoPlayerWidget extends StatefulWidget { - final String videoUrl; - final String filePath; - final String subtitleUrl; - final String subtitleFilePath; - - const VideoPlayerWidget({ - super.key, - required this.videoUrl, - required this.filePath, - required this.subtitleUrl, - required this.subtitleFilePath, - }); - - @override - _VideoPlayerWidgetState createState() => _VideoPlayerWidgetState(); -} - -class _VideoPlayerWidgetState extends State { - late VideoPlayerController _videoPlayerController; - late ChewieController _chewieController; - late List _subtitles; - String? _currentSubtitle; - bool _isLoading = true; - double _playbackSpeed = 1.0; - bool _controlsVisible = true; // Keep track of control visibility - - @override - void initState() { - super.initState(); - - // Request permission for subtitle files if needed - if (widget.subtitleFilePath.isNotEmpty) { - requestPermissionIfNeeded(widget.subtitleFilePath, context); - } - - // Initialize the video player controller based on video URL or file path - if (widget.filePath.isNotEmpty) { - _videoPlayerController = - VideoPlayerController.file(File(widget.filePath)); - } else { - _videoPlayerController = - VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl)); - } - - // Initialize the Chewie controller for video playback - _initializeChewieController(); - - // Load subtitles if needed - _loadSubtitles(); - - // Keep the screen on while the video is playing - KeepScreenOn.turnOn(); - - // Listen to video position changes to update subtitles - _videoPlayerController.addListener(_updateCurrentSubtitle); - - // Apply immersive mode once the widget builds - WidgetsBinding.instance.addPostFrameCallback((_) { - _applyImmersiveMode(); - }); - - // Initialize the video player - _initializeVideoPlayer(); - } - - void _applyImmersiveMode() { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); - } - - void _initializeChewieController() { - _chewieController = ChewieController( - videoPlayerController: _videoPlayerController, - aspectRatio: 16 / 9, - autoPlay: true, - looping: true, - allowPlaybackSpeedChanging: false, - // Disable built-in playback speed dropdown - customControls: MaterialControls( - // Custom controls if needed - ), - showControlsOnInitialize: true, // Show controls on initialization - ); - } - - @override - void dispose() { - KeepScreenOn.turnOff(); - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.manual, overlays: SystemUiOverlay.values); - - _videoPlayerController.removeListener(_updateCurrentSubtitle); - _chewieController.dispose(); - _videoPlayerController.dispose(); - super.dispose(); - } - - Future _loadSubtitles() async { - setState(() { - _isLoading = true; - }); - - if (widget.subtitleFilePath.isNotEmpty) { - try { - final file = File(widget.subtitleFilePath); - final subtitleData = await file.readAsString(); - setState(() { - _subtitles = parseWebVtt(subtitleData); - _isLoading = false; - }); - } catch (e) { - setState(() { - _isLoading = false; - }); - print('Error loading subtitle file: $e'); - } - } else if (widget.subtitleUrl.isNotEmpty) { - try { - final response = await http.get(Uri.parse(widget.subtitleUrl)); - if (response.statusCode == 200) { - setState(() { - _subtitles = parseWebVtt(response.body); - _isLoading = false; - }); - } else { - setState(() { - _isLoading = false; - }); - print('Failed to load subtitle from URL: ${response.statusCode}'); - } - } catch (e) { - setState(() { - _isLoading = false; - }); - print('Error loading subtitle from URL: $e'); - } - } - } - - void _updateCurrentSubtitle() { - final currentTime = _videoPlayerController.value.position; - - for (var cue in _subtitles) { - if (currentTime >= cue.start && currentTime <= cue.end) { - setState(() { - _currentSubtitle = cue.text; - }); - return; - } - } - - setState(() { - _currentSubtitle = ''; - }); - } - - void _initializeVideoPlayer() async { - await _videoPlayerController.initialize(); - setState(() { - _isLoading = false; - }); - } - - void _changePlaybackSpeed(double speed) { - setState(() { - _playbackSpeed = speed; - _videoPlayerController.setPlaybackSpeed(speed); - - // Reapply immersive mode after speed change - WidgetsBinding.instance.addPostFrameCallback((_) { - _applyImmersiveMode(); - }); - }); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async { - _applyImmersiveMode(); // Reapply immersive mode on back press - return true; // Allow the back action to proceed - }, - child: Scaffold( - body: Stack( - children: [ - // This GestureDetector is now the topmost widget in the stack - GestureDetector( - onTap: () { - setState(() { - _controlsVisible = !_controlsVisible; // Toggle controls visibility on tap anywhere - }); - _applyImmersiveMode(); // Reapply immersive mode - }, - child: Column( - children: [ - Expanded( - child: Container( - color: Colors.black, - child: Chewie(controller: _chewieController), - ), - ), - ], - ), - ), - // Loading Indicator - if (_isLoading) - Center(child: CircularProgressIndicator()), - - // Subtitle display - if (_currentSubtitle != null && _currentSubtitle!.isNotEmpty && !_isLoading) - Positioned( - bottom: 70, - left: 0, - right: 0, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - color: Colors.black.withOpacity(0.7), - child: Text( - _currentSubtitle!, - style: TextStyle(fontSize: 19, color: Colors.white), - textAlign: TextAlign.center, - ), - ), - ), - - // Custom playback speed control button - Positioned( - top: 8, - right: 8, - child: AnimatedOpacity( - opacity: _controlsVisible ? 1.0 : 0.0, - duration: Duration(milliseconds: 300), - // Adjust duration for fade effect - child: IconButton( - icon: SizedBox.shrink(), // No icon, just an empty space - onPressed: () { - _applyImmersiveMode(); // Reapply immersive mode - _showPlaybackSpeedDialog(); - }, - ), - ), - ), - ], - ), - ), - ); - } - - void _showPlaybackSpeedDialog() { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text( - "Select Playback Speed", - style: TextStyle( - fontSize: 20, // Keep the title size consistent - color: Theme - .of(context) - .brightness == Brightness.light - ? Colors.grey - : Colors.grey - ), - ), - content: SingleChildScrollView( // Wrap content with SingleChildScrollView - child: Column( - mainAxisSize: MainAxisSize.min, - children: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0].map(( - speed) { - return ListTile( - title: Text( - "${speed}x", - style: TextStyle( - color: Theme - .of(context) - .textTheme - .bodyMedium - ?.color ?? - Colors.grey, // Dynamic text color based on theme - ), - ), - onTap: () { - _changePlaybackSpeed(speed); - Navigator.of(context).pop(); - }, - ); - }).toList(), - ), - ), - ); - }, - ); - } -} diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.lock b/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.lock deleted file mode 100644 index bc3fc9d..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.lock +++ /dev/null @@ -1,642 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - archive: - dependency: transitive - description: - name: archive - sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - args: - dependency: transitive - description: - name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.dev" - source: hosted - version: "2.6.0" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - chewie: - dependency: "direct main" - description: - name: chewie - sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" - url: "https://pub.dev" - source: hosted - version: "1.8.5" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" - source: hosted - version: "0.4.2" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.dev" - source: hosted - version: "1.19.0" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev" - source: hosted - version: "0.3.4+2" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - cupertino_icons: - dependency: transitive - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - dbus: - dependency: transitive - description: - name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" - url: "https://pub.dev" - source: hosted - version: "0.7.10" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" - source: hosted - version: "1.3.1" - ffi: - dependency: transitive - description: - name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 - url: "https://pub.dev" - source: hosted - version: "8.1.7" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.dev" - source: hosted - version: "0.13.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" - url: "https://pub.dev" - source: hosted - version: "2.0.24" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - html: - dependency: transitive - description: - name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" - url: "https://pub.dev" - source: hosted - version: "0.15.5" - http: - dependency: transitive - description: - name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 - url: "https://pub.dev" - source: hosted - version: "1.2.2" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360" - url: "https://pub.dev" - source: hosted - version: "4.1.1" - image: - dependency: transitive - description: - name: image - sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" - url: "https://pub.dev" - source: hosted - version: "4.5.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - keep_screen_on: - dependency: "direct main" - description: - name: keep_screen_on - sha256: "374405358a3229b0e1041b6e390ff4c74e73fbd21075298042044e0c84b5574c" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - keep_screen_on_platform_interface: - dependency: transitive - description: - name: keep_screen_on_platform_interface - sha256: "065a0811407a970027c7530f9b8f36d11c89f36aab85b4b5acdacfe2cf3a8568" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.dev" - source: hosted - version: "10.0.7" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.dev" - source: hosted - version: "3.0.8" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.dev" - source: hosted - version: "5.1.1" - matcher: - dependency: transitive - description: - name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" - source: hosted - version: "0.12.16+1" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - meta: - dependency: transitive - description: - name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev" - source: hosted - version: "1.15.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - package_info_plus: - dependency: transitive - description: - name: package_info_plus - sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d" - url: "https://pub.dev" - source: hosted - version: "8.1.2" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b - url: "https://pub.dev" - source: hosted - version: "3.0.2" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" - url: "https://pub.dev" - source: hosted - version: "11.3.1" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" - url: "https://pub.dev" - source: hosted - version: "12.0.13" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 - url: "https://pub.dev" - source: hosted - version: "9.4.5" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 - url: "https://pub.dev" - source: hosted - version: "4.2.3" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" - source: hosted - version: "6.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a - url: "https://pub.dev" - source: hosted - version: "6.0.1" - provider: - dependency: transitive - description: - name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" - source: hosted - version: "6.1.2" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev" - source: hosted - version: "1.12.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev" - source: hosted - version: "0.7.3" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" - url: "https://pub.dev" - source: hosted - version: "6.3.1" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" - url: "https://pub.dev" - source: hosted - version: "6.3.14" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" - url: "https://pub.dev" - source: hosted - version: "6.3.2" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.dev" - source: hosted - version: "3.2.2" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" - url: "https://pub.dev" - source: hosted - version: "2.3.3" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" - url: "https://pub.dev" - source: hosted - version: "3.1.3" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - video_player: - dependency: "direct main" - description: - name: video_player - sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" - url: "https://pub.dev" - source: hosted - version: "2.9.2" - video_player_android: - dependency: transitive - description: - name: video_player_android - sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" - url: "https://pub.dev" - source: hosted - version: "2.7.16" - video_player_avfoundation: - dependency: transitive - description: - name: video_player_avfoundation - sha256: "33224c19775fd244be2d6e3dbd8e1826ab162877bd61123bf71890772119a2b7" - url: "https://pub.dev" - source: hosted - version: "2.6.5" - video_player_platform_interface: - dependency: transitive - description: - name: video_player_platform_interface - sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" - url: "https://pub.dev" - source: hosted - version: "6.2.3" - video_player_web: - dependency: transitive - description: - name: video_player_web - sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" - url: "https://pub.dev" - source: hosted - version: "2.3.3" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.dev" - source: hosted - version: "14.3.0" - wakelock_plus: - dependency: transitive - description: - name: wakelock_plus - sha256: "36c88af0b930121941345306d259ec4cc4ecca3b151c02e3a9e71aede83c615e" - url: "https://pub.dev" - source: hosted - version: "1.2.10" - wakelock_plus_platform_interface: - dependency: transitive - description: - name: wakelock_plus_platform_interface - sha256: "70e780bc99796e1db82fe764b1e7dcb89a86f1e5b3afb1db354de50f2e41eb7a" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - web: - dependency: transitive - description: - name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.dev" - source: hosted - version: "1.1.0" - win32: - dependency: transitive - description: - name: win32 - sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69" - url: "https://pub.dev" - source: hosted - version: "5.9.0" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.24.0" diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.yaml b/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.yaml deleted file mode 100644 index 9b2e5e3..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/pubspec.yaml +++ /dev/null @@ -1,97 +0,0 @@ -name: media3_exoplayer_creator -description: "ExoPlayer Creator that supports Media3" -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 - -environment: - sdk: ^3.6.0 - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. -dependencies: - flutter: - sdk: flutter - video_player: ^2.9.2 # Make sure to check for the latest version - chewie: ^1.8.5 # Optional, if you want to use a higher-level video player with controls - keep_screen_on: ^3.0.0 # Add this line - file_picker: ^8.1.7 # Use the latest version - permission_handler: ^11.3.1 - url_launcher: ^6.3.1 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_launcher_icons: ^0.13.1 - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^5.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec -flutter_launcher_icons: - android: true - ios: true - image_path: "assets/icon.png" - -# The following section is specific to Flutter packages. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons ina - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - assets: - - assets/ani.png - - assets/icon.png - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package - diff --git a/flutter-exoplayer/flutter_beta_exoplayer_creator/test/widget_test.dart b/flutter-exoplayer/flutter_beta_exoplayer_creator/test/widget_test.dart deleted file mode 100644 index 886e971..0000000 --- a/flutter-exoplayer/flutter_beta_exoplayer_creator/test/widget_test.dart +++ /dev/null @@ -1 +0,0 @@ -// useless \ No newline at end of file