file picker, permissions and app metadata

This commit is contained in:
Moritz Weber 2020-12-24 14:16:31 +01:00
parent 53112c2c1b
commit b1ecb3dc9a
19 changed files with 446 additions and 191 deletions

View file

@ -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"

View file

@ -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.
-->

View file

@ -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"/>

View file

@ -1,4 +1,4 @@
package com.example.mucke
package rocks.mucke
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity

View file

@ -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.
-->

View file

@ -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"
}
}

View file

@ -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

View file

@ -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;

View file

@ -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);
}
}
}

View file

@ -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 '''

View file

@ -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;

View file

@ -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

View file

@ -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());
}
}
}

View file

@ -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;
}

View file

@ -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());

View file

@ -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
];
}

View file

@ -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);

View file

@ -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:

View file

@ -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