Skip to content

Commit f1e7d41

Browse files
committed
added padding on the bottom of song list
1 parent c309096 commit f1e7d41

File tree

13 files changed

+166
-62
lines changed

13 files changed

+166
-62
lines changed

android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ android {
3333
minSdkVersion 16
3434
targetSdkVersion 30
3535
versionCode flutterVersionCode.toInteger()
36-
versionName flutterVersionName
36+
versionName "0.0.1"
3737
}
3838

3939
buildTypes {

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="bytes7bytes7.codeine">
3+
<uses-permission android:name="android.permission.INTERNET" />
34
<application
45
android:label="CODEINE"
56
android:icon="@mipmap/ic_launcher">

lib/global/global_parameters.dart

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,36 +50,104 @@ abstract class GlobalParameters {
5050
imageUrl:
5151
'https://sun2-3.userapi.com/impf/c857632/v857632634/42976/g6UFFRU2X4s.jpg?size=592x592&quality=96&sign=50f681a1964bb7cc8049dd7db53578e8&type=audio',
5252
),
53+
Song(
54+
id: 3,
55+
title: 'Dragonborn',
56+
artists: ['Big Baby Tape'],
57+
feat: [],
58+
duration: '3:09',
59+
imageUrl:
60+
'https://sun2-10.userapi.com/impf/c849228/v849228340/c2dd5/0KZPjgB-zt0.jpg?size=592x592&quality=96&sign=ce2dc2db9e841a07b403f0d691772eb0&type=audio',
61+
),
62+
Song(
63+
id: 4,
64+
title: 'Привычка',
65+
artists: ['Скриптонит'],
66+
feat: ['Andy Panda', '104'],
67+
duration: '3:16',
68+
imageUrl:
69+
'https://sun2-9.userapi.com/impf/NS7bO5bXFp3l1B1HdI_tQSyFKr4YLPen4rnU5Q/2kYTNB5ljmg.jpg?size=592x592&quality=96&sign=40e1fa138ed05380cb6fed3d2a0c1749&type=audio',
70+
),
71+
Song(
72+
id: 5,
73+
title: 'Rain (from Suicide Squad)',
74+
artists: ['grandson', 'Jessie Reyez'],
75+
feat: [],
76+
duration: '3:56',
77+
imageUrl:
78+
'https://sun2-12.userapi.com/impf/uTcGjQn135E_3iRwF2yiL7S5YmqJp9hzGz5O_A/zbQVtydXD3Q.jpg?size=592x592&quality=96&sign=312b342b4f52c5badbb61edbfe1ec119&type=audio',
79+
),
80+
Song(
81+
id: 6,
82+
title: 'Batman',
83+
artists: ['LPB Poody'],
84+
feat: [],
85+
duration: '2:36',
86+
imageUrl:
87+
'https://sun2-4.userapi.com/impf/c857332/v857332204/188aa2/6FfPjj7ZGjY.jpg?size=592x592&quality=96&sign=c82ecefc9400c91941b97b8ef8835e8f&type=audio',
88+
),
89+
Song(
90+
id: 7,
91+
title: 'Drip or Drown',
92+
artists: ['Gunna'],
93+
feat: [],
94+
duration: '2:06',
95+
imageUrl:
96+
'https://sun2-11.userapi.com/impf/c858032/v858032821/4a222/sxDplVHIfl8.jpg?size=592x592&quality=96&sign=978c7a7e88cbe024ac524599d3c10b52&type=audio',
97+
),
5398
];
5499

55100
static final SnappingSheetController snappingSheetController =
56101
SnappingSheetController();
102+
static AnimationController playAnimationController;
103+
static AnimationController waveController;
57104
static final ValueNotifier<bool> playNotifier = ValueNotifier(false);
58105
static final ValueNotifier<Song> currentSong = ValueNotifier(songs[0]);
59106
static int songId = songs[0].id;
60107
static final ValueNotifier<double> songSeconds = ValueNotifier(0.0);
61108
static final ValueNotifier<bool> shuffleMode = ValueNotifier(false);
62109
static final ValueNotifier<bool> repeatOneMode = ValueNotifier(false);
63110

