Skip to content

Commit

Permalink
improved loading times and fixed networking issues
Browse files Browse the repository at this point in the history
  • Loading branch information
tooxo committed Jul 5, 2020
1 parent 2fa42b6 commit 0a3a158
Show file tree
Hide file tree
Showing 11 changed files with 130 additions and 107 deletions.
4 changes: 1 addition & 3 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ android {
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.SaufApp"
applicationId "com.tooxo.SaufApp"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
Expand All @@ -47,7 +46,6 @@ android {

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.SaufApp">
package="com.tooxo.SaufApp">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.SaufApp">
package="com.tooxo.SaufApp">
<!-- 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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.SaufApp
package com.tooxo.SaufApp

import io.flutter.embedding.android.FlutterActivity

Expand Down
2 changes: 1 addition & 1 deletion android/app/src/profile/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.SaufApp">
package="com.tooxo.SaufApp">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
Expand Down
19 changes: 11 additions & 8 deletions lib/games/game.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,19 +158,22 @@ class BasicGameState extends State<BasicGame>
},
icon: Icon(Icons.clear),
),
title: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
title: /*Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Text(
widget.title.tr(),
//widget.title,
"this is the title",
style: GoogleFonts.caveatBrush(
color: Colors.black, fontSize: 40, fontWeight: FontWeight.w600),
),
]),
/*Text(
widget.title.tr(),
).tr(),
]),*/
Text(
// widget.title.tr(),
widget.title,
style: GoogleFonts.caveatBrush(
fontSize: 40, color: Colors.black, fontWeight: FontWeight.w600),
),
centerTitle: true,*/
textAlign: TextAlign.center,
).tr(),
centerTitle: true,
backgroundColor: widget.primaryColor,
);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/games/guess_the_song.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert';

