├── ios
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ └── project.pbxproj
└── .gitignore
├── fonts
├── Jura-Bold.ttf
├── Jura-Light.ttf
├── Jura-Medium.ttf
├── Jura-Regular.ttf
└── Jura-SemiBold.ttf
├── graphics
├── default.png
├── icon
│ ├── icon.png
│ └── mstream.png
└── mstream-logo.png
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ └── values
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── mstream_music
│ │ │ │ │ └── MainActivity.kt
│ │ │ ├── java
│ │ │ │ └── io
│ │ │ │ │ └── flutter
│ │ │ │ │ └── addfluttertoandroid
│ │ │ │ │ └── MyApplication.java
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── build.gradle
└── settings.gradle
├── .metadata
├── .vscode
└── launch.json
├── lib
├── objects
│ ├── download_tracker.dart
│ ├── metadata.dart
│ ├── server.dart
│ └── display_item.dart
├── singletons
│ ├── media.dart
│ ├── transcode.dart
│ ├── file_explorer.dart
│ ├── downloads.dart
│ ├── browser_list.dart
│ ├── server_list.dart
│ └── api.dart
├── screens
│ ├── about_screen.dart
│ ├── metadata_screen.dart
│ ├── downloads.dart
│ ├── manage_server.dart
│ ├── auto_dj.dart
│ ├── add_server.dart
│ └── browser.dart
└── media
│ ├── common.dart
│ └── audio_stuff.dart
├── README.md
├── test
└── widget_test.dart
├── pubspec.yaml
├── .gitignore
└── pubspec.lock
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/fonts/Jura-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/fonts/Jura-Bold.ttf
--------------------------------------------------------------------------------
/fonts/Jura-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/fonts/Jura-Light.ttf
--------------------------------------------------------------------------------
/graphics/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/graphics/default.png
--------------------------------------------------------------------------------
/fonts/Jura-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/fonts/Jura-Medium.ttf
--------------------------------------------------------------------------------
/fonts/Jura-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/fonts/Jura-Regular.ttf
--------------------------------------------------------------------------------
/graphics/icon/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/graphics/icon/icon.png
--------------------------------------------------------------------------------
/fonts/Jura-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/fonts/Jura-SemiBold.ttf
--------------------------------------------------------------------------------
/graphics/icon/mstream.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/graphics/icon/mstream.png
--------------------------------------------------------------------------------
/graphics/mstream-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/graphics/mstream-logo.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | android.enableR8=true
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/IrosTheBeggar/mstream_music/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/mstream_music/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.mstream_music
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "mstream_music",
9 | "request": "launch",
10 | "type": "dart"
11 | }
12 | ]
13 | }
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | allprojects {
2 | repositories {
3 | google()
4 | jcenter()
5 | }
6 | }
7 |
8 | rootProject.buildDir = '../build'
9 | subprojects {
10 | project.buildDir = "${rootProject.buildDir}/${project.name}"
11 | }
12 | subprojects {
13 | project.evaluationDependsOn(':app')
14 | }
15 |
16 | tasks.register("clean", Delete) {
17 | delete rootProject.buildDir
18 | }
--------------------------------------------------------------------------------
/lib/objects/download_tracker.dart:
--------------------------------------------------------------------------------
1 | import 'display_item.dart';
2 |
3 | class DownloadTracker {
4 | String serverUrl;
5 | String filePath;
6 |
7 | int progress = 0;
8 |
9 | // These can be set to update downlaod progress for a particular item
10 | // you should always check if these exist before using them
11 | late DisplayItem? referenceDisplayItem;
12 |
13 | DownloadTracker(this.serverUrl, this.filePath);
14 | }
15 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # mstream_music
2 |
3 | A new Flutter project.
4 |
5 | ## Getting Started
6 |
7 | This project is a starting point for a Flutter application.
8 |
9 | A few resources to get you started if this is your first Flutter project:
10 |
11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
13 |
14 | For help getting started with Flutter, view our
15 | [online documentation](https://flutter.dev/docs), which offers tutorials,
16 | samples, guidance on mobile development, and a full API reference.
17 |
--------------------------------------------------------------------------------
/lib/singletons/media.dart:
--------------------------------------------------------------------------------
1 | import 'package:audio_service/audio_service.dart';
2 | import '../media/audio_stuff.dart';
3 |
4 | class MediaManager {
5 | MediaManager._privateConstructor();
6 | static final MediaManager _instance = MediaManager._privateConstructor();
7 | factory MediaManager() {
8 | return _instance;
9 | }
10 |
11 | late AudioHandler audioHandler;
12 |
13 | start() async {
14 | audioHandler = await AudioService.init(
15 | builder: () => AudioPlayerHandler(),
16 | config: AudioServiceConfig(
17 | androidNotificationChannelName: 'mStream Music',
18 | androidNotificationOngoing: true,
19 | ),
20 | );
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/lib/singletons/transcode.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'package:rxdart/rxdart.dart';
3 |
4 | class TranscodeManager {
5 | bool transcodeOn = false;
6 |
7 | late final BehaviorSubject _transcodeOnStream =
8 | BehaviorSubject.seeded(transcodeOn);
9 |
10 | TranscodeManager._privateConstructor();
11 | static final TranscodeManager _instance =
12 | TranscodeManager._privateConstructor();
13 |
14 | factory TranscodeManager() {
15 | return _instance;
16 | }
17 |
18 | void dispose() {
19 | _transcodeOnStream.close();
20 | } //initializes the subject with element already;
21 |
22 | Stream get curentServerStream => _transcodeOnStream.stream;
23 | }
24 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | def flutterSdkPath = {
3 | def properties = new Properties()
4 | file("local.properties").withInputStream { properties.load(it) }
5 | def flutterSdkPath = properties.getProperty("flutter.sdk")
6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7 | return flutterSdkPath
8 | }()
9 |
10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11 |
12 | repositories {
13 | google()
14 | mavenCentral()
15 | gradlePluginPortal()
16 | }
17 | }
18 |
19 | plugins {
20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0"
21 | id "com.android.application" version "7.2.0" apply false
22 | id "org.jetbrains.kotlin.android" version "1.7.20" apply false
23 | }
24 |
25 | include ":app"
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/objects/metadata.dart:
--------------------------------------------------------------------------------
1 | class MusicMetadata {
2 | String hash;
3 |
4 | String? artist;
5 | String? album;
6 | String? title;
7 | int? track;
8 | int? disc;
9 | int? year;
10 | int? rating;
11 | String? albumArt;
12 |
13 | MusicMetadata(this.artist, this.album, this.title, this.track, this.disc,
14 | this.year, this.hash, this.rating, this.albumArt);
15 |
16 | MusicMetadata.fromJson(Map json)
17 | : artist = json['artist'],
18 | album = json['album'],
19 | title = json['title'],
20 | track = json['track'],
21 | disc = json['disc'],
22 | year = json['year'],
23 | hash = json['hash'],
24 | rating = json['rating'],
25 | albumArt = json['albumArt'];
26 |
27 | Map toJson() => {
28 | 'artist': artist,
29 | 'album': album,
30 | 'title': title,
31 | 'track': track,
32 | 'disc': disc,
33 | 'year': year,
34 | 'hash': hash,
35 | 'rating': rating,
36 | 'albumArt': albumArt,
37 | };
38 | }
39 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:mstream_music/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MStreamApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/lib/objects/server.dart:
--------------------------------------------------------------------------------
1 | class Server {
2 | String url;
3 | String localname; // name we use when mappings files to the fs
4 | bool saveToSdCard = false;
5 |
6 | // authentication is optional (mstream servers can be public OR private)
7 | String? username;
8 | String? password;
9 | String? jwt;
10 |
11 | // Auto DJ
12 | int? autoDJminRating;
13 | Map autoDJPaths = {};
14 | List playlists = [];
15 |
16 | Server(this.url, this.username, this.password, this.jwt, this.localname);
17 |
18 | Server.fromJson(Map json)
19 | : url = json['url'],
20 | jwt = json['jwt'],
21 | username = json['username'],
22 | password = json['password'],
23 | localname = json['localname'],
24 | autoDJPaths = json['autoDJPaths']?.cast() ?? {},
25 | autoDJminRating = json['autoDJminRating'],
26 | playlists = List.from(json['playlists']) ?? [],
27 | saveToSdCard = json['saveToSdCard'] ?? false;
28 |
29 | Map toJson() => {
30 | 'url': url,
31 | 'jwt': jwt,
32 | 'username': username,
33 | 'password': password,
34 | 'localname': localname,
35 | 'autoDJPaths': autoDJPaths,
36 | 'autoDJminRating': autoDJminRating,
37 | 'playlists': playlists,
38 | 'saveToSdCard': saveToSdCard
39 | };
40 | }
41 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lib/screens/about_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AboutScreen extends StatelessWidget {
4 | @override
5 | Widget build(BuildContext context) {
6 | return Scaffold(
7 | appBar: AppBar(
8 | title: Text("About"),
9 | ),
10 | body: Container(
11 | padding: EdgeInsets.all(40.0),
12 | child: ListView(children: [
13 | Image(image: AssetImage('graphics/mstream-logo.png')),
14 | Container(
15 | height: 15,
16 | ),
17 | Text('mStream Mobile v0.12',
18 | style: TextStyle(
19 | fontFamily: 'Jura',
20 | color: Color(0xFF000000),
21 | fontWeight: FontWeight.bold,
22 | fontSize: 20)),
23 | Container(
24 | height: 45,
25 | ),
26 | Text('Developed By:',
27 | style: TextStyle(
28 | fontFamily: 'Jura',
29 | color: Color(0xFF000000),
30 | fontWeight: FontWeight.bold,
31 | fontSize: 20)),
32 | Text('Paul Sori',
33 | style: TextStyle(
34 | fontFamily: 'Jura',
35 | color: Color(0xFF000000),
36 | fontWeight: FontWeight.bold,
37 | fontSize: 20)),
38 | Text('paul@mstream.io',
39 | style: TextStyle(
40 | fontFamily: 'Jura',
41 | color: Color(0xFF000000),
42 | fontWeight: FontWeight.bold,
43 | fontSize: 20)),
44 | ])));
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSMicrophoneUsageDescription
6 | mStream does not use the microphone
7 | UIBackgroundModes
8 |
9 | audio
10 |
11 | CFBundleDevelopmentRegion
12 | $(DEVELOPMENT_LANGUAGE)
13 | CFBundleExecutable
14 | $(EXECUTABLE_NAME)
15 | CFBundleIdentifier
16 | $(PRODUCT_BUNDLE_IDENTIFIER)
17 | CFBundleInfoDictionaryVersion
18 | 6.0
19 | CFBundleName
20 | mstream_music
21 | CFBundlePackageType
22 | APPL
23 | CFBundleShortVersionString
24 | $(FLUTTER_BUILD_NAME)
25 | CFBundleSignature
26 | ????
27 | CFBundleVersion
28 | $(FLUTTER_BUILD_NUMBER)
29 | LSRequiresIPhoneOS
30 |
31 | UILaunchStoryboardName
32 | LaunchScreen
33 | UIMainStoryboardFile
34 | Main
35 | UISupportedInterfaceOrientations
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationLandscapeLeft
39 | UIInterfaceOrientationLandscapeRight
40 |
41 | UISupportedInterfaceOrientations~ipad
42 |
43 | UIInterfaceOrientationPortrait
44 | UIInterfaceOrientationPortraitUpsideDown
45 | UIInterfaceOrientationLandscapeLeft
46 | UIInterfaceOrientationLandscapeRight
47 |
48 | UIViewControllerBasedStatusBarAppearance
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/lib/screens/metadata_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import '../objects/metadata.dart';
3 |
4 | class MeteDataScreen extends StatelessWidget {
5 | // In the constructor, require a Todo.
6 | const MeteDataScreen({Key? key, required this.meta, required this.path})
7 | : super(key: key);
8 |
9 | // Declare a field that holds the Todo.
10 | final MusicMetadata meta;
11 |
12 | final String? path;
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | backgroundColor: Color(0xFF3f3f3f),
18 | appBar: AppBar(
19 | title: Text("Song Info"),
20 | ),
21 | body: Container(
22 | // padding: EdgeInsets.all(20.0),
23 | child: ListView(children: [
24 | if (meta.albumArt != null) ...[Image.network(meta.albumArt!)],
25 | Container(height: 20),
26 | if (meta.title != null) ...[
27 | Container(
28 | padding: EdgeInsets.symmetric(horizontal: 20.0),
29 | child: Text(meta.title!)),
30 | ],
31 | if (meta.artist != null) ...[
32 | Container(
33 | padding: EdgeInsets.symmetric(horizontal: 20.0),
34 | child: Text(meta.artist!))
35 | ],
36 | if (meta.album != null) ...[
37 | Container(
38 | padding: EdgeInsets.symmetric(horizontal: 20.0),
39 | child: Text(meta.album!)),
40 | ],
41 | if (meta.year != null) ...[
42 | Container(
43 | padding: EdgeInsets.symmetric(horizontal: 20.0),
44 | child: Text(meta.year!.toString()))
45 | ],
46 | Container(height: 20),
47 | if (path != null) ...[
48 | Container(
49 | padding: EdgeInsets.symmetric(horizontal: 20.0),
50 | child: Text(path!))
51 | ]
52 | ])));
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/android/app/src/main/java/io/flutter/addfluttertoandroid/MyApplication.java:
--------------------------------------------------------------------------------
1 | package com.example.mstream_music;
2 |
3 | import android.app.Application;
4 | import java.security.KeyStore;
5 | import javax.net.ssl.*;
6 | import java.security.cert.*;
7 | import java.io.IOException;
8 | import java.security.KeyManagementException;
9 | import java.security.NoSuchAlgorithmException;
10 |
11 | public class MyApplication extends Application {
12 | @Override
13 | public void onCreate() {
14 | super.onCreate();
15 | disableSSLCertificateChecking();
16 | }
17 |
18 | private static void disableSSLCertificateChecking() {
19 | TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
20 | public X509Certificate[] getAcceptedIssuers() {
21 | return null;
22 | }
23 |
24 | @Override
25 | public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
26 | // Not implemented
27 | }
28 |
29 | @Override
30 | public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
31 | // Not implemented
32 | }
33 | }};
34 |
35 | try {
36 | SSLContext sc = SSLContext.getInstance("TLS");
37 |
38 | sc.init(null, trustAllCerts, new java.security.SecureRandom());
39 |
40 | HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
41 |
42 | HttpsURLConnection.setDefaultHostnameVerifier(
43 | new HostnameVerifier() {
44 | @Override
45 | public boolean verify(String s, SSLSession sslSession) {
46 | return true;
47 | }
48 | }
49 | );
50 | } catch (KeyManagementException e) {
51 | e.printStackTrace();
52 | } catch (NoSuchAlgorithmException e) {
53 | e.printStackTrace();
54 | }
55 | }
56 | }
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id "com.android.application"
3 | id "kotlin-android"
4 | id "dev.flutter.flutter-gradle-plugin"
5 | }
6 |
7 | def localProperties = new Properties()
8 | def localPropertiesFile = rootProject.file('local.properties')
9 | if (localPropertiesFile.exists()) {
10 | localPropertiesFile.withReader('UTF-8') { reader ->
11 | localProperties.load(reader)
12 | }
13 | }
14 |
15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
16 | if (flutterVersionCode == null) {
17 | flutterVersionCode = '1'
18 | }
19 |
20 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
21 | if (flutterVersionName == null) {
22 | flutterVersionName = '1.0'
23 | }
24 |
25 | def keystoreProperties = new Properties()
26 | def keystorePropertiesFile = rootProject.file('key.properties')
27 | if (keystorePropertiesFile.exists()) {
28 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
29 | }
30 |
31 | android {
32 | compileSdkVersion 34
33 |
34 | sourceSets {
35 | main.java.srcDirs += 'src/main/kotlin'
36 | }
37 |
38 | lintOptions {
39 | disable 'InvalidPackage'
40 | }
41 |
42 | defaultConfig {
43 | applicationId "mstream.music"
44 | minSdkVersion flutter.minSdkVersion
45 | targetSdkVersion 34
46 | versionCode flutterVersionCode.toInteger()
47 | versionName flutterVersionName
48 | multiDexEnabled true
49 | }
50 |
51 | signingConfigs {
52 | release {
53 | keyAlias keystoreProperties['keyAlias']
54 | keyPassword keystoreProperties['keyPassword']
55 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
56 | storePassword keystoreProperties['storePassword']
57 | }
58 | }
59 | buildTypes {
60 | release {
61 | signingConfig signingConfigs.release
62 | }
63 | }
64 | }
65 |
66 | flutter {
67 | source '../..'
68 | }
69 |
70 | dependencies {
71 | implementation 'com.android.support:multidex:1.0.3'
72 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20"
73 | }
74 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: mstream_music
2 | description: A music streaming app for mStream Server
3 |
4 | # The following line prevents the package from being accidentally published to
5 | # pub.dev using `pub publish`. This is preferred for private packages.
6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7 |
8 | # The following defines the version and build number for your application.
9 | # A version number is three numbers separated by dots, like 1.2.43
10 | # followed by an optional build number separated by a +.
11 | # Both the version and the builder number may be overridden in flutter
12 | # build by specifying --build-name and --build-number, respectively.
13 | # In Android, build-name is used as versionName while build-number used as versionCode.
14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
16 | # Read more about iOS versioning at
17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18 | version: 0.14.0+25
19 |
20 | environment:
21 | sdk: ">=2.15.1 <3.0.0"
22 |
23 | dependencies:
24 | flutter:
25 | sdk: flutter
26 | http: ^1.2.2
27 | uuid: ^4.5.0
28 | rxdart: ^0.28.0
29 | disk_space: ^0.2.1
30 | path_provider: ^2.1.4
31 | audio_session: ^0.1.21
32 | audio_service: ^0.18.15
33 | just_audio: ^0.9.40
34 | flutter_slidable: ^0.6.0
35 | flutter_downloader: ^1.11.8
36 | flutter_launcher_icons: ^0.13.1
37 | flutter_barcode_scanner: ^2.0.0
38 | cupertino_icons: ^1.0.8
39 | path: any
40 | dev_dependencies:
41 | flutter_test:
42 | sdk: flutter
43 |
44 | flutter_icons:
45 | android: true
46 | ios: true
47 | image_path_android: "graphics/icon/icon.png"
48 | image_path_ios: "graphics/icon/mstream.png"
49 |
50 | # For information on the generic Dart part of this file, see the
51 | # following page: https://dart.dev/tools/pub/pubspec
52 |
53 | # The following section is specific to Flutter.
54 | flutter:
55 | assets:
56 | - graphics/mstream-logo.png
57 | - graphics/default.png
58 | # The following line ensures that the Material Icons font is
59 | # included with your application, so that you can use the icons in
60 | # the material Icons class.
61 | uses-material-design: true
62 |
63 | # To add assets to your application, add an assets section, like this:
64 | # assets:
65 | # - images/a_dot_burr.jpeg
66 | # - images/a_dot_ham.jpeg
67 |
68 | # An image asset can refer to one or more resolution-specific "variants", see
69 | # https://flutter.dev/assets-and-images/#resolution-aware.
70 |
71 | # For details regarding adding assets from package dependencies, see
72 | # https://flutter.dev/assets-and-images/#from-packages
73 |
74 | fonts:
75 | - family: Jura
76 | fonts:
77 | - asset: fonts/Jura-Bold.ttf
78 | weight: 700
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/lib/screens/downloads.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:disk_space/disk_space.dart';
3 |
4 | import '../singletons/downloads.dart';
5 | import '../objects/download_tracker.dart';
6 |
7 | class DownloadScreen extends StatelessWidget {
8 | Widget build(BuildContext context) {
9 | return Scaffold(
10 | appBar: AppBar(
11 | title: Text("Downloads"),
12 | ),
13 | body: Column(children: [
14 | Card(
15 | child: Column(
16 | mainAxisSize: MainAxisSize.min,
17 | children: [
18 | Text(
19 | 'Total Storage Space (in MiB)',
20 | style: TextStyle(
21 | color: Colors.blue,
22 | ),
23 | ),
24 | FutureBuilder(
25 | future: DiskSpace.getTotalDiskSpace,
26 | builder: (BuildContext _, AsyncSnapshot snapshot) {
27 | print(snapshot.data.toString());
28 | return Text(
29 | snapshot.data.toString(),
30 | style: TextStyle(
31 | color: Colors.blue,
32 | ),
33 | );
34 | },
35 | )
36 | ],
37 | )),
38 | Expanded(
39 | child: SizedBox(
40 | child: StreamBuilder