64-
static void previousSong() {
111+
static void playPauseSong() {
112+
if (playNotifier.value) {
113+
playNotifier.value = false;
114+
playAnimationController.reverse();
115+
waveController.reverse();
116+
} else {
117+
playNotifier.value = true;
118+
playAnimationController.forward();
119+
waveController.forward();
120+
}
121+
}
122+
123+
static void playSongByID(int id) async {
124+
songId = id;
125+
await songs[songId].generateColors();
126+
currentSong.value = songs[songId];
127+
songSeconds.value = 0;
128+
}
129+
130+
static void previousSong() async {
65131
if (songs.length > 0) {
66132
if (songId != 0) {
67133
songId--;
68134
} else {
69135
songId = songs.length - 1;
70136
}
137+
await songs[songId].generateColors();
71138
currentSong.value = songs[songId];
72139
songSeconds.value = 0;
73140
}
74141
}
75142

76-
static void nextSong() {
143+
static void nextSong() async {
77144
if (songs.length > 0) {
78145
if (songId != songs.length - 1) {
79146
songId++;
80147
} else {
81148
songId = 0;
82149
}
150+
await songs[songId].generateColors();
83151
currentSong.value = songs[songId];
84152
songSeconds.value = 0;
85153
}

lib/models/song.dart

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,21 @@ class Song {
2323
Color secondColor;
2424

2525
Future<void> generateColors() async {
26-
PaletteGenerator pg = await _getPrimaryColor();
27-
primaryColor = pg.paletteColors.first.color;
28-
firstColor = Color.fromARGB(
29-
255,
30-
(primaryColor.red + primaryColor.green + primaryColor.blue).abs() % 256,
31-
(primaryColor.green - primaryColor.blue + primaryColor.red) % 256,
32-
(primaryColor.blue - primaryColor.red + primaryColor.green) % 256);
33-
secondColor = Color.fromARGB(
34-
255,
35-
(primaryColor.red - primaryColor.green + primaryColor.blue) % 256,
36-
(primaryColor.green - primaryColor.blue + primaryColor.red) % 256,
37-
(primaryColor.blue - primaryColor.red + primaryColor.green) % 256);
26+
if(firstColor == null || secondColor == null) {
27+
PaletteGenerator pg = await _getPrimaryColor();
28+
primaryColor = pg.paletteColors.first.color;
29+
firstColor = Color.fromARGB(
30+
255,
31+
(primaryColor.red + primaryColor.green + primaryColor.blue).abs() %
32+
256,
33+
(primaryColor.green - primaryColor.blue + primaryColor.red) % 256,
34+
(primaryColor.blue - primaryColor.red + primaryColor.green) % 256);
35+
secondColor = Color.fromARGB(
36+
255,
37+
(primaryColor.red - primaryColor.green + primaryColor.blue) % 256,
38+
(primaryColor.green - primaryColor.blue + primaryColor.red) % 256,
39+
(primaryColor.blue - primaryColor.red + primaryColor.green) % 256);
40+
}
3841
}
3942

4043
Future<PaletteGenerator> _getPrimaryColor() async {

lib/screens/home_screen.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import 'package:codeine/global/global_parameters.dart';
2-
import 'package:codeine/models/playlist.dart';
3-
import 'package:codeine/models/song.dart';
42
import 'package:codeine/models/user.dart';
53
import 'package:codeine/widgets/music_player.dart';
64
import 'package:codeine/widgets/music_sliver.dart';
75
import 'package:codeine/widgets/search_bar.dart';
86
import 'package:flutter/material.dart';
97

10-
class HomeScreen extends StatelessWidget{
8+
class HomeScreen extends StatelessWidget {
9+
final TextEditingController textEditingController = TextEditingController();
10+
1111
@override
1212
Widget build(BuildContext context) {
1313
return Container(
@@ -34,7 +34,9 @@ class HomeScreen extends StatelessWidget{
3434
physics: BouncingScrollPhysics(),
3535
slivers: [
3636
_Header(),
37-
SearchBar(),
37+
SearchBar(
38+
controller: textEditingController,
39+
),
3840
MusicSliver(
3941
trackTitle: 'Мои треки',
4042
playlists: GlobalParameters.playlists,

lib/screens/login_screen.dart

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,28 @@ class _LoginScreenState extends State<LoginScreen> {
174174
obscureText: true,
175175
errorNotifier: passwordNotifier,
176176
),
177-
IconButton(
178-
icon: Icon(
179-
Icons.delete,
180-
color: Theme.of(context).focusColor,
181-
),
182-
onPressed: () async {
183-
AuthService.logOut();
184-
},
177+
Row(
178+
mainAxisAlignment: MainAxisAlignment.center,
179+
children: [
180+
IconButton(
181+
icon: Icon(
182+
Icons.delete,
183+
color: Theme.of(context).focusColor,
184+
),
185+
onPressed: () async {
186+
AuthService.logOut();
187+
},
188+
),
189+
IconButton(
190+
icon: Icon(
191+
Icons.home_filled,
192+
color: Theme.of(context).focusColor,
193+
),
194+
onPressed: () async {
195+
GlobalParameters.currentPage.value='HomeScreen';
196+
},
197+
),
198+
],
185199
),
186200
Spacer(flex: 1),
187201
TextButton(

lib/widgets/bottom_music_player.dart

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,20 @@ class BottomMusicPlayer extends StatefulWidget {
1414

1515
class _BottomMusicPlayerState extends State<BottomMusicPlayer>
1616
with TickerProviderStateMixin {
17-
AnimationController _playAnimationController;
1817
int _waveDuration;
19-
AnimationController waveController;
2018
CurvedAnimation _waveCurve;
2119
Animation<double> _waveHeightPercentage;
2220

2321
@override
2422
void initState() {
2523
super.initState();
2624
_waveDuration = 3000;
27-
waveController = AnimationController(
25+
GlobalParameters.waveController = GlobalParameters.waveController ?? AnimationController(
2826
vsync: this,
2927
duration: Duration(milliseconds: _waveDuration),
3028
);
3129
_waveCurve = CurvedAnimation(
32-
parent: waveController,
30+
parent: GlobalParameters.waveController,
3331
curve: Curves.easeInOut,
3432
);
3533
_waveHeightPercentage = Tween(
@@ -39,22 +37,12 @@ class _BottomMusicPlayerState extends State<BottomMusicPlayer>
3937
_waveCurve,
4038
);
4139

42-
_playAnimationController = AnimationController(
40+
GlobalParameters.playAnimationController = GlobalParameters.playAnimationController ?? AnimationController(
4341
vsync: this,
4442
duration: Duration(milliseconds: 500),
4543
);
4644
}
4745

48-
@override
49-
void dispose() {
50-
// TODO: solve problem (when animation is not completed & dispose() is called
51-
if (!_playAnimationController.isCompleted){
52-
_playAnimationController.stop();
53-
}
54-
_playAnimationController.dispose();
55-
super.dispose();
56-
}
57-
5846
@override
5947
Widget build(BuildContext context) {
6048
return ValueListenableBuilder(
@@ -140,20 +128,13 @@ class _BottomMusicPlayerState extends State<BottomMusicPlayer>
140128
return AnimatedIcon(
141129
icon: AnimatedIcons.play_pause,
142130
size: 30,
143-
progress: _playAnimationController,
131+
progress: GlobalParameters.playAnimationController,
144132
color: Theme.of(context).focusColor,
145133
);
146134
},
147135
),
148136
onPressed: () {
149-
GlobalParameters.playNotifier.value = !GlobalParameters.playNotifier.value;
150-
if (GlobalParameters.playNotifier.value) {
151-
waveController.forward();
152-
_playAnimationController.forward();
153-
} else {
154-
waveController.reverse();
155-
_playAnimationController.reverse();
156-
}
137+
GlobalParameters.playPauseSong();
157138
},
158139
),
159140
],

lib/widgets/music_player.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,12 @@ class _MusicPlayerState extends State<MusicPlayer> {
111111
ValueListenableBuilder(
112112
valueListenable: topPlayerOpacity,
113113
builder: (context, percent, child) {
114-
return Opacity(
115-
opacity: percent,
116-
child: TopMusicPlayer(),
114+
return Visibility(
115+
visible: (percent == 0) ? false : true,
116+
child: Opacity(
117+
opacity: percent,
118+
child: TopMusicPlayer(),
119+
),
117120
);
118121
},
119122
),

lib/widgets/music_sliver.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:codeine/constants.dart';
12
import 'package:codeine/models/playlist.dart';
23
import 'package:codeine/models/song.dart';
34
import 'package:flutter/material.dart';
@@ -42,13 +43,17 @@ class MusicSliver extends StatelessWidget {
4243
],
4344
),
4445
);
46+
}else if(index == songs.length + 2){
47+
return Container(
48+
height: ConstantData.bottomPlayerHeight,
49+
);
4550
} else {
4651
return SongCard(
4752
song: songs[index - 2],
4853
);
4954
}
5055
},
51-
childCount: songs.length + 2,
56+
childCount: songs.length + 3,
5257
),
5358
);
5459
}

lib/widgets/player_controls.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ class PlayerControls extends StatelessWidget {
2828
color: Theme.of(context).focusColor,
2929
iconSize: 60,
3030
onPressed: () {
31-
GlobalParameters.playNotifier.value =
32-
!GlobalParameters.playNotifier.value;
31+
GlobalParameters.playPauseSong();
3332
},
3433
);
3534
},

0 commit comments

Comments
 (0)