import 'package:SaufApp/games/game.dart';
import 'package:SaufApp/utils/networking.dart';
import 'package:SaufApp/utils/types.dart';
import 'package:audioplayers/audioplayers.dart';
import 'package:connectivity/connectivity.dart';
Expand Down Expand Up @@ -73,8 +74,7 @@ class GuessTheSongState extends BasicGameState with WidgetsBindingObserver {

void buttonClick() async {
if (state == 0 || state == 1) {
ConnectivityResult result = await Connectivity().checkConnectivity();
if (result != ConnectivityResult.none) {
if (!(await checkConnection())) {
audioPlayer.play(widget.mainTitle);
} else {
Fluttertoast.showToast(
Expand Down
29 changes: 21 additions & 8 deletions lib/menus/difficulty.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import 'package:SaufApp/utils/ad.dart';
import 'package:SaufApp/games/challenges.dart';
import 'package:SaufApp/games/guess_the_song.dart';
import 'package:SaufApp/games/never_have_i_ever.dart';
import 'package:SaufApp/utils/networking.dart';
import 'package:SaufApp/utils/player.dart';
import 'package:SaufApp/games/quiz.dart';
import 'package:SaufApp/menus/setting.dart';
import 'package:SaufApp/utils/shapes.dart';
import 'package:SaufApp/utils/spotify_api.dart';
import 'package:SaufApp/games/truth_or_dare.dart';
import 'package:SaufApp/utils/sqlite.dart';
import 'package:SaufApp/utils/types.dart';
import 'package:SaufApp/games/who_would_rather.dart';
import 'package:assorted_layout_widgets/assorted_layout_widgets.dart';
Expand Down Expand Up @@ -220,9 +222,7 @@ class DifficultyState extends State<Difficulty> {
for (List game in availableGames) {
GameType gameType = game[1];
if (gameType == GameType.GUESS_THE_SONG) {
ConnectivityResult connectivityResult =
await Connectivity().checkConnectivity();
if (connectivityResult != ConnectivityResult.none) {
if (await checkConnection()) {
List<String> urls = [];
if (selectedModes == SettingsState.ONLY_INCLUDED ||
selectedModes == SettingsState.BOTH) {
Expand All @@ -237,6 +237,14 @@ class DifficultyState extends State<Difficulty> {
});

texts[gameType] = await buildSpotify(urls);
SqLite database = await SqLite().open();
Spotify spotify = Spotify();
dynamic missingSongs =
texts[GameType.GUESS_THE_SONG].where((e) => e.contains(null));
texts[GameType.GUESS_THE_SONG]
.removeWhere((element) => element.contains(null));
missingSongs.map((e) async => texts[GameType.GUESS_THE_SONG]
.add(await spotify.fillMissingPreviewUrls(e, database)));
} else {
Fluttertoast.showToast(
msg: "Rate den Song wurde deaktiviert, da du über keine "
Expand Down Expand Up @@ -359,9 +367,13 @@ class DifficultyState extends State<Difficulty> {
randomlyChosenText =
json.encode({"truth": randomTextTruth, "dare": randomTextDare});
} else {
randomlyChosenText = texts[game.type]
[Random.secure().nextInt(texts[game.type].length)];
texts[game.type].remove(randomlyChosenText);
try {
randomlyChosenText = texts[game.type]
[Random.secure().nextInt(texts[game.type].length)];
texts[game.type].remove(randomlyChosenText);
} on IndexError {
continue;
}
}

/*
Expand Down Expand Up @@ -773,12 +785,13 @@ class DifficultyState extends State<Difficulty> {
Column(
children: [
Expanded(
flex: 3,
flex: 4,
child: Container(),
),
Expanded(
flex: 1,
child: Center(
child: Align(
alignment: Alignment.bottomCenter,
child: Material(
color: Colors.transparent,
child: Text(
Expand Down
3 changes: 2 additions & 1 deletion lib/menus/word_customization.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:math';

import 'package:SaufApp/utils/networking.dart';
import 'package:SaufApp/utils/shapes.dart';
import 'package:SaufApp/utils/spotify_api.dart';
import 'package:SaufApp/utils/types.dart';
Expand Down Expand Up @@ -104,7 +105,7 @@ class WordCustomizationState extends State<WordCustomization> {
Future<bool> spotifyCheckerWrapper() async {
if (getSelectedType() == GameType.GUESS_THE_SONG) {
Connectivity c = new Connectivity();
if ((await c.checkConnectivity()) == ConnectivityResult.none) {
if (!(await checkConnection())) {
return true;
}
if (await Spotify.playlistExists(tf1Value)) {
Expand Down
18 changes: 18 additions & 0 deletions lib/utils/networking.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'dart:io';

import 'package:connectivity/connectivity.dart';

Future<bool> checkConnection() async {
return [ConnectivityResult.mobile, ConnectivityResult.wifi]
.contains(await Connectivity().checkConnectivity()) &&
await _checkLookup();
}

Future<bool> _checkLookup() async {
try {
final result = await InternetAddress.lookup('example.com');
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
} on SocketException catch (_) {
return false;
}
}
152 changes: 71 additions & 81 deletions lib/utils/spotify_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class Spotify {

/// Start with pulling the embed web page, because spotify is shit.
// Disabled for now, because it creates a way too great delay
/*
http.Response embedPlaylistResponse =
await http.get("https://open.spotify.com/embed/playlist/$playlistId");
Expand All @@ -65,7 +67,8 @@ class Spotify {
dynamic decodedEmbedPage = jsonDecode(rawJson);
for (Map<dynamic, dynamic> track in decodedEmbedPage["tracks"]["items"]) {
if (track["track"]["preview_url"] != null) {
track["track"]["preview_url"].replaceAll("\\/", "/");
track["track"]["preview_url"] =
track["track"]["preview_url"].replaceAll("\\/", "/");
}
List<String> song = [
track["track"]["artists"][0]["name"] + " - " + track["track"]["name"],
Expand All @@ -76,89 +79,76 @@ class Spotify {
trackList.add(song);
}
}

if (decodedEmbedPage["tracks"]["total"] > 100) {
String token = await generateAuthKey();
String url =
"https://api.spotify.com/v1/playlists/$playlistId/tracks?limit=100&offset=100";

Map<dynamic, dynamic> jsonResponse;
do {
http.Response response =
await http.get(url, headers: {"Authorization": "Bearer $token"});
if (response.statusCode != 200) {
return trackList;
*/

// if (decodedEmbedPage["tracks"]["total"] > 100) {
String token = await generateAuthKey();
String url =
"https://api.spotify.com/v1/playlists/$playlistId/tracks?limit=100&offset=100";

Map<dynamic, dynamic> jsonResponse;
do {
http.Response response =
await http.get(url, headers: {"Authorization": "Bearer $token"});
if (response.statusCode != 200) {
return trackList;
}
jsonResponse = jsonDecode(response.body);
for (Map<dynamic, dynamic> track in jsonResponse["items"]) {
if (track["is_local"]) {
continue;
}
jsonResponse = jsonDecode(response.body);
for (Map<dynamic, dynamic> track in jsonResponse["items"]) {
if (track["is_local"]) {
continue;
}
if (track["track"] == null) {
continue;
}

List<String> song = [
track["track"]["artists"][0]["name"] +
" - " +
track["track"]["name"],
track["track"]["preview_url"],
track["track"]["id"]
];

/// this fixes a weird error with spotify returning null as
/// the preview url, although they have a preview available
/// this also multiplies the time a playlist gets extracted by factor 50
/// spotify big suck
/// Documented here: https://github.com/spotify/web-api/issues/148
if (track["track"]["preview_url"] == null) {
String previewFromDatabase = useCache
? await database.getFromSpotifyCache(track["track"]["id"])
: null;

if (previewFromDatabase != null) {
song = [
track["track"]["artists"][0]["name"] +
" - " +
track["track"]["name"],
previewFromDatabase,
track["track"]["id"]
];
} else {
try {
String trackId = track["track"]["id"];
http.Response embedResponse = await http.get(
"https://open.spotify.com/embed/track/$trackId",
);
String previewUrl =
RegExp(REGEX_EMBED).firstMatch(embedResponse.body).group(1);
if (previewUrl != null) {
previewUrl.replaceAll("\\/", "/");
}
song = [
track["track"]["artists"][0]["name"] +
" - " +
track["track"]["name"],
previewUrl,
track["track"]["id"]
];
} catch (ignored) {
song = [null, null];
}
}
}
if (!song.contains(null)) {
trackList.add(song);
}
if (track["track"] == null) {
continue;
}
url = jsonResponse["next"];
} while (jsonResponse.containsKey("more"));
}

List<String> song = [
track["track"]["artists"][0]["name"] + " - " + track["track"]["name"],
track["track"]["preview_url"],
track["track"]["id"]
];

// if (!song.contains(null)) {
trackList.add(song);
// }
}
url = jsonResponse["next"];
} while (jsonResponse.containsKey("more"));
//}
if (useCache) database.putBulkInSpotifyCache(trackList);
/*database
.putBulkInSpotifyCache(trackList)
.then((value) async => await database.close());*/
return trackList;
}

Future<List<String>> fillMissingPreviewUrls(
List<String> track, SqLite database,
{useCache: true}) async {
/// this fixes a weird error with spotify returning null as
/// the preview url, although they have a preview available
/// this also multiplies the time a playlist gets extracted by factor 50
/// spotify big suck
/// Documented here: https://github.com/spotify/web-api/issues/148
String previewFromDatabase =
useCache ? await database.getFromSpotifyCache(track[2]) : null;

if (previewFromDatabase != null) {
track[1] = previewFromDatabase;
} else {
try {
String trackId = track[2];
http.Response embedResponse = await http.get(
"https://open.spotify.com/embed/track/$trackId",
);
String previewUrl =
RegExp(REGEX_EMBED).firstMatch(embedResponse.body).group(1);
if (previewUrl != null) {
previewUrl = previewUrl.replaceAll("\\/", "/");
}
track[1] = previewUrl;
} catch (ignored) {
return [null, null, null];
}
}
return track;
}
}

0 comments on commit 0a3a158

Please sign in to comment.