file picker, permissions and app metadata
This commit is contained in:
parent
53112c2c1b
commit
b1ecb3dc9a
19 changed files with 446 additions and 191 deletions
|
@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
|
|||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
compileSdkVersion 29
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
|
@ -38,9 +38,9 @@ android {
|
|||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.mucke"
|
||||
applicationId "rocks.mucke"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 28
|
||||
targetSdkVersion 29
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.mucke">
|
||||
package="rocks.mucke">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mucke">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="rocks.mucke">
|
||||
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
calls FlutterMain.startInitialization(this); in its onCreate method.
|
||||
In most cases you can leave this as-is, but you if you want to provide
|
||||
|
@ -6,7 +6,7 @@
|
|||
FlutterApplication and put your custom class here. -->
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<application android:name="io.flutter.app.FlutterApplication" android:label="mucke" android:icon="@mipmap/ic_launcher">
|
||||
<application android:name="io.flutter.app.FlutterApplication" android:label="mucke" android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true">
|
||||
<activity android:name="com.ryanheise.audioservice.AudioServiceActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.example.mucke
|
||||
package rocks.mucke
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.mucke">
|
||||
package="rocks.mucke">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
|
|
@ -6,7 +6,7 @@ buildscript {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.0'
|
||||
classpath 'com.android.tools.build:gradle:3.6.3'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
|
||||
|
|
|
@ -320,7 +320,7 @@
|
|||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.mucke;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rocks.mucke;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
@ -454,7 +454,7 @@
|
|||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.mucke;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rocks.mucke;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
|
@ -481,7 +481,7 @@
|
|||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.mucke;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rocks.mucke;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
@ -44,9 +46,7 @@ class SettingsPage extends StatelessWidget {
|
|||
}
|
||||
return const Text('');
|
||||
}),
|
||||
onTap: () {
|
||||
store.updateDatabase();
|
||||
},
|
||||
onTap: () => store.updateDatabase(),
|
||||
trailing: Observer(builder: (_) {
|
||||
if (store.isUpdatingDatabase) {
|
||||
return const CircularProgressIndicator();
|
||||
|
@ -63,7 +63,7 @@ class SettingsPage extends StatelessWidget {
|
|||
ListTile(
|
||||
title: const Text('Select library folders'),
|
||||
trailing: const Icon(Icons.chevron_right),
|
||||
onTap: () {},
|
||||
onTap: () => _openFilePicker(),
|
||||
),
|
||||
const Divider(
|
||||
height: 4.0,
|
||||
|
@ -71,4 +71,15 @@ class SettingsPage extends StatelessWidget {
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _openFilePicker() async {
|
||||
try {
|
||||
var _path = await FilePicker.platform.getDirectoryPath();
|
||||
print(_path);
|
||||
} on PlatformException catch (e) {
|
||||
print('Unsupported operation' + e.toString());
|
||||
} catch (ex) {
|
||||
print(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -125,41 +125,6 @@ mixin _$AudioStore on _AudioStore, Store {
|
|||
});
|
||||
}
|
||||
|
||||
final _$playSongAsyncAction = AsyncAction('_AudioStore.playSong');
|
||||
|
||||
@override
|
||||
Future<void> playSong(int index, List<Song> songList) {
|
||||
return _$playSongAsyncAction.run(() => super.playSong(index, songList));
|
||||
}
|
||||
|
||||
final _$playAsyncAction = AsyncAction('_AudioStore.play');
|
||||
|
||||
@override
|
||||
Future<void> play() {
|
||||
return _$playAsyncAction.run(() => super.play());
|
||||
}
|
||||
|
||||
final _$pauseAsyncAction = AsyncAction('_AudioStore.pause');
|
||||
|
||||
@override
|
||||
Future<void> pause() {
|
||||
return _$pauseAsyncAction.run(() => super.pause());
|
||||
}
|
||||
|
||||
final _$skipToNextAsyncAction = AsyncAction('_AudioStore.skipToNext');
|
||||
|
||||
@override
|
||||
Future<void> skipToNext() {
|
||||
return _$skipToNextAsyncAction.run(() => super.skipToNext());
|
||||
}
|
||||
|
||||
final _$skipToPreviousAsyncAction = AsyncAction('_AudioStore.skipToPrevious');
|
||||
|
||||
@override
|
||||
Future<void> skipToPrevious() {
|
||||
return _$skipToPreviousAsyncAction.run(() => super.skipToPrevious());
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return '''
|
||||
|
|
|
@ -95,7 +95,7 @@ class AudioPlayerImpl implements AudioPlayer {
|
|||
|
||||
@override
|
||||
Future<void> loadQueue({List<QueueItemModel> queue, int initialIndex = 0}) async {
|
||||
if (queue == null || initialIndex >= queue.length) {
|
||||
if (queue == null || initialIndex == null || initialIndex >= queue.length) {
|
||||
return;
|
||||
}
|
||||
_queue = queue;
|
||||
|
|
|
@ -24,8 +24,7 @@ class LocalMusicFetcherImpl implements LocalMusicFetcher {
|
|||
|
||||
@override
|
||||
Future<List<ArtistModel>> getArtists() async {
|
||||
final List<ArtistInfo> artistInfoList =
|
||||
await _flutterAudioQuery.getArtists();
|
||||
final List<ArtistInfo> artistInfoList = await _flutterAudioQuery.getArtists();
|
||||
return artistInfoList
|
||||
.map((ArtistInfo artistInfo) => ArtistModel.fromArtistInfo(artistInfo))
|
||||
.toSet()
|
||||
|
@ -35,9 +34,7 @@ class LocalMusicFetcherImpl implements LocalMusicFetcher {
|
|||
@override
|
||||
Future<List<AlbumModel>> getAlbums() async {
|
||||
final List<AlbumInfo> albumInfoList = await _flutterAudioQuery.getAlbums();
|
||||
return albumInfoList
|
||||
.map((AlbumInfo albumInfo) => AlbumModel.fromAlbumInfo(albumInfo))
|
||||
.toList();
|
||||
return albumInfoList.map((AlbumInfo albumInfo) => AlbumModel.fromAlbumInfo(albumInfo)).toList();
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -11,8 +11,10 @@ import '../player_state_data_source.dart';
|
|||
|
||||
part 'player_state_dao.g.dart';
|
||||
|
||||
@UseDao(tables: [Songs, QueueEntries, PlayerState])
|
||||
class PlayerStateDao extends DatabaseAccessor<MoorMusicDataSource> with _$PlayerStateDaoMixin implements PlayerStateDataSource {
|
||||
@UseDao(tables: [Songs, QueueEntries, PersistentIndex, PersistentShuffleMode, PersistentLoopMode])
|
||||
class PlayerStateDao extends DatabaseAccessor<MoorMusicDataSource>
|
||||
with _$PlayerStateDaoMixin
|
||||
implements PlayerStateDataSource {
|
||||
PlayerStateDao(MoorMusicDataSource db) : super(db);
|
||||
|
||||
@override
|
||||
|
@ -62,46 +64,52 @@ class PlayerStateDao extends DatabaseAccessor<MoorMusicDataSource> with _$Player
|
|||
|
||||
@override
|
||||
Stream<int> get currentIndexStream {
|
||||
return select(playerState).watchSingle().map((event) => event.index);
|
||||
return select(persistentIndex).watchSingle().map((event) => event?.index);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setCurrentIndex(int index) async {
|
||||
final currentState = await select(playerState).getSingle();
|
||||
final currentState = await select(persistentIndex).getSingle();
|
||||
if (currentState != null) {
|
||||
update(playerState).write(PlayerStateCompanion(index: Value(index)));
|
||||
update(persistentIndex).write(PersistentIndexCompanion(index: Value(index)));
|
||||
} else {
|
||||
into(playerState).insert(PlayerStateCompanion(index: Value(index)));
|
||||
into(persistentIndex).insert(PersistentIndexCompanion(index: Value(index)));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Stream<LoopMode> get loopModeStream {
|
||||
return select(playerState).watchSingle().map((event) => event.loopMode.toLoopMode());
|
||||
return select(persistentLoopMode).watchSingle().map((event) => event?.loopMode?.toLoopMode());
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setLoopMode(LoopMode loopMode) async {
|
||||
final currentState = await select(playerState).getSingle();
|
||||
final currentState = await select(persistentLoopMode).getSingle();
|
||||
if (currentState != null) {
|
||||
update(playerState).write(PlayerStateCompanion(loopMode: Value(loopMode.toInt())));
|
||||
update(persistentLoopMode)
|
||||
.write(PersistentLoopModeCompanion(loopMode: Value(loopMode.toInt())));
|
||||
} else {
|
||||
into(playerState).insert(PlayerStateCompanion(loopMode: Value(loopMode.toInt())));
|
||||
into(persistentLoopMode)
|
||||
.insert(PersistentLoopModeCompanion(loopMode: Value(loopMode.toInt())));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setShuffleMode(ShuffleMode shuffleMode) async {
|
||||
final currentState = await select(playerState).getSingle();
|
||||
final currentState = await select(persistentShuffleMode).getSingle();
|
||||
if (currentState != null) {
|
||||
update(playerState).write(PlayerStateCompanion(shuffleMode: Value(shuffleMode.toInt())));
|
||||
update(persistentShuffleMode)
|
||||
.write(PersistentShuffleModeCompanion(shuffleMode: Value(shuffleMode.toInt())));
|
||||
} else {
|
||||
into(playerState).insert(PlayerStateCompanion(shuffleMode: Value(shuffleMode.toInt())));
|
||||
into(persistentShuffleMode)
|
||||
.insert(PersistentShuffleModeCompanion(shuffleMode: Value(shuffleMode.toInt())));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Stream<ShuffleMode> get shuffleModeStream {
|
||||
return select(playerState).watchSingle().map((event) => event.shuffleMode.toShuffleMode());
|
||||
return select(persistentShuffleMode)
|
||||
.watchSingle()
|
||||
.map((event) => event?.shuffleMode?.toShuffleMode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,5 +9,9 @@ part of 'player_state_dao.dart';
|
|||
mixin _$PlayerStateDaoMixin on DatabaseAccessor<MoorMusicDataSource> {
|
||||
$SongsTable get songs => attachedDatabase.songs;
|
||||
$QueueEntriesTable get queueEntries => attachedDatabase.queueEntries;
|
||||
$PlayerStateTable get playerState => attachedDatabase.playerState;
|
||||
$PersistentIndexTable get persistentIndex => attachedDatabase.persistentIndex;
|
||||
$PersistentShuffleModeTable get persistentShuffleMode =>
|
||||
attachedDatabase.persistentShuffleMode;
|
||||
$PersistentLoopModeTable get persistentLoopMode =>
|
||||
attachedDatabase.persistentLoopMode;
|
||||
}
|
||||
|
|
|
@ -66,14 +66,32 @@ class QueueEntries extends Table {
|
|||
Set<Column> get primaryKey => {index};
|
||||
}
|
||||
|
||||
@DataClassName('PersistentPlayerState')
|
||||
class PlayerState extends Table {
|
||||
IntColumn get index => integer()();
|
||||
class PersistentIndex extends Table {
|
||||
IntColumn get index => integer().nullable()();
|
||||
}
|
||||
|
||||
class PersistentShuffleMode extends Table {
|
||||
IntColumn get shuffleMode => integer().withDefault(const Constant(0))();
|
||||
}
|
||||
|
||||
class PersistentLoopMode extends Table {
|
||||
IntColumn get loopMode => integer().withDefault(const Constant(0))();
|
||||
}
|
||||
|
||||
@UseMoor(tables: [Artists, Albums, Songs, QueueEntries, PlayerState], daos: [PlayerStateDao])
|
||||
@UseMoor(
|
||||
tables: [
|
||||
Artists,
|
||||
Albums,
|
||||
Songs,
|
||||
QueueEntries,
|
||||
PersistentIndex,
|
||||
PersistentShuffleMode,
|
||||
PersistentLoopMode,
|
||||
],
|
||||
daos: [
|
||||
PlayerStateDao,
|
||||
],
|
||||
)
|
||||
class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSource {
|
||||
/// Use MoorMusicDataSource in main isolate only.
|
||||
MoorMusicDataSource() : super(_openConnection());
|
||||
|
|
|
@ -1505,26 +1505,17 @@ class $QueueEntriesTable extends QueueEntries
|
|||
}
|
||||
}
|
||||
|
||||
class PersistentPlayerState extends DataClass
|
||||
implements Insertable<PersistentPlayerState> {
|
||||
class PersistentIndexData extends DataClass
|
||||
implements Insertable<PersistentIndexData> {
|
||||
final int index;
|
||||
final int shuffleMode;
|
||||
final int loopMode;
|
||||
PersistentPlayerState(
|
||||
{@required this.index,
|
||||
@required this.shuffleMode,
|
||||
@required this.loopMode});
|
||||
factory PersistentPlayerState.fromData(
|
||||
PersistentIndexData({this.index});
|
||||
factory PersistentIndexData.fromData(
|
||||
Map<String, dynamic> data, GeneratedDatabase db,
|
||||
{String prefix}) {
|
||||
final effectivePrefix = prefix ?? '';
|
||||
final intType = db.typeSystem.forDartType<int>();
|
||||
return PersistentPlayerState(
|
||||
return PersistentIndexData(
|
||||
index: intType.mapFromDatabaseResponse(data['${effectivePrefix}index']),
|
||||
shuffleMode: intType
|
||||
.mapFromDatabaseResponse(data['${effectivePrefix}shuffle_mode']),
|
||||
loopMode:
|
||||
intType.mapFromDatabaseResponse(data['${effectivePrefix}loop_mode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
|
@ -1533,35 +1524,21 @@ class PersistentPlayerState extends DataClass
|
|||
if (!nullToAbsent || index != null) {
|
||||
map['index'] = Variable<int>(index);
|
||||
}
|
||||
if (!nullToAbsent || shuffleMode != null) {
|
||||
map['shuffle_mode'] = Variable<int>(shuffleMode);
|
||||
}
|
||||
if (!nullToAbsent || loopMode != null) {
|
||||
map['loop_mode'] = Variable<int>(loopMode);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
PlayerStateCompanion toCompanion(bool nullToAbsent) {
|
||||
return PlayerStateCompanion(
|
||||
PersistentIndexCompanion toCompanion(bool nullToAbsent) {
|
||||
return PersistentIndexCompanion(
|
||||
index:
|
||||
index == null && nullToAbsent ? const Value.absent() : Value(index),
|
||||
shuffleMode: shuffleMode == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(shuffleMode),
|
||||
loopMode: loopMode == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(loopMode),
|
||||
);
|
||||
}
|
||||
|
||||
factory PersistentPlayerState.fromJson(Map<String, dynamic> json,
|
||||
factory PersistentIndexData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer serializer}) {
|
||||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return PersistentPlayerState(
|
||||
return PersistentIndexData(
|
||||
index: serializer.fromJson<int>(json['index']),
|
||||
shuffleMode: serializer.fromJson<int>(json['shuffleMode']),
|
||||
loopMode: serializer.fromJson<int>(json['loopMode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
|
@ -1569,71 +1546,47 @@ class PersistentPlayerState extends DataClass
|
|||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return <String, dynamic>{
|
||||
'index': serializer.toJson<int>(index),
|
||||
'shuffleMode': serializer.toJson<int>(shuffleMode),
|
||||
'loopMode': serializer.toJson<int>(loopMode),
|
||||
};
|
||||
}
|
||||
|
||||
PersistentPlayerState copyWith({int index, int shuffleMode, int loopMode}) =>
|
||||
PersistentPlayerState(
|
||||
PersistentIndexData copyWith({int index}) => PersistentIndexData(
|
||||
index: index ?? this.index,
|
||||
shuffleMode: shuffleMode ?? this.shuffleMode,
|
||||
loopMode: loopMode ?? this.loopMode,
|
||||
);
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PersistentPlayerState(')
|
||||
..write('index: $index, ')
|
||||
..write('shuffleMode: $shuffleMode, ')
|
||||
..write('loopMode: $loopMode')
|
||||
return (StringBuffer('PersistentIndexData(')
|
||||
..write('index: $index')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => $mrjf(
|
||||
$mrjc(index.hashCode, $mrjc(shuffleMode.hashCode, loopMode.hashCode)));
|
||||
int get hashCode => $mrjf(index.hashCode);
|
||||
@override
|
||||
bool operator ==(dynamic other) =>
|
||||
identical(this, other) ||
|
||||
(other is PersistentPlayerState &&
|
||||
other.index == this.index &&
|
||||
other.shuffleMode == this.shuffleMode &&
|
||||
other.loopMode == this.loopMode);
|
||||
(other is PersistentIndexData && other.index == this.index);
|
||||
}
|
||||
|
||||
class PlayerStateCompanion extends UpdateCompanion<PersistentPlayerState> {
|
||||
class PersistentIndexCompanion extends UpdateCompanion<PersistentIndexData> {
|
||||
final Value<int> index;
|
||||
final Value<int> shuffleMode;
|
||||
final Value<int> loopMode;
|
||||
const PlayerStateCompanion({
|
||||
const PersistentIndexCompanion({
|
||||
this.index = const Value.absent(),
|
||||
this.shuffleMode = const Value.absent(),
|
||||
this.loopMode = const Value.absent(),
|
||||
});
|
||||
PlayerStateCompanion.insert({
|
||||
@required int index,
|
||||
this.shuffleMode = const Value.absent(),
|
||||
this.loopMode = const Value.absent(),
|
||||
}) : index = Value(index);
|
||||
static Insertable<PersistentPlayerState> custom({
|
||||
PersistentIndexCompanion.insert({
|
||||
this.index = const Value.absent(),
|
||||
});
|
||||
static Insertable<PersistentIndexData> custom({
|
||||
Expression<int> index,
|
||||
Expression<int> shuffleMode,
|
||||
Expression<int> loopMode,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
if (index != null) 'index': index,
|
||||
if (shuffleMode != null) 'shuffle_mode': shuffleMode,
|
||||
if (loopMode != null) 'loop_mode': loopMode,
|
||||
});
|
||||
}
|
||||
|
||||
PlayerStateCompanion copyWith(
|
||||
{Value<int> index, Value<int> shuffleMode, Value<int> loopMode}) {
|
||||
return PlayerStateCompanion(
|
||||
PersistentIndexCompanion copyWith({Value<int> index}) {
|
||||
return PersistentIndexCompanion(
|
||||
index: index ?? this.index,
|
||||
shuffleMode: shuffleMode ?? this.shuffleMode,
|
||||
loopMode: loopMode ?? this.loopMode,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1643,31 +1596,23 @@ class PlayerStateCompanion extends UpdateCompanion<PersistentPlayerState> {
|
|||
if (index.present) {
|
||||
map['index'] = Variable<int>(index.value);
|
||||
}
|
||||
if (shuffleMode.present) {
|
||||
map['shuffle_mode'] = Variable<int>(shuffleMode.value);
|
||||
}
|
||||
if (loopMode.present) {
|
||||
map['loop_mode'] = Variable<int>(loopMode.value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PlayerStateCompanion(')
|
||||
..write('index: $index, ')
|
||||
..write('shuffleMode: $shuffleMode, ')
|
||||
..write('loopMode: $loopMode')
|
||||
return (StringBuffer('PersistentIndexCompanion(')
|
||||
..write('index: $index')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
||||
class $PlayerStateTable extends PlayerState
|
||||
with TableInfo<$PlayerStateTable, PersistentPlayerState> {
|
||||
class $PersistentIndexTable extends PersistentIndex
|
||||
with TableInfo<$PersistentIndexTable, PersistentIndexData> {
|
||||
final GeneratedDatabase _db;
|
||||
final String _alias;
|
||||
$PlayerStateTable(this._db, [this._alias]);
|
||||
$PersistentIndexTable(this._db, [this._alias]);
|
||||
final VerificationMeta _indexMeta = const VerificationMeta('index');
|
||||
GeneratedIntColumn _index;
|
||||
@override
|
||||
|
@ -1676,10 +1621,158 @@ class $PlayerStateTable extends PlayerState
|
|||
return GeneratedIntColumn(
|
||||
'index',
|
||||
$tableName,
|
||||
false,
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [index];
|
||||
@override
|
||||
$PersistentIndexTable get asDslTable => this;
|
||||
@override
|
||||
String get $tableName => _alias ?? 'persistent_index';
|
||||
@override
|
||||
final String actualTableName = 'persistent_index';
|
||||
@override
|
||||
VerificationContext validateIntegrity(
|
||||
Insertable<PersistentIndexData> instance,
|
||||
{bool isInserting = false}) {
|
||||
final context = VerificationContext();
|
||||
final data = instance.toColumns(true);
|
||||
if (data.containsKey('index')) {
|
||||
context.handle(
|
||||
_indexMeta, index.isAcceptableOrUnknown(data['index'], _indexMeta));
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@override
|
||||
Set<GeneratedColumn> get $primaryKey => <GeneratedColumn>{};
|
||||
@override
|
||||
PersistentIndexData map(Map<String, dynamic> data, {String tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
|
||||
return PersistentIndexData.fromData(data, _db, prefix: effectivePrefix);
|
||||
}
|
||||
|
||||
@override
|
||||
$PersistentIndexTable createAlias(String alias) {
|
||||
return $PersistentIndexTable(_db, alias);
|
||||
}
|
||||
}
|
||||
|
||||
class PersistentShuffleModeData extends DataClass
|
||||
implements Insertable<PersistentShuffleModeData> {
|
||||
final int shuffleMode;
|
||||
PersistentShuffleModeData({@required this.shuffleMode});
|
||||
factory PersistentShuffleModeData.fromData(
|
||||
Map<String, dynamic> data, GeneratedDatabase db,
|
||||
{String prefix}) {
|
||||
final effectivePrefix = prefix ?? '';
|
||||
final intType = db.typeSystem.forDartType<int>();
|
||||
return PersistentShuffleModeData(
|
||||
shuffleMode: intType
|
||||
.mapFromDatabaseResponse(data['${effectivePrefix}shuffle_mode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
if (!nullToAbsent || shuffleMode != null) {
|
||||
map['shuffle_mode'] = Variable<int>(shuffleMode);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
PersistentShuffleModeCompanion toCompanion(bool nullToAbsent) {
|
||||
return PersistentShuffleModeCompanion(
|
||||
shuffleMode: shuffleMode == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(shuffleMode),
|
||||
);
|
||||
}
|
||||
|
||||
factory PersistentShuffleModeData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer serializer}) {
|
||||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return PersistentShuffleModeData(
|
||||
shuffleMode: serializer.fromJson<int>(json['shuffleMode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Map<String, dynamic> toJson({ValueSerializer serializer}) {
|
||||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return <String, dynamic>{
|
||||
'shuffleMode': serializer.toJson<int>(shuffleMode),
|
||||
};
|
||||
}
|
||||
|
||||
PersistentShuffleModeData copyWith({int shuffleMode}) =>
|
||||
PersistentShuffleModeData(
|
||||
shuffleMode: shuffleMode ?? this.shuffleMode,
|
||||
);
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PersistentShuffleModeData(')
|
||||
..write('shuffleMode: $shuffleMode')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => $mrjf(shuffleMode.hashCode);
|
||||
@override
|
||||
bool operator ==(dynamic other) =>
|
||||
identical(this, other) ||
|
||||
(other is PersistentShuffleModeData &&
|
||||
other.shuffleMode == this.shuffleMode);
|
||||
}
|
||||
|
||||
class PersistentShuffleModeCompanion
|
||||
extends UpdateCompanion<PersistentShuffleModeData> {
|
||||
final Value<int> shuffleMode;
|
||||
const PersistentShuffleModeCompanion({
|
||||
this.shuffleMode = const Value.absent(),
|
||||
});
|
||||
PersistentShuffleModeCompanion.insert({
|
||||
this.shuffleMode = const Value.absent(),
|
||||
});
|
||||
static Insertable<PersistentShuffleModeData> custom({
|
||||
Expression<int> shuffleMode,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
if (shuffleMode != null) 'shuffle_mode': shuffleMode,
|
||||
});
|
||||
}
|
||||
|
||||
PersistentShuffleModeCompanion copyWith({Value<int> shuffleMode}) {
|
||||
return PersistentShuffleModeCompanion(
|
||||
shuffleMode: shuffleMode ?? this.shuffleMode,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
if (shuffleMode.present) {
|
||||
map['shuffle_mode'] = Variable<int>(shuffleMode.value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PersistentShuffleModeCompanion(')
|
||||
..write('shuffleMode: $shuffleMode')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
||||
class $PersistentShuffleModeTable extends PersistentShuffleMode
|
||||
with TableInfo<$PersistentShuffleModeTable, PersistentShuffleModeData> {
|
||||
final GeneratedDatabase _db;
|
||||
final String _alias;
|
||||
$PersistentShuffleModeTable(this._db, [this._alias]);
|
||||
final VerificationMeta _shuffleModeMeta =
|
||||
const VerificationMeta('shuffleMode');
|
||||
GeneratedIntColumn _shuffleMode;
|
||||
|
@ -1691,6 +1784,156 @@ class $PlayerStateTable extends PlayerState
|
|||
defaultValue: const Constant(0));
|
||||
}
|
||||
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [shuffleMode];
|
||||
@override
|
||||
$PersistentShuffleModeTable get asDslTable => this;
|
||||
@override
|
||||
String get $tableName => _alias ?? 'persistent_shuffle_mode';
|
||||
@override
|
||||
final String actualTableName = 'persistent_shuffle_mode';
|
||||
@override
|
||||
VerificationContext validateIntegrity(
|
||||
Insertable<PersistentShuffleModeData> instance,
|
||||
{bool isInserting = false}) {
|
||||
final context = VerificationContext();
|
||||
final data = instance.toColumns(true);
|
||||
if (data.containsKey('shuffle_mode')) {
|
||||
context.handle(
|
||||
_shuffleModeMeta,
|
||||
shuffleMode.isAcceptableOrUnknown(
|
||||
data['shuffle_mode'], _shuffleModeMeta));
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@override
|
||||
Set<GeneratedColumn> get $primaryKey => <GeneratedColumn>{};
|
||||
@override
|
||||
PersistentShuffleModeData map(Map<String, dynamic> data,
|
||||
{String tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
|
||||
return PersistentShuffleModeData.fromData(data, _db,
|
||||
prefix: effectivePrefix);
|
||||
}
|
||||
|
||||
@override
|
||||
$PersistentShuffleModeTable createAlias(String alias) {
|
||||
return $PersistentShuffleModeTable(_db, alias);
|
||||
}
|
||||
}
|
||||
|
||||
class PersistentLoopModeData extends DataClass
|
||||
implements Insertable<PersistentLoopModeData> {
|
||||
final int loopMode;
|
||||
PersistentLoopModeData({@required this.loopMode});
|
||||
factory PersistentLoopModeData.fromData(
|
||||
Map<String, dynamic> data, GeneratedDatabase db,
|
||||
{String prefix}) {
|
||||
final effectivePrefix = prefix ?? '';
|
||||
final intType = db.typeSystem.forDartType<int>();
|
||||
return PersistentLoopModeData(
|
||||
loopMode:
|
||||
intType.mapFromDatabaseResponse(data['${effectivePrefix}loop_mode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
if (!nullToAbsent || loopMode != null) {
|
||||
map['loop_mode'] = Variable<int>(loopMode);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
PersistentLoopModeCompanion toCompanion(bool nullToAbsent) {
|
||||
return PersistentLoopModeCompanion(
|
||||
loopMode: loopMode == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(loopMode),
|
||||
);
|
||||
}
|
||||
|
||||
factory PersistentLoopModeData.fromJson(Map<String, dynamic> json,
|
||||
{ValueSerializer serializer}) {
|
||||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return PersistentLoopModeData(
|
||||
loopMode: serializer.fromJson<int>(json['loopMode']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Map<String, dynamic> toJson({ValueSerializer serializer}) {
|
||||
serializer ??= moorRuntimeOptions.defaultSerializer;
|
||||
return <String, dynamic>{
|
||||
'loopMode': serializer.toJson<int>(loopMode),
|
||||
};
|
||||
}
|
||||
|
||||
PersistentLoopModeData copyWith({int loopMode}) => PersistentLoopModeData(
|
||||
loopMode: loopMode ?? this.loopMode,
|
||||
);
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PersistentLoopModeData(')
|
||||
..write('loopMode: $loopMode')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => $mrjf(loopMode.hashCode);
|
||||
@override
|
||||
bool operator ==(dynamic other) =>
|
||||
identical(this, other) ||
|
||||
(other is PersistentLoopModeData && other.loopMode == this.loopMode);
|
||||
}
|
||||
|
||||
class PersistentLoopModeCompanion
|
||||
extends UpdateCompanion<PersistentLoopModeData> {
|
||||
final Value<int> loopMode;
|
||||
const PersistentLoopModeCompanion({
|
||||
this.loopMode = const Value.absent(),
|
||||
});
|
||||
PersistentLoopModeCompanion.insert({
|
||||
this.loopMode = const Value.absent(),
|
||||
});
|
||||
static Insertable<PersistentLoopModeData> custom({
|
||||
Expression<int> loopMode,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
if (loopMode != null) 'loop_mode': loopMode,
|
||||
});
|
||||
}
|
||||
|
||||
PersistentLoopModeCompanion copyWith({Value<int> loopMode}) {
|
||||
return PersistentLoopModeCompanion(
|
||||
loopMode: loopMode ?? this.loopMode,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
final map = <String, Expression>{};
|
||||
if (loopMode.present) {
|
||||
map['loop_mode'] = Variable<int>(loopMode.value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return (StringBuffer('PersistentLoopModeCompanion(')
|
||||
..write('loopMode: $loopMode')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
|
||||
class $PersistentLoopModeTable extends PersistentLoopMode
|
||||
with TableInfo<$PersistentLoopModeTable, PersistentLoopModeData> {
|
||||
final GeneratedDatabase _db;
|
||||
final String _alias;
|
||||
$PersistentLoopModeTable(this._db, [this._alias]);
|
||||
final VerificationMeta _loopModeMeta = const VerificationMeta('loopMode');
|
||||
GeneratedIntColumn _loopMode;
|
||||
@override
|
||||
|
@ -1701,31 +1944,19 @@ class $PlayerStateTable extends PlayerState
|
|||
}
|
||||
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [index, shuffleMode, loopMode];
|
||||
List<GeneratedColumn> get $columns => [loopMode];
|
||||
@override
|
||||
$PlayerStateTable get asDslTable => this;
|
||||
$PersistentLoopModeTable get asDslTable => this;
|
||||
@override
|
||||
String get $tableName => _alias ?? 'player_state';
|
||||
String get $tableName => _alias ?? 'persistent_loop_mode';
|
||||
@override
|
||||
final String actualTableName = 'player_state';
|
||||
final String actualTableName = 'persistent_loop_mode';
|
||||
@override
|
||||
VerificationContext validateIntegrity(
|
||||
Insertable<PersistentPlayerState> instance,
|
||||
Insertable<PersistentLoopModeData> instance,
|
||||
{bool isInserting = false}) {
|
||||
final context = VerificationContext();
|
||||
final data = instance.toColumns(true);
|
||||
if (data.containsKey('index')) {
|
||||
context.handle(
|
||||
_indexMeta, index.isAcceptableOrUnknown(data['index'], _indexMeta));
|
||||
} else if (isInserting) {
|
||||
context.missing(_indexMeta);
|
||||
}
|
||||
if (data.containsKey('shuffle_mode')) {
|
||||
context.handle(
|
||||
_shuffleModeMeta,
|
||||
shuffleMode.isAcceptableOrUnknown(
|
||||
data['shuffle_mode'], _shuffleModeMeta));
|
||||
}
|
||||
if (data.containsKey('loop_mode')) {
|
||||
context.handle(_loopModeMeta,
|
||||
loopMode.isAcceptableOrUnknown(data['loop_mode'], _loopModeMeta));
|
||||
|
@ -1736,14 +1967,14 @@ class $PlayerStateTable extends PlayerState
|
|||
@override
|
||||
Set<GeneratedColumn> get $primaryKey => <GeneratedColumn>{};
|
||||
@override
|
||||
PersistentPlayerState map(Map<String, dynamic> data, {String tablePrefix}) {
|
||||
PersistentLoopModeData map(Map<String, dynamic> data, {String tablePrefix}) {
|
||||
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
|
||||
return PersistentPlayerState.fromData(data, _db, prefix: effectivePrefix);
|
||||
return PersistentLoopModeData.fromData(data, _db, prefix: effectivePrefix);
|
||||
}
|
||||
|
||||
@override
|
||||
$PlayerStateTable createAlias(String alias) {
|
||||
return $PlayerStateTable(_db, alias);
|
||||
$PersistentLoopModeTable createAlias(String alias) {
|
||||
return $PersistentLoopModeTable(_db, alias);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1760,14 +1991,28 @@ abstract class _$MoorMusicDataSource extends GeneratedDatabase {
|
|||
$QueueEntriesTable _queueEntries;
|
||||
$QueueEntriesTable get queueEntries =>
|
||||
_queueEntries ??= $QueueEntriesTable(this);
|
||||
$PlayerStateTable _playerState;
|
||||
$PlayerStateTable get playerState => _playerState ??= $PlayerStateTable(this);
|
||||
$PersistentIndexTable _persistentIndex;
|
||||
$PersistentIndexTable get persistentIndex =>
|
||||
_persistentIndex ??= $PersistentIndexTable(this);
|
||||
$PersistentShuffleModeTable _persistentShuffleMode;
|
||||
$PersistentShuffleModeTable get persistentShuffleMode =>
|
||||
_persistentShuffleMode ??= $PersistentShuffleModeTable(this);
|
||||
$PersistentLoopModeTable _persistentLoopMode;
|
||||
$PersistentLoopModeTable get persistentLoopMode =>
|
||||
_persistentLoopMode ??= $PersistentLoopModeTable(this);
|
||||
PlayerStateDao _playerStateDao;
|
||||
PlayerStateDao get playerStateDao =>
|
||||
_playerStateDao ??= PlayerStateDao(this as MoorMusicDataSource);
|
||||
@override
|
||||
Iterable<TableInfo> get allTables => allSchemaEntities.whereType<TableInfo>();
|
||||
@override
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities =>
|
||||
[artists, albums, songs, queueEntries, playerState];
|
||||
List<DatabaseSchemaEntity> get allSchemaEntities => [
|
||||
artists,
|
||||
albums,
|
||||
songs,
|
||||
queueEntries,
|
||||
persistentIndex,
|
||||
persistentShuffleMode,
|
||||
persistentLoopMode
|
||||
];
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ class MusicDataRepositoryImpl implements MusicDataRepository {
|
|||
Future<void> updateDatabase() async {
|
||||
_log.info('updateDatabase called');
|
||||
|
||||
updateArtists();
|
||||
await updateArtists();
|
||||
final albumIdMap = await updateAlbums();
|
||||
await updateSongs(albumIdMap);
|
||||
|
||||
|
|
13
pubspec.lock
13
pubspec.lock
|
@ -41,7 +41,7 @@ packages:
|
|||
description:
|
||||
path: "."
|
||||
ref: one-isolate
|
||||
resolved-ref: d647578d5264ff465fd7bd686b7caa2b9e7373df
|
||||
resolved-ref: "58fb50a383c2f86a5491c5c8f3dc833e65d9c915"
|
||||
url: "https://github.com/ryanheise/audio_service.git"
|
||||
source: git
|
||||
version: "0.15.3"
|
||||
|
@ -51,7 +51,7 @@ packages:
|
|||
name: audio_session
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.9"
|
||||
version: "0.0.10"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -234,6 +234,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.2.1"
|
||||
file_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_picker
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -360,7 +367,7 @@ packages:
|
|||
name: just_audio
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.2"
|
||||
version: "0.6.3"
|
||||
just_audio_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -16,6 +16,7 @@ dependencies:
|
|||
dartz: ^0.9.1
|
||||
device_info: ^1.0.0
|
||||
equatable: ^1.1.0
|
||||
file_picker: ^2.1.4
|
||||
flutter:
|
||||
sdk: flutter
|
||||
flutter_audio_query: ^0.3.5
|
||||
|
@ -28,7 +29,6 @@ dependencies:
|
|||
logging: ^0.11.4
|
||||
mobx: ^1.1.1
|
||||
moor: ^3.0.2
|
||||
# moor_ffi: ^0.5.0
|
||||
path:
|
||||
path_provider: ^1.6.18
|
||||
provider: ^4.0.4
|
||||
|
|
Loading…
Add table
Reference in a new